pax_global_header00006660000000000000000000000064146706433170014525gustar00rootroot0000000000000052 comment=04956f0102e51ca3cbcd35ec2525066f0c5d2322 thinc-release-v9.1.1/000077500000000000000000000000001467064331700144465ustar00rootroot00000000000000thinc-release-v9.1.1/.github/000077500000000000000000000000001467064331700160065ustar00rootroot00000000000000thinc-release-v9.1.1/.github/ISSUE_TEMPLATE/000077500000000000000000000000001467064331700201715ustar00rootroot00000000000000thinc-release-v9.1.1/.github/ISSUE_TEMPLATE/01_bugs.md000066400000000000000000000007301467064331700217530ustar00rootroot00000000000000--- name: "\U0001F6A8 Submit a Bug Report" about: Use this template if you came across a bug or unexpected behaviour differing from the docs. --- ## How to reproduce the behaviour ## Your Environment - Operating System: - Python Version Used: - Thinc Version Used: - Environment Information: thinc-release-v9.1.1/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000017371467064331700216170ustar00rootroot00000000000000 ## Description ### Types of change ## Checklist - [ ] I confirm that I have the right to submit this contribution under the project's MIT license. - [ ] I ran the tests, and all new and existing tests passed. - [ ] My changes don't require a change to the documentation, or if they do, I've added all required information. thinc-release-v9.1.1/.github/workflows/000077500000000000000000000000001467064331700200435ustar00rootroot00000000000000thinc-release-v9.1.1/.github/workflows/cibuildwheel.yml000066400000000000000000000056501467064331700232340ustar00rootroot00000000000000name: Build on: push: tags: # ytf did they invent their own syntax that's almost regex? # ** matches 'zero or more of any character' - 'release-v[0-9]+.[0-9]+.[0-9]+**' - 'prerelease-v[0-9]+.[0-9]+.[0-9]+**' jobs: build_wheels: name: Build wheels on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: matrix: # macos-13 is an intel runner, macos-14 is apple silicon os: [ubuntu-latest, windows-latest, macos-13, macos-14] steps: - uses: actions/checkout@v4 # This is way too slow # aarch64 (arm) is built via qemu emulation on Linux #- name: Set up QEMU # if: runner.os == 'Linux' # uses: docker/setup-qemu-action@v3 # with: # platforms: all - name: Build wheels uses: pypa/cibuildwheel@v2.19.1 env: CIBW_ARCHS_LINUX: auto with: package-dir: . output-dir: wheelhouse config-file: "{package}/pyproject.toml" - uses: actions/upload-artifact@v4 with: name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }} path: ./wheelhouse/*.whl build_sdist: name: Build source distribution runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build sdist run: pipx run build --sdist - uses: actions/upload-artifact@v4 with: name: cibw-sdist path: dist/*.tar.gz create_release: needs: [build_wheels, build_sdist] runs-on: ubuntu-latest permissions: contents: write checks: write actions: read issues: read packages: write pull-requests: read repository-projects: read statuses: read steps: - name: Get the tag name and determine if it's a prerelease id: get_tag_info run: | FULL_TAG=${GITHUB_REF#refs/tags/} if [[ $FULL_TAG == release-* ]]; then TAG_NAME=${FULL_TAG#release-} IS_PRERELEASE=false elif [[ $FULL_TAG == prerelease-* ]]; then TAG_NAME=${FULL_TAG#prerelease-} IS_PRERELEASE=true else echo "Tag does not match expected patterns" >&2 exit 1 fi echo "FULL_TAG=$TAG_NAME" >> $GITHUB_ENV echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV echo "IS_PRERELEASE=$IS_PRERELEASE" >> $GITHUB_ENV - uses: actions/download-artifact@v4 with: # unpacks all CIBW artifacts into dist/ pattern: cibw-* path: dist merge-multiple: true - name: Create Draft Release id: create_release uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: name: ${{ env.TAG_NAME }} draft: true prerelease: ${{ env.IS_PRERELEASE }} files: "./dist/*" thinc-release-v9.1.1/.github/workflows/explosionbot.yml000066400000000000000000000014141467064331700233130ustar00rootroot00000000000000name: Explosion Bot on: issue_comment: types: - created - edited jobs: explosion-bot: runs-on: ubuntu-latest steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: actions/checkout@v4 - uses: actions/setup-python@v5 - name: Install and run explosion-bot run: | pip install git+https://${{ secrets.EXPLOSIONBOT_TOKEN }}@github.com/explosion/explosion-bot python -m explosionbot env: INPUT_TOKEN: ${{ secrets.EXPLOSIONBOT_TOKEN }} INPUT_BK_TOKEN: ${{ secrets.BUILDKITE_SECRET }} ENABLED_COMMANDS: "test_gpu,test_slow,test_slow_gpu" ALLOWED_TEAMS: "spacy-maintainers" thinc-release-v9.1.1/.github/workflows/issue-manager.yml000066400000000000000000000012421467064331700233250ustar00rootroot00000000000000name: Issue Manager on: schedule: - cron: "0 0 * * *" issue_comment: types: - created - edited issues: types: - labeled jobs: issue-manager: runs-on: ubuntu-latest steps: - uses: tiangolo/issue-manager@0.4.0 with: token: ${{ secrets.GITHUB_TOKEN }} config: > { "resolved": { "delay": "P7D", "message": "This issue has been automatically closed because it was answered and there was no follow-up discussion.", "remove_label_on_comment": true, "remove_label_on_close": true } } thinc-release-v9.1.1/.github/workflows/publish_pypi.yml000066400000000000000000000016601467064331700233000ustar00rootroot00000000000000# The cibuildwheel action triggers on creation of a release, this # triggers on publication. # The expected workflow is to create a draft release and let the wheels # upload, and then hit 'publish', which uploads to PyPi. on: release: types: - published jobs: upload_pypi: runs-on: ubuntu-latest environment: name: pypi url: https://pypi.org/p/thinc permissions: id-token: write contents: read if: github.event_name == 'release' && github.event.action == 'published' # or, alternatively, upload to PyPI on every tag starting with 'v' (remove on: release above to use this) # if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') steps: - uses: robinraju/release-downloader@v1 with: tag: ${{ github.event.release.tag_name }} fileName: '*' out-file-path: 'dist' - uses: pypa/gh-action-pypi-publish@release/v1 thinc-release-v9.1.1/.github/workflows/tests.yml000066400000000000000000000113631467064331700217340ustar00rootroot00000000000000name: tests on: push: paths-ignore: - "website/**" - "*.md" pull_request: types: [opened, synchronize, reopened, edited] paths-ignore: - "website/**" - "*.md" jobs: validate: name: Validate if: github.repository_owner == 'explosion' runs-on: ubuntu-latest steps: - name: Check out repo uses: actions/checkout@v4 - name: Configure Python version uses: actions/setup-python@v5 with: python-version: "3.9" - name: black run: | python -m pip install black -c requirements.txt python -m black thinc --check - name: isort run: | python -m pip install isort -c requirements.txt python -m isort thinc --check - name: flake8 run: | python -m pip install flake8==5.0.4 python -m flake8 thinc --count --select=E901,E999,F821,F822,F823,W605 --show-source --statistics tests: name: Test needs: Validate if: github.repository_owner == 'explosion' strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-13] python_version: ["3.12"] include: - os: windows-latest python_version: "3.9" - os: macos-13 python_version: "3.10" - os: ubuntu-latest python_version: "3.11" runs-on: ${{ matrix.os }} env: NOTEBOOK_KERNEL: "thinc-notebook-tests" steps: - name: Check out repo uses: actions/checkout@v4 - name: Configure Python version uses: actions/setup-python@v5 with: python-version: ${{ matrix.python_version }} - name: Install dependencies run: | python -m pip install --upgrade pip setuptools wheel pip install -r requirements.txt - name: Build sdist run: | python setup.py build_ext --inplace python setup.py sdist --formats=gztar - name: Run mypy run: python -m mypy thinc --no-implicit-reexport - name: Delete source directory run: rm -rf thinc shell: bash - name: Uninstall all packages run: | python -m pip freeze pip freeze --exclude pywin32 > installed.txt pip uninstall -y -r installed.txt - name: Install from sdist run: | SDIST=$(python -c "import os;print(os.listdir('./dist')[-1])" 2>&1) PIP_CONSTRAINT="build-constraints.txt" pip install dist/$SDIST shell: bash - name: Test import run: python -c "import thinc" - name: Install test requirements run: | pip install -r requirements.txt - name: Install notebook test requirements run: | pip install ipykernel pydot graphviz python -m ipykernel install --name thinc-notebook-tests --user if: matrix.python_version != '3.12' - name: Run tests without extras run: | python -m pytest --pyargs thinc -Werror --cov=thinc --cov-report=term # TODO: Update for numpy v2 # Notes on numpy requirements hacks: # 1. torch does not have a direct numpy requirement but is compiled # against a newer version than the oldest supported numpy for windows and # python 3.10; this version of numpy would not work with # tensorflow~=2.5.0 as specified above, but there is no release for # python 3.10 anyway # 2. restrict to numpy<1.24.0 due to mxnet incompatibility # 3. forbid torch!=1.13.0 due to segfaults with numpy<1.24.0 # Note: some of these pip install commands are known to fail for some platforms. # To continue despite errors as in azure pipelines, remove -e from the default # bash flags. #- name: Install extras for testing # run: | # #pip install "protobuf~=3.20.0" "tensorflow~=2.5.0" # #pip install "mxnet; sys_platform != 'win32' and python_version < '3.12'" # pip install "torch!=1.13.0; sys_platform!='darwin'" --extra-index-url https://download.pytorch.org/whl/cpu # # there is a bug related to MPS devices in github macos runners that # # will be fixed in torch v2.1.1 # # https://github.com/pytorch/pytorch/pull/111576 # pip install "torch>=2.1.1; sys_platform=='darwin'" --extra-index-url https://download.pytorch.org/whl/cpu # #pip install "numpy~=1.23.0; python_version=='3.10' and sys_platform=='win32'" # #pip install "numpy<1.24.0" # pip install -r requirements.txt # pip uninstall -y mypy # shell: bash --noprofile --norc -o pipefail {0} ##- name: Run tests with extras # run: python -m pytest --pyargs thinc --cov=thinc --cov-report=term -p thinc.tests.enable_tensorflow thinc-release-v9.1.1/.gitignore000066400000000000000000000024171467064331700164420ustar00rootroot00000000000000# File extensions *.pdf *.aux *.orig *.pyo *.pickle *.dvi *.o *.sqlite .*.s* *.dat # Varia _paths.py .mypy_cache .hypothesis/ version.cc version.pl # Tests tests/model/* tests/model/ # Website website/.cache/ website/public/ website/node_modules website/.npm website/logs *.log npm-debug.log* website/www/ website/_deploy.sh *.html # Cython / C extensions cythonize.json *.cpp *.so *.so.1 # Vim / VSCode / editors *.swp *.swo *.sw* Profile.prof .vscode .sass-cache # Python .Python .python-version __pycache__/ .pytest_cache *.py[cod] .env/ .env* .~env/ .venv env3.*/ venv/ .dev .denv .pypyenv .pytest_cache/ # Distribution / packaging env/ build/ develop-eggs/ dist/ eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ pip-wheel-metadata/ Pipfile.lock .installed.cfg *.egg .eggs MANIFEST # Temporary files *.~* tmp/ predict train # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .cache nosetests.xml coverage.xml # Translations *.mo # Mr Developer .mr.developer.cfg .project .pydevproject # Rope .ropeproject # Django stuff: *.log *.pot # Windows *.bat Thumbs.db Desktop.ini # Mac OS X *.DS_Store # Komodo project files *.komodoproject # Other *.tgz # Pycharm project files *.idea # IPython .ipynb_checkpoints/ thinc-release-v9.1.1/CITATION.cff000066400000000000000000000011271467064331700163410ustar00rootroot00000000000000cff-version: 1.2.0 message: If you use Thinc in research, please use this as a citation. title: Thinc abstract: "🔮 A refreshing functional take on deep learning, compatible with your favorite libraries" authors: - family-names: "Honnibal" given-names: "Matthew" - family-names: "Montani" given-names: "Ines" - family-names: "Van Landeghem" given-names: "Sofie" - family-names: "Boyd" given-names: "Adriane" - family-names: "DuJardin" given-names: "Justin" version: 8.0.0 date-released: "2021-01-21" license: MIT repository-code: "https://github.com/explosion/thinc" thinc-release-v9.1.1/LICENSE000066400000000000000000000021431467064331700154530ustar00rootroot00000000000000The MIT License (MIT) Copyright (C) 2016 ExplosionAI GmbH, 2016 spaCy GmbH, 2015 Matthew Honnibal Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. thinc-release-v9.1.1/MANIFEST.in000066400000000000000000000003361467064331700162060ustar00rootroot00000000000000recursive-include thinc *.cu *.pyx *.pxd *.hh include LICENSE include README.md prune tmp/ include thinc/tests/mypy/configs/*.ini include thinc/tests/mypy/outputs/*.txt include thinc/py.typed recursive-exclude thinc *.cpp thinc-release-v9.1.1/README.md000066400000000000000000000263521467064331700157350ustar00rootroot00000000000000 # Thinc: A refreshing functional take on deep learning, compatible with your favorite libraries ### From the makers of [spaCy](https://spacy.io) and [Prodigy](https://prodi.gy) [Thinc](https://thinc.ai) is a **lightweight deep learning library** that offers an elegant, type-checked, functional-programming API for **composing models**, with support for layers defined in other frameworks such as **PyTorch, TensorFlow and MXNet**. You can use Thinc as an interface layer, a standalone toolkit or a flexible way to develop new models. Previous versions of Thinc have been running quietly in production in thousands of companies, via both [spaCy](https://spacy.io) and [Prodigy](https://prodi.gy). We wrote the new version to let users **compose, configure and deploy custom models** built with their favorite framework. [![tests](https://github.com/explosion/thinc/actions/workflows/tests.yml/badge.svg)](https://github.com/explosion/thinc/actions/workflows/tests.yml) [![Current Release Version](https://img.shields.io/github/v/release/explosion/thinc.svg?include_prereleases&sort=semver&style=flat-square&logo=github)](https://github.com/explosion/thinc/releases) [![PyPi Version](https://img.shields.io/pypi/v/thinc.svg?include_prereleases&sort=semver&style=flat-square&logo=pypi&logoColor=white)](https://pypi.python.org/pypi/thinc) [![conda Version](https://img.shields.io/conda/vn/conda-forge/thinc.svg?style=flat-square&logo=conda-forge&logoColor=white)](https://anaconda.org/conda-forge/thinc) [![Python wheels](https://img.shields.io/badge/wheels-%E2%9C%93-4c1.svg?longCache=true&style=flat-square&logo=python&logoColor=white)](https://github.com/explosion/wheelwright/releases) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg?style=flat-square)](https://github.com/ambv/black) [![Open demo in Colab][colab]][intro_to_thinc_colab] ## 🔥 Features - **Type-check** your model definitions with custom types and [`mypy`](https://mypy.readthedocs.io/en/latest/) plugin. - Wrap **PyTorch**, **TensorFlow** and **MXNet** models for use in your network. - Concise **functional-programming** approach to model definition, using composition rather than inheritance. - Optional custom infix notation via **operator overloading**. - Integrated **config system** to describe trees of objects and hyperparameters. - Choice of **extensible backends**. - **[Read more →](https://thinc.ai/docs)** ## 🚀 Quickstart Thinc is compatible with **Python 3.6+** and runs on **Linux**, **macOS** and **Windows**. The latest releases with binary wheels are available from [pip](https://pypi.python.org/pypi/thinc). Before you install Thinc and its dependencies, make sure that your `pip`, `setuptools` and `wheel` are up to date. For the most recent releases, pip 19.3 or newer is recommended. ```bash pip install -U pip setuptools wheel pip install thinc ``` See the [extended installation docs](https://thinc.ai/docs/install#extended) for details on optional dependencies for different backends and GPU. You might also want to [set up static type checking](https://thinc.ai/docs/install#type-checking) to take advantage of Thinc's type system. > ⚠️ If you have installed PyTorch and you are using Python 3.7+, uninstall the > package `dataclasses` with `pip uninstall dataclasses`, since it may have been > installed by PyTorch and is incompatible with Python 3.7+. ### 📓 Selected examples and notebooks Also see the [`/examples`](examples) directory and [usage documentation](https://thinc.ai/docs) for more examples. Most examples are Jupyter notebooks – to launch them on [Google Colab](https://colab.research.google.com) (with GPU support!) click on the button next to the notebook name. | Notebook | Description | | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [`intro_to_thinc`][intro_to_thinc]
[![Open in Colab][colab]][intro_to_thinc_colab] | Everything you need to know to get started. Composing and training a model on the MNIST data, using config files, registering custom functions and wrapping PyTorch, TensorFlow and MXNet models. | | [`transformers_tagger_bert`][transformers_tagger_bert]
[![Open in Colab][colab]][transformers_tagger_bert_colab] | How to use Thinc, `transformers` and PyTorch to train a part-of-speech tagger. From model definition and config to the training loop. | | [`pos_tagger_basic_cnn`][pos_tagger_basic_cnn]
[![Open in Colab][colab]][pos_tagger_basic_cnn_colab] | Implementing and training a basic CNN for part-of-speech tagging model without external dependencies and using different levels of Thinc's config system. | | [`parallel_training_ray`][parallel_training_ray]
[![Open in Colab][colab]][parallel_training_ray_colab] | How to set up synchronous and asynchronous parameter server training with Thinc and [Ray](https://ray.readthedocs.io/en/latest/). | **[View more →](examples)** [colab]: https://gistcdn.githack.com/ines/dcf354aa71a7665ae19871d7fd14a4e0/raw/461fc1f61a7bc5860f943cd4b6bcfabb8c8906e7/colab-badge.svg [intro_to_thinc]: examples/00_intro_to_thinc.ipynb [intro_to_thinc_colab]: https://colab.research.google.com/github/explosion/thinc/blob/master/examples/00_intro_to_thinc.ipynb [transformers_tagger_bert]: examples/02_transformers_tagger_bert.ipynb [transformers_tagger_bert_colab]: https://colab.research.google.com/github/explosion/thinc/blob/master/examples/02_transformers_tagger_bert.ipynb [pos_tagger_basic_cnn]: examples/03_pos_tagger_basic_cnn.ipynb [pos_tagger_basic_cnn_colab]: https://colab.research.google.com/github/explosion/thinc/blob/master/examples/03_pos_tagger_basic_cnn.ipynb [parallel_training_ray]: examples/04_parallel_training_ray.ipynb [parallel_training_ray_colab]: https://colab.research.google.com/github/explosion/thinc/blob/master/examples/04_parallel_training_ray.ipynb ### 📖 Documentation & usage guides | Documentation | Description | | --------------------------------------------------------------------------------- | ----------------------------------------------------- | | [Introduction](https://thinc.ai/docs) | Everything you need to know. | | [Concept & Design](https://thinc.ai/docs/concept) | Thinc's conceptual model and how it works. | | [Defining and using models](https://thinc.ai/docs/usage-models) | How to compose models and update state. | | [Configuration system](https://thinc.ai/docs/usage-config) | Thinc's config system and function registry. | | [Integrating PyTorch, TensorFlow & MXNet](https://thinc.ai/docs/usage-frameworks) | Interoperability with machine learning frameworks | | [Layers API](https://thinc.ai/docs/api-layers) | Weights layers, transforms, combinators and wrappers. | | [Type Checking](https://thinc.ai/docs/usage-type-checking) | Type-check your model definitions and more. | ## 🗺 What's where | Module | Description | | ----------------------------------------- | --------------------------------------------------------------------------------- | | [`thinc.api`](thinc/api.py) | **User-facing API.** All classes and functions should be imported from here. | | [`thinc.types`](thinc/types.py) | Custom [types and dataclasses](https://thinc.ai/docs/api-types). | | [`thinc.model`](thinc/model.py) | The `Model` class. All Thinc models are an instance (not a subclass) of `Model`. | | [`thinc.layers`](thinc/layers) | The layers. Each layer is implemented in its own module. | | [`thinc.shims`](thinc/shims) | Interface for external models implemented in PyTorch, TensorFlow etc. | | [`thinc.loss`](thinc/loss.py) | Functions to calculate losses. | | [`thinc.optimizers`](thinc/optimizers.py) | Functions to create optimizers. Currently supports "vanilla" SGD, Adam and RAdam. | | [`thinc.schedules`](thinc/schedules.py) | Generators for different rates, schedules, decays or series. | | [`thinc.backends`](thinc/backends) | Backends for `numpy` and `cupy`. | | [`thinc.config`](thinc/config.py) | Config parsing and validation and function registry system. | | [`thinc.util`](thinc/util.py) | Utilities and helper functions. | ## 🐍 Development notes Thinc uses [`black`](https://github.com/psf/black) for auto-formatting, [`flake8`](http://flake8.pycqa.org/en/latest/) for linting and [`mypy`](https://mypy.readthedocs.io/en/latest/) for type checking. All code is written compatible with **Python 3.6+**, with type hints wherever possible. See the [type reference](https://thinc.ai/docs/api-types) for more details on Thinc's custom types. ### 👷‍♀️ Building Thinc from source Building Thinc from source requires the full dependencies listed in [`requirements.txt`](requirements.txt) to be installed. You'll also need a compiler to build the C extensions. ```bash git clone https://github.com/explosion/thinc cd thinc python -m venv .env source .env/bin/activate pip install -U pip setuptools wheel pip install -r requirements.txt pip install --no-build-isolation . ``` Alternatively, install in editable mode: ```bash pip install -r requirements.txt pip install --no-build-isolation --editable . ``` Or by setting `PYTHONPATH`: ```bash export PYTHONPATH=`pwd` pip install -r requirements.txt python setup.py build_ext --inplace ``` ### 🚦 Running tests Thinc comes with an [extensive test suite](thinc/tests). The following should all pass and not report any warnings or errors: ```bash python -m pytest thinc # test suite python -m mypy thinc # type checks python -m flake8 thinc # linting ``` To view test coverage, you can run `python -m pytest thinc --cov=thinc`. We aim for a 100% test coverage. This doesn't mean that we meticulously write tests for every single line – we ignore blocks that are not relevant or difficult to test and make sure that the tests execute all code paths. thinc-release-v9.1.1/bin/000077500000000000000000000000001467064331700152165ustar00rootroot00000000000000thinc-release-v9.1.1/bin/push-tag.sh000077500000000000000000000005541467064331700173110ustar00rootroot00000000000000#!/usr/bin/env bash set -e # Insist repository is clean git diff-index --quiet HEAD git checkout $1 git pull origin $1 git push origin $1 version=$(grep "__version__ = " thinc/about.py) version=${version/__version__ = } version=${version/\'/} version=${version/\'/} version=${version/\"/} version=${version/\"/} git tag "v$version" git push origin "v$version" thinc-release-v9.1.1/build-constraints.txt000066400000000000000000000001551467064331700206540ustar00rootroot00000000000000# build version constraints for use with wheelwright + multibuild numpy>=2.0.0,<3.0.0; python_version>='3.9' thinc-release-v9.1.1/examples/000077500000000000000000000000001467064331700162645ustar00rootroot00000000000000thinc-release-v9.1.1/examples/00_intro_to_thinc.ipynb000066400000000000000000014643621467064331700226700ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "4q-j8ckEGcit" }, "source": [ "# Intro to Thinc for beginners: defining a simple model and config & wrapping PyTorch, TensorFlow and MXNet\n", "\n", "This example shows how to get started with Thinc, using the \"hello world\" of neural network models: recognizing handwritten digits from the [MNIST dataset](http://yann.lecun.com/exdb/mnist/). For comparison, here's the same model implemented in other frameworks: [PyTorch version](https://github.com/pytorch/examples/blob/master/mnist/main.py), [TensorFlow version](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist.py). In this notebook, we'll walk through **creating and training the model**, using **config files**, registering **custom functions** and **wrapping models** defined in PyTorch, TensorFlow and MXNet. This tutorial is aimed at beginners, but it assumes basic knowledge of machine learning concepts and terminology." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "FVWFT2nnGci4", "outputId": "ee32dc55-5d02-473e-dc5b-2422dc1e34db" }, "outputs": [], "source": [ "!pip install \"thinc>=8.2.0\" \"ml_datasets>=0.2.0\" \"tqdm>=4.41\"" ] }, { "cell_type": "markdown", "metadata": { "id": "vUsjn12zberE" }, "source": [ "There are also some optional extras to install, depending on whether you want to run this on GPU, and depending on which of the integrations you want to test." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "l310yc2IawXM", "scrolled": false }, "outputs": [], "source": [ "import thinc.util\n", "# If you want to run this notebook on GPU, you'll need to install cupy.\n", "if not thinc.util.has_cupy:\n", " !pip install \"cupy-cuda101\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "a23GlJVJa0T-", "scrolled": true }, "outputs": [], "source": [ "import thinc.util\n", "# If you want to try out the tensorflow integration, you'll need to install that.\n", "# You'll either need to do tensorflow or tensorflow-gpu, depending on your\n", "# requirements.\n", "if not thinc.util.has_tensorflow:\n", " !pip install \"tensorflow-gpu>=2\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "PpL4s7hEbHhJ" }, "outputs": [], "source": [ "import thinc.util\n", "# If you want to try out the PyTorch integration, you'll need to install it.\n", "if not thinc.util.has_torch:\n", " !pip install \"torch\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "LTOk4rfwbOSS" }, "outputs": [], "source": [ "import thinc.util\n", "# If you want to try out the MxNet integration, you'll need to install it.\n", "if not thinc.util.has_mxnet:\n", " !pip install \"mxnet>=1.5.1,<1.6.0\"" ] }, { "cell_type": "markdown", "metadata": { "id": "GhyglLtPGci7" }, "source": [ "If you're running the notebook on GPU, the first thing to do is use Thinc's `prefer_gpu` helper to make sure we're performing operations **on GPU if available**. The function should be called right after importing Thinc, and it returns a boolean indicating whether the GPU has been activated. If you want to test out an integration with another library, you should check that it can access the GPU too." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "2xkReqDJGci8", "outputId": "9492ddc7-6c34-4f39-b781-e5df6ed06709" }, "outputs": [], "source": [ "from thinc.api import prefer_gpu\n", "import thinc.util\n", "print(\"Thinc GPU?\", prefer_gpu())\n", "\n", "if thinc.util.has_tensorflow:\n", " import tensorflow as tf\n", " print(\"Tensorflow GPU?\", bool(tf.config.experimental.list_physical_devices('GPU')))" ] }, { "cell_type": "markdown", "metadata": { "id": "BZVtDmLCGci8" }, "source": [ "We’ve prepared a separate package [`ml-datasets`](https://github.com/explosion/ml-datasets) with loaders for some common datasets, including MNIST. So we can set up the data as follows:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "qctw-vbZGci_", "outputId": "8f866627-0b2d-4392-eb61-7a7fc7c2e797" }, "outputs": [], "source": [ "import ml_datasets\n", "(train_X, train_Y), (dev_X, dev_Y) = ml_datasets.mnist()\n", "print(f\"Training size={len(train_X)}, dev size={len(dev_X)}\")" ] }, { "cell_type": "markdown", "metadata": { "id": "p8jv7snxGcjB" }, "source": [ "Now let’s define a model with two **Relu-activated hidden layers**, followed by a **softmax-activated output layer**. We’ll also add **dropout** after the two hidden layers, to help the model generalize better. The `chain` combinator is like `Sequential` in PyTorch or Keras: it combines a list of layers together with a feed-forward relationship." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "hrhydeJSGcjB" }, "outputs": [], "source": [ "from thinc.api import chain, Relu, Softmax\n", " \n", "n_hidden = 32\n", "dropout = 0.2\n", "\n", "model = chain(\n", " Relu(nO=n_hidden, dropout=dropout), \n", " Relu(nO=n_hidden, dropout=dropout), \n", " Softmax()\n", ")" ] }, { "cell_type": "markdown", "metadata": { "id": "gmIH7Xr5GcjD" }, "source": [ "After creating the model, we can call the `Model.initialize` method, passing in a small batch of input data `X` and a small batch of output data `Y`. This allows Thinc to **infer the missing dimensions**: when we defined the model, we didn’t tell it the input size `nI` or the output size `nO`. When passing in the data, make sure it is on the right device by calling `model.ops.asarray` which will e.g. transform the arrays to `cupy` when running on GPU." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ODzZCkuSGcjD", "outputId": "b1c178db-b297-4cf7-e135-596dae2a7a75" }, "outputs": [], "source": [ "# making sure the data is on the right device\n", "train_X = model.ops.asarray(train_X)\n", "train_Y = model.ops.asarray(train_Y)\n", "dev_X = model.ops.asarray(dev_X)\n", "dev_Y = model.ops.asarray(dev_Y)\n", "\n", "model.initialize(X=train_X[:5], Y=train_Y[:5])\n", "nI = model.get_dim(\"nI\")\n", "nO = model.get_dim(\"nO\")\n", "print(f\"Initialized model with input dimension nI={nI} and output dimension nO={nO}\")" ] }, { "cell_type": "markdown", "metadata": { "id": "th0djZu7GcjE" }, "source": [ "Next we need to create an **optimizer**, and make several passes over the data, randomly selecting paired batches of the inputs and labels each time. While some machine learning libraries provide a single `.fit()` method to train a model all at once, Thinc puts you in charge of **shuffling and batching your data**, with the help of a few handy utility methods. `model.ops.xp` is an instance of either `numpy` or `cupy`, depending on whether you run the code on CPU or GPU." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 219, "referenced_widgets": [ "d9ba3c88398d4e12a674eca10a8633ff", "2637352462d94fe795a409fbbbe70926", "d266fcfaaa9741b1a4be560f094ac1d2", "cd54b80e170c4a6c94fe419c2cf8bcd6", "db2b8e98efcd4a7599b7bbd57c55e70c", "71522233b5b64b3dbd29ec69e47788d8", "81a8b3ff6d644f2c83f04a835bef5333", "4c60aa21f05a4d678b2135d4d1f2c99a", "7f3517a0116846708d65a947e534de05", "2fa0fd59f8844a4e99eda19fc4151962", "ca4f1e1dbbbd46618b40291f94ef1102", "3ab377ee24544e2a95433448a8331ed1", "5fe58d7f655243c8b9d29f31a0eb7b53", "b1548f9f9f4642ef814e9d3565002501", "7fcc9f928ddd4f52a9d420862b9be6ef", "70898e759e6945a1a479dcb2d434b50d", "6ae1111eff4043f294a7bbafcb5de189", "0443d3d3c8564616a9cae2616c370a72", "f3abedf22ff649b4b90e85fc68f93c67", "d4f5f106a2ed488fbba2b626bbd72714", "d904c7aebabb477a99f41e95f1b0b9cf", "e82d78f382b343c384bb7895daa18c82", "b9862082c1cf47d1bb6057537571499d", "ebebf706cc9549d9803b796ea2ef2853", "b50ff7a73c0f4a6da93443ca019ba785", "0a9b4f19291b403dadeca3938004561e", "e2a09b4280db464f863a1ae66d58ea02", "7f60da0694d343fca576f9cfaf7352ac", "5ac87cfe946d483b8088df90b22490d8", "5d84a716b7ed4ad8927ee8ea8493e4db", "ea6cbc2071af4c018f96e5846f328a1f", "db3333497eba4ee1a63225b4c6bf468c", "e3ddfbf3678a41ab9926976cf1beee85", "a16d1171acfe48b5abfd3652d0cf119f", "7ae0b9e9e6964641a7d529b03d60b034", "4a9b8833512a4f07a4411b1e8c2ca0c8", "05de1b15d6244f82bcef782c8f73f8a8", "84fb3096f29f40bf9f4d20bca7608c05", "aa1f805540a74c7380bd2b333b9ecc88", "a0b0dd366b424f03adde1e0698b8b31f", "86c4306d45c04ce783d40f202c30c350", "2be93e1e76224f61afd058eea4583a05", "6f8967c159b1474ab706026b6becd9a1", "5c5c9d38d86c4d2486c547a3add4a04c", "6da928e744da4d0bb1cbb1df33c201ee", "017d16a6d32b4d6a9f868a57cd736568", "eb2cfbd11882434e9373f36d62d06258", "ceefe7af1738490d9414c6c690eb4681", "fc6d6eef364446c3b54b68c5c4c1cb1b", "662835d152984f4eb87fa7cef0c0e28d", "1de0cf05f59b49eb8f8d233b9a4e490e", "9bf763a02b58454ab1e4f9598939fd79", "af32974b6ed54e9da7b89fe35a749640", "aa7c50235a9f43fa96a7d9ef7be20861", "407a6771394a4e69a504ea5b67164a64", "e0077b7268614d85b4a08ad07183a2e4", "1a394e179354494487365d1a5242e2d3", "e567c933e82146758cb690a190f1199c", "35181a9eb7bc4967984c327a8b6f7f8f", "3cf4e5fcc4a64c13b100093fb12e2cd2", "b826f8a9468d4c23b35f6021791885b6", "016371ed2b1e43d29e7542dc20f9ef64", "70537ee37fd645c8ba0d3e88fc43fdb5", "6db4cb7968194992819296b341c378f1", "ad58dbfc6a294f3f9dc89c4a3f9658dc", "8f521dc0bd094a3da7cffd4da51ce7e0", "0eea906841464f978a262640badc0fae", "11daf0a19032495ab15cdda96b0030e7", "6565004456e24a88a2e1e04ebe7004df", "a63ede007e94496c884527478a9b0d17", "e6b70306bfea4bd09f17eac179387a96", "1e34b8465bc84f94b13a3d7a94d5f9ce", "c0db04b51d0c4e9e9081c0169cca1f4e", "cb35834c71e24301abd3574d82e017b9", "80016285573540f998aeec24132c0bb3", "f999eff152854b6da98defded43c8818", "ebfa4d5418d84b3ea8fad62dfabce7c1", "265c8c05122c406fa6b603070e2ca7bd", "85e62f6e0211431a9f6513285ef1aa0b", "92ae4ede68904e2f8b0b2322f099d32b" ] }, "id": "jnqyIuNgGcjF", "outputId": "5e4cecd4-8fd1-4608-ed8e-7ddfed1a7762" }, "outputs": [], "source": [ "from thinc.api import Adam, fix_random_seed\n", "from tqdm.notebook import tqdm\n", "\n", "fix_random_seed(0)\n", "optimizer = Adam(0.001)\n", "batch_size = 128\n", "print(\"Measuring performance across iterations:\")\n", "\n", "for i in range(10):\n", " batches = model.ops.multibatch(batch_size, train_X, train_Y, shuffle=True)\n", " for X, Y in tqdm(batches, leave=False):\n", " Yh, backprop = model.begin_update(X)\n", " backprop(Yh - Y)\n", " model.finish_update(optimizer)\n", " # Evaluate and print progress\n", " correct = 0\n", " total = 0\n", " for X, Y in model.ops.multibatch(batch_size, dev_X, dev_Y):\n", " Yh = model.predict(X)\n", " correct += (Yh.argmax(axis=1) == Y.argmax(axis=1)).sum()\n", " total += Yh.shape[0]\n", " score = correct / total\n", " print(f\" {i} {float(score):.3f}\")" ] }, { "cell_type": "markdown", "metadata": { "id": "FkcctgKzGcjG" }, "source": [ "Let's wrap the training code in a function, so we can reuse it later:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "6VRxmeipGcjH" }, "outputs": [], "source": [ "def train_model(data, model, optimizer, n_iter, batch_size):\n", " (train_X, train_Y), (dev_X, dev_Y) = data\n", " indices = model.ops.xp.arange(train_X.shape[0], dtype=\"i\")\n", " for i in range(n_iter):\n", " batches = model.ops.multibatch(batch_size, train_X, train_Y, shuffle=True)\n", " for X, Y in tqdm(batches, leave=False):\n", " Yh, backprop = model.begin_update(X)\n", " backprop(Yh - Y)\n", " model.finish_update(optimizer)\n", " # Evaluate and print progress\n", " correct = 0\n", " total = 0\n", " for X, Y in model.ops.multibatch(batch_size, dev_X, dev_Y):\n", " Yh = model.predict(X)\n", " correct += (Yh.argmax(axis=1) == Y.argmax(axis=1)).sum()\n", " total += Yh.shape[0]\n", " score = correct / total\n", " print(f\" {i} {float(score):.3f}\")" ] }, { "cell_type": "markdown", "metadata": { "id": "X6tmwMlsGcjH" }, "source": [ "### Operator overloading for more concise model definitions\n", "\n", "Thinc allows you to **overload operators** and bind arbitrary functions to Python operators like `+`, `*`, but also `>>` or `@`. The `Model.define_operators` contextmanager takes a dict of operators mapped to functions – typically combinators like `chain`. The operators are only valid for the `with` block. This lets us define the model like this:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "eZlHX5j5GcjH" }, "outputs": [], "source": [ "from thinc.api import Model, chain, Relu, Softmax\n", " \n", "n_hidden = 32\n", "dropout = 0.2\n", "\n", "with Model.define_operators({\">>\": chain}):\n", " model = Relu(nO=n_hidden, dropout=dropout) >> Relu(nO=n_hidden, dropout=dropout) >> Softmax()" ] }, { "cell_type": "markdown", "metadata": { "id": "liNMnvKzGcjH" }, "source": [ "If your model definitions are very complex, mapping combinators to operators can help you keep the code readable and concise. You can find more examples of model definitions with overloaded operators [in the docs](https://thinc.ai/docs). (Also note that you don't _have to_ use this syntax!)" ] }, { "cell_type": "markdown", "metadata": { "id": "HTFBXZxXGcjI" }, "source": [ "---\n", "\n", "## Using config files\n", "\n", "Configuration is a huge problem for machine learning code, because you may want to expose almost any detail of any function as a hyperparameter. The setting you want to expose might be arbitrarily far down in your call stack. Default values also become hard to change without breaking backwards compatibility.\n", "\n", "To solve this problem, Thinc provides a config system that lets you easily describe **arbitrary trees of objects**. The objects can be created via function calls you register using a simple decorator syntax. The config can include values like hyperparameters or training settings (whatever you need), or references to functions and the values of their arguments. Thinc will then construct the config **bottom-up** – so you can define one function with its arguments, and then pass the return value into another function.\n", "\n", "> 💡 You can keep the config as a string in your Python script, or save it to a file like `config.cfg`. To load a config from a string, you can use `Config.from_str`. To load from a file, you can use `Config.from_disk`. The following examples all use strings so we can include them in the notebook." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "BEvOL8kWGcjI", "outputId": "b6d12471-0128-497c-e67a-1b10f2d1e43b" }, "outputs": [], "source": [ "from thinc.api import Config, registry\n", "\n", "EXAMPLE_CONFIG1 = \"\"\"\n", "[hyper_params]\n", "learn_rate = 0.001\n", "\n", "[optimizer]\n", "@optimizers = \"Adam.v1\"\n", "learn_rate = ${hyper_params:learn_rate}\n", "\"\"\"\n", "\n", "config1 = Config().from_str(EXAMPLE_CONFIG1)\n", "config1" ] }, { "cell_type": "markdown", "metadata": { "id": "olHiDguEGcjJ" }, "source": [ "When you open the config with `Config.from_str`, Thinc will parse it as a dict and fill in the references to values defined in other sections. For example, `${hyper_params:learn_rate}` is substituted with `0.001`. \n", "\n", "Keys starting with `@` are references to **registered functions**. For example, `@optimizers = \"Adam.v1\"` refers to the function registered under the name `\"Adam.v1\"`, a function creating an Adam optimizer. The function takes one argument, the `learn_rate`. Calling `registry.resolve` will resolve the config and create the functions it defines." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "61kSjIhqGcjJ", "outputId": "f5a28ea7-174f-465b-9847-e0286a07e910" }, "outputs": [], "source": [ "loaded_config1 = registry.resolve(config1)\n", "loaded_config1" ] }, { "cell_type": "markdown", "metadata": { "id": "U7_Pfg62GcjJ" }, "source": [ "If function arguments are missing or have incompatible types, Thinc will raise an error and tell you what's wrong. Configs can also define **nested blocks** using the `.` notation. In this example, `optimizer.learn_rate` defines the `learn_rate` argument of the `optimizer` block. Instead of a float, the learning rate can also be a generator – for instance, a linear warm-up rate:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "XqEL3yoVGcjJ", "outputId": "007060a7-c387-4eab-e8be-0573069257fc" }, "outputs": [], "source": [ "EXAMPLE_CONFIG2 = \"\"\"\n", "[optimizer]\n", "@optimizers = \"Adam.v1\"\n", "\n", "[optimizer.learn_rate]\n", "@schedules = \"warmup_linear.v1\"\n", "initial_rate = 2e-5\n", "warmup_steps = 1000\n", "total_steps = 10000\n", "\"\"\"\n", "\n", "config2 = Config().from_str(EXAMPLE_CONFIG2)\n", "config2" ] }, { "cell_type": "markdown", "metadata": { "id": "_q6MvvG9GcjK" }, "source": [ "Calling `registry.resolve` will now construct the objects bottom-up: first, it will create the schedule with the given arguments. Next, it will create the optimizer and pass in the schedule as the `learn_rate` argument." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "u9wjWVwLGcjK", "outputId": "4bdbd58d-44e1-417a-9ee6-b6dc1925d5ef" }, "outputs": [], "source": [ "loaded_config2 = registry.resolve(config2)\n", "loaded_config2" ] }, { "cell_type": "markdown", "metadata": { "id": "WRw-cbKVGcjL" }, "source": [ "This gives you a loaded optimizer using the settings defined in the config, which you can then use in your script. How you set up your config and what you do with the result is **entirely up to you**. Thinc just gives you a dictionary of objects back and makes no assumptions about what they _\"mean\"_. This means that you can also choose the names of the config sections – the only thing that needs to stay consistent are the names of the function arguments." ] }, { "cell_type": "markdown", "metadata": { "id": "oKno-aCHGcjM" }, "source": [ "### Configuring the MNIST model\n", "\n", "Here's a config describing the model we defined above. The values in the `hyper_params` section can be referenced in other sections to keep them consistent. The `*` is used for **positional arguments** – in this case, the arguments to the `chain` function, two Relu layers and one softmax layer." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Gm762LNgGcjM", "outputId": "dc6bc047-3b1f-4f82-edd5-ba6cc7fc7c26" }, "outputs": [], "source": [ "CONFIG = \"\"\"\n", "[hyper_params]\n", "n_hidden = 32\n", "dropout = 0.2\n", "learn_rate = 0.001\n", "\n", "[model]\n", "@layers = \"chain.v1\"\n", "\n", "[model.*.relu1]\n", "@layers = \"Relu.v1\"\n", "nO = ${hyper_params:n_hidden}\n", "dropout = ${hyper_params:dropout}\n", "\n", "[model.*.relu2]\n", "@layers = \"Relu.v1\"\n", "nO = ${hyper_params:n_hidden}\n", "dropout = ${hyper_params:dropout}\n", "\n", "[model.*.softmax]\n", "@layers = \"Softmax.v1\"\n", "\n", "[optimizer]\n", "@optimizers = \"Adam.v1\"\n", "learn_rate = ${hyper_params:learn_rate}\n", "\n", "[training]\n", "n_iter = 10\n", "batch_size = 128\n", "\"\"\"\n", "\n", "config = Config().from_str(CONFIG)\n", "config" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "z1KGVcQQGcjM", "outputId": "960ee075-0ecc-4289-929b-61eb5ea93b38" }, "outputs": [], "source": [ "loaded_config = registry.resolve(config)\n", "loaded_config" ] }, { "cell_type": "markdown", "metadata": { "id": "irXmLRk4GcjN" }, "source": [ "When you call `registry.resolve`, Thinc will first create the three layers using the specified arguments populated by the hyperparameters. It will then pass the return values (the layer objects) to `chain`. It will also create an optimizer. All other values, like the training config, will be passed through as a regular dict. Your training code can now look like this:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 201, "referenced_widgets": [ "a5ac2b15a8ae40ce92160a960414279c", "b52a071acc34438d849dbc7adcc91631", "43b0d557889248f287edd4edf50e3a9b", "99c3aedf530c44d69f3c145efc7da6da", "773cbd3194e142c694f73fd52ee6aa8c", "7aebabcd7cd546e989eb0c148ebb1348", "199cccb400aa4fc59a1f95317db0ae2b", "9024d8c79164492e80170ca565f2e367", "14717f9c7a3f4bbc97978023bad0d876", "d7d3d6ec8a144738b61b59e8e1d37f1e", "4f27062765bd41f589215a61e2d0840a", "f5f4c5a71a9c41f88fafc9abea500f14", "95f5d01ae2524dd2bcfab4945816b6a4", "3edb84e7ef724a1887df6dcf31f75448", "c918030a689a4842b727d9b7ecbe39ae", "eac2608b4c0e4ad9ac81838ad7d68657", "21f9b00564ea47ffa4523dd9a8eec4e9", "6f2523ef7d0243b38975e5b657b43dd9", "34c8794ff06d4875aec3ecaacb7f11bd", "05eaa0a6003243bab5378655193332c0", "31ef257d727346478de228f6cbd27021", "4a97428d8e9944d5b2a00466e6a80c53", "2e0751da78e14c88bfaf8b45f30fcd05", "4b433703db1a41baa3e7e9f45d72aa57", "b668e892e9cb4571b173390e78d8d786", "7e569ac0f5974f4aaed7cf2e953bc316", "79574d891d35493da77efbbad6fff11f", "583d96a84b3642f4b864c7ae7ab6f598", "3563f3d4033b4ac7b43279cf13d8bdd2", "989fb7b65c504a1aad8ec0f53e2e43c3", "ee11cbb4ec3d4042b6c62536a477c10a", "5978e50fc32f4fe1ab99fbfc42e87c89", "3bbd206a74794ed4a5500b7bafe546ea", "d6f5cf60a40c4825bfca5a960056d078", "3161c8b70d9748c5a1400c0fe543d442", "421fbeb9dd4c422999932f7dcd210da7", "7326a18ab885419691c5bfc3666154bc", "3a1091487eac40cdac4046173caaaaf3", "0ed86bd7b55f49bcb9927be28a279a49", "d64df8ba0ab04aad9e1c2c4551a0b7d9", "565b64b2df2f4342bdb56ad34b468de2", "08b6e41233db46a6911d22fe531832f5", "6699fda35d5b495da6052e53f4e24a01", "649359bad86d415094308180006a0e11", "f82fd9ccee6b423c8bdbc830ba0f8a93", "afe82cf54da249cb815dc3ece7bac260", "c1a8a841a5124a6eb364863a2fc11447", "a13d290a9ddf41deb2f258c617dfd2e3", "110b5a48694c48059985490cae348dc6", "4c61f8b9314c4bec8a0c3a5ecab3356d", "c99185c8dfbe47aab9e29a90b92c63a0", "4553ca36932d4a20b898d7fa7b23bcc3", "0829771aa327491e8b7d05ef2b084175", "1687134f713c4c039365c0a66d1aab82", "27a1f038ed8a41dfb4d18175f80aab7a", "b32999bf8b8148e98bbbb6ba1acb4548", "000b5ea0ab444688bf195d6c810a9ee4", "5c9d8559f7134842ab00b99d28bfd644", "630b657a06384d7abd3b63bcf02c3a3e", "ac609c059aac45bba0ea7ee76e057977", "88a24010610d4a19a3fb81eddfcfaf52", "f7dd4ce672014ce6ba3d7d50ff090c9e", "fdd43b573d18496a9eec5f61632b33ed", "318b1b7bb5064c5aabd39540bf2d7bf2", "53065cc4a41d4652bfb986ae1d28ce9b", "5cc3f44e4660481d920e9120fd0d254a", "b7740ddd81034150bca1bf841f43af31", "c330191809e44832a89abcc6c4a6fd5d", "9e2a1ec730be42d38a3f04b967ed0b88", "583c6058061240838ad63f2a8ddf9a00", "e731309213c94e92be1a389d13a190f5", "110f5508e00e4ec6b5c84877abc9c265", "80538e2ccd7f490987a79d4c70c9571b", "50b4abff394846eabd6f6fdcac8a7762", "d17516de5c52450abfd79af7db04a282", "584cadfb0a6c480f94aad4b9842c4d25", "22a455a7b3f841a9b01bc83dee7717cc", "3c80e2934eda4d19825a76c6400a3823", "a991cedbd4b24c139430a06369ad527f", "490a7c3043e24e378892816de13970eb" ] }, "id": "1kjJ79orGcjN", "outputId": "c62b4795-f5a3-4257-d695-871fa4af1d08" }, "outputs": [], "source": [ "model = loaded_config[\"model\"]\n", "optimizer = loaded_config[\"optimizer\"]\n", "n_iter = loaded_config[\"training\"][\"n_iter\"]\n", "batch_size = loaded_config[\"training\"][\"batch_size\"]\n", "\n", "model.initialize(X=train_X[:5], Y=train_Y[:5])\n", "train_model(((train_X, train_Y), (dev_X, dev_Y)), model, optimizer, n_iter, batch_size)" ] }, { "cell_type": "markdown", "metadata": { "id": "vcH1GbRnGcjN" }, "source": [ "If you want to change a hyperparamter or experiment with a different optimizer, all you need to change is the config. For each experiment you run, you can save a config and you'll be able to reproduce it later." ] }, { "cell_type": "markdown", "metadata": { "id": "ml9jX5SNGcjO" }, "source": [ "---\n", "\n", "## Programming via config vs. registering custom functions\n", "\n", "The config system is very powerful and lets you define complex relationships, including model definitions with levels of nested layers. However, it's not always a good idea to program entirely in your config – this just replaces one problem (messy and hard to maintain code) with another one (messy and hard to maintain configs). So ultimately, it's about finding the **best possible trade-off**.\n", "\n", "If you've written a layer or model definition you're happy with, you can use Thinc's function registry to register it and assign it a string name. Your function can take any arguments that can later be defined in the config. Adding **type hints** ensures that config settings will be **parsed and validated** before they're passed into the function, so you don't end up with incompatible settings and confusing failures later on. Here's the MNIST model, defined as a custom layer:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "xgWuX6ceGcjO" }, "outputs": [], "source": [ "import thinc\n", "\n", "@thinc.registry.layers(\"MNIST.v1\")\n", "def create_mnist(nO: int, dropout: float):\n", " return chain(\n", " Relu(nO, dropout=dropout), \n", " Relu(nO, dropout=dropout), \n", " Softmax()\n", " )" ] }, { "cell_type": "markdown", "metadata": { "id": "o5hWEjL8GcjQ" }, "source": [ "In the config, we can now refer to it by name and set its arguments. This makes the config maintainable and compact, while still allowing you to change and record the hyperparameters." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "LsWrE-lyGcjR", "outputId": "28a9411c-0cc0-401d-9c3a-a5fae0410bde" }, "outputs": [], "source": [ "CONFIG2 = \"\"\"\n", "[model]\n", "@layers = \"MNIST.v1\"\n", "nO = 32\n", "dropout = 0.2\n", "\n", "[optimizer]\n", "@optimizers = \"Adam.v1\"\n", "learn_rate = 0.001\n", "\n", "[training]\n", "n_iter = 10\n", "batch_size = 128\n", "\"\"\"\n", "\n", "config = Config().from_str(CONFIG2)\n", "config" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "jqQLLw-gGcjS", "outputId": "8d30cbed-1a3e-4a6a-8893-cf353d15fa3c" }, "outputs": [], "source": [ "loaded_config = registry.resolve(config)\n", "loaded_config" ] }, { "cell_type": "markdown", "metadata": { "id": "kqYF8mP8GcjS" }, "source": [ "If you don't want to hard-code the dataset being used, you can also wrap it in a registry function. This lets you refer to it by name in the config, and makes it easy to swap it out. In your config, you can then load the data in its own section, or as a subsection of `training`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "vz3IxOetGcjS" }, "outputs": [], "source": [ "@thinc.registry.datasets(\"mnist_data.v1\")\n", "def mnist():\n", " return ml_datasets.mnist()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "suiQ2psrGcjT", "outputId": "4e72a0dc-b33b-4c5e-90f1-1dfa8f311b65", "scrolled": true }, "outputs": [], "source": [ "CONFIG3 = \"\"\"\n", "[model]\n", "@layers = \"MNIST.v1\"\n", "nO = 32\n", "dropout = 0.2\n", "\n", "[optimizer]\n", "@optimizers = \"Adam.v1\"\n", "learn_rate = 0.001\n", "\n", "[training]\n", "n_iter = 10\n", "batch_size = 128\n", "\n", "[training.data]\n", "@datasets = \"mnist_data.v1\"\n", "\"\"\"\n", "\n", "config = Config().from_str(CONFIG3)\n", "loaded_config = registry.resolve(config)\n", "loaded_config" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 201, "referenced_widgets": [ "f160728d6cfc4cd380fafce5b253d2c7", "b9db25806c4a410db0004f77a1acaee5", "0b2d03b2d0f6447293576ff8e9ed9ea3", "f839ef53446f4fa9834edc8da44f1327", "cc7f3e43ff504effb6fcbd63bac5546f", "dc4f419827134de0b96b9b020fa8a788", "68b365d2d435430aae5af88ecdae39a5", "0459c93679e54f9db4e7009420b8a612", "99fd455414304cb5a2a08077c2182452", "65729f9c7457426eb006da855388182b", "449ba373a94641f2ac9078d8f98c3f1a", "fa591816c3414db3a7dc1478649ac230", "3b06657d55a44d2486a3d65af18286d6", "14cf79b923404000b5eb2762d161ec78", "d673cd4b0e384aee988f565ab73cb022", "829ad0cbf2bb49d9bde04dcff1f9cb3c", "47a3f9dad5e2486b98ddd34b7bcf1201", "9bc1cd208dfd4a55bd52a4d0f399117c", "a27c932db2c84a86a75a92af92a07f0b", "8d73c0c46c944eb89e95a9efb0a891a6", "a183401dedf140979852bfc28122d689", "8b2e77ece9f14c37ad8efab38442acbb", "cf424d3cddcb4e469f4c88d1df70dedb", "2c303e0697ec4cca9e949207f89d7695", "b3664609744546988f30152c49d02ac8", "3e395e497d8f4f10812b2af65ccac13b", "247a4869ae564aefa501053956083a6a", "5ac7bb8fbf0048c492fc4f6c8b69d828", "099e1066f01c4b1780cf20a0700414a5", "2cdf06e67ced403795e3ba594fbf3c55", "2c6a4ebe2c914b028062eb3651de99e3", "fdd481739b6a4d64ac739965c621d3b8", "97e1cf826ec54af79646bee305e23601", "c8de4a1a7be449e68787a4dcdc94801d", "1c2657c607454a0eb329ae8663665e82", "1c4cfdd4f52a4db182cd08357b3d3abe", "db4cab1a1150482c861e22d6e7b2be09", "eaa7c96f7ee849948f10033289dfbd05", "d23105e4cc4141b5937063dc03e9d565", "ef3638ddf37547fe8359b8f4333dc2e8", "6b3e7a3ba015416cada97bb79d4c8fb1", "a780eb0b79ff40e9966a72a3c5a81eca", "0a9276f6ae784e63a6daaecdd2bc7e64", "0046f7bffaa6438d8cf31a0d558c4b46", "fce1dcea8fd749569b29e353a086ad45", "34d176a20c5e429a8852cb3e2d3bb507", "0a3730284d6a4110bf5247d537a24262", "efb84c9861764c61b09ad02f170d8530", "d98b018eb67447eca644cd5fa56f2723", "8ff0e222da2b47d99e8931080555cb7e", "a887772c5344437aa896b3ed1bd5208f", "734031c5bb6e4e7d9e30f1a15861924f", "e5caa26da44e411f891a71b85c46c87a", "e53b1041df93415c9852da6d8a05b7d3", "34237141f8854d33af9223e75e390ba5", "8a0e36efabb04f869ba2c080446525da", "e28f8422f22b4ef29ec9f6cffe959ecd", "03edea4af2724453bfbb6b8e2e74cda2", "dd43258264da429a9aeb315f1715b7db", "43d68f9905354442bad801fb61bfd02a", "861a02913c8346f2a2c7c7c049364acd", "4bccad99024f4d77a23b657d9dc7746d", "591e3bae35404f68b24f607ece97a9d3", "19b5d9601cb94873b3f550214d586577", "dba0b00af12d410cb8dfd4be838b173a", "b34c1730161e41c5bb901128ccb4ff65", "bce5275ceea044c3ba0f1635b0657ac4", "7048d397ed0647a19587c17deec944bb", "caff75ab1b874f9da109674579faadf3", "1017871f46b44c9cb3f976d1af607ffc", "32272e5a9e194bed9ffe5f16a3ae1d61", "a4823e3708aa4ccba43e3547a229095e", "ab99a2cf8919454bb780cc24088f2b85", "9c7baaf83e734b86b2234c735dca859d", "fddd7fb9ef3f4535a97775548abbabd1", "fa68877e48ab41a48a3c10dc3fe329d1", "32ff8a0bfbcb44ebb0c80363f6115e07", "3f0d72d9c4984f89a82862fcdd24643b", "96e832df4dec40d9a97bd129ef55effa", "3e448a3c76bc4fdfa57f82327411f2e2" ] }, "id": "TYYXzyYNGcjT", "outputId": "edaaf25e-5e9f-43a5-8a6a-04bd5b612317" }, "outputs": [], "source": [ "model = loaded_config[\"model\"]\n", "optimizer = loaded_config[\"optimizer\"]\n", "n_iter = loaded_config[\"training\"][\"n_iter\"]\n", "batch_size = loaded_config[\"training\"][\"batch_size\"]\n", "(train_X, train_Y), (dev_X, dev_Y) = loaded_config[\"training\"][\"data\"]\n", "\n", "# After loading the data from config, they might still need to be moved to the right device\n", "train_X = model.ops.asarray(train_X)\n", "train_Y = model.ops.asarray(train_Y)\n", "dev_X = model.ops.asarray(dev_X)\n", "dev_Y = model.ops.asarray(dev_Y)\n", "\n", "model.initialize(X=train_X[:5], Y=train_Y[:5])\n", "train_model(((train_X, train_Y), (dev_X, dev_Y)), model, optimizer, n_iter, batch_size)" ] }, { "cell_type": "markdown", "metadata": { "id": "46MPK6-XGcjT" }, "source": [ "---\n", "\n", "## Wrapping TensorFlow, PyTorch and MXNet models\n", "\n", "The previous example showed how to define the model directly in Thinc, which is pretty straightforward. But you can also define your model using a **machine learning library of your choice** and wrap it as a Thinc model. This gives your layers a unified interface so you can easily mix and match them, and also lets you take advantage of the config system and type hints. Thinc currently ships with built-in wrappers for [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org) and [MXNet](https://mxnet.apache.org/)." ] }, { "cell_type": "markdown", "metadata": { "id": "S9fK_9mAGcjT" }, "source": [ "### Wrapping TensorFlow models\n", "\n", "Here's the same model definition in TensorFlow: a `Sequential` layer (equivalent of Thinc's `chain`) with two Relu layers and dropout, and an output layer with a softmax activation. Thinc's `TensorFlowWrapper` wraps the model and turns it into a regular Thinc `Model`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "IkgBI5wbGcjU", "outputId": "65179036-11ea-430e-e54a-3ee0d02dcdad" }, "outputs": [], "source": [ "from tensorflow.keras.layers import Dense, Dropout\n", "from tensorflow.keras.models import Sequential\n", "from thinc.api import enable_tensorflow, TensorFlowWrapper, Adam\n", "enable_tensorflow()\n", "\n", "width = 32\n", "nO = 10\n", "nI = 784\n", "dropout = 0.2\n", "\n", "tf_model = Sequential()\n", "tf_model.add(Dense(width, activation=\"relu\", input_shape=(nI,)))\n", "tf_model.add(Dropout(dropout))\n", "tf_model.add(Dense(width, activation=\"relu\", input_shape=(nI,)))\n", "tf_model.add(Dropout(dropout))\n", "tf_model.add(Dense(nO, activation=\"softmax\"))\n", "\n", "wrapped_tf_model = TensorFlowWrapper(tf_model)\n", "wrapped_tf_model" ] }, { "cell_type": "markdown", "metadata": { "id": "FVG18Ew_GcjU" }, "source": [ "You can now use the same training code to train the model:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 257, "referenced_widgets": [ "7ed4511c19b24c7fadf283d962a612a2", "7e44024663ce4bd4833c4dcdf2d63d14", "4b2f4fa05e7a465eacf809489243b2a8", "a3426fcb07904ca4be130a71b330c77a", "df732c32eb1340a890c181eed7358452", "e18cf1aef5834391ae7410dcb90f1c59", "759a4d04fe92425ab0d6d8681d3ed0c6", "8a25115e9fef433e90b70e1ff3bbe341", "8b296000cd0446e2952bff859b785260", "f6f53ccede894d5fa859543bcd5d07a1", "26fa7101f97f4aed98a774c83e802bc9", "3a4fc2bfed8549d980a4884715d9c650", "a21851e9b7b24098b3fbbe6d9f1f8e9c", "a73abf53972a4913bf2c50b0d341fc13", "6d23bd6b099746028b353af12380d226", "2233981c90214b7cae8d5bfc7410802b", "4faac8b7bdd748a7b908d46ed058aa3a", "995ac4803a534d0883a15702eae4fc50", "8584d1e513e7496192af75d2cf4f84c0", "943c772ee3fe43cea3d05cea3f7f12bb", "74632c71eef34180a7dba0c22fd9df80", "dbd113a86ad44f0b95261ed9f6e6c93c", "054a82c3f2dc4de9864b83dcd1a2abd8", "f4fd9c138d8c4192afdb4324afe46771", "0d95eef69a7d42418cc79e4cf4d8a3cd", "84ddb87806a94da8902e3da8a06aa7e5", "61540f7e300545eebbd697227a3b3d7d", "c9892de0df614a84b8ba7a6e259ffe09", "a08bba98a4994866949e19f6104e6991", "d74548d2826c45cba4e730b3a9638fd4", "fac6ce9bd41f43f9821f45741359f5f4", "86ea34c601f447f18eaaf30fd1711f77", "8c639957ced245318db4865da9e0c1df", "0cdbaa847609462aa3163c49db61a7cd", "7b5bf62263a64441b7424aab153415be", "370044cae56f42fd992e4c4ce3240f68", "7eb7725598674b13b049a370bb505ea7", "d1758fb53b404e3f9b8f317be75684b4", "8dde5fd1fe4347c7bea1c51c47b14e5e", "ca1968d9a9f7462e88c9a051cb7a6777", "db1b1bff50974cd0823dcccecd2ae1c4", "fad451dd3ae040a8aede364098400642", "e47127013eaa48979dc86657839ba227", "eb6a91e79a1b4998bc2751d3e572b05f", "0b62d25712a2403ab488914a7109ab47", "ff6267b3dd63479a8e260848a30709a8", "dd52397ee21b49f999121fb8a62ea4bf", "8404870254bf4dfa80ce1a11acaa5969", "e9228023d62243569a1e2e06a1cf94b5", "f08fd096dcb743faafc6dbc604b45989", "c808822cdef941a3879bf1cc2b32720a", "e4e73b9dcadd4bacb50d03152e7d81e8", "c8967d63161647d4a9e778765d3e7ac2", "570de138283348be9b7575b51df33eea", "6b89100361a443bd85a01f8e47374c96", "6485d6b9b194425f8eb28b779d7d6e9a", "5bd005f55b724af4893bb2d0718d9408", "2e5a7bb281d840e6a4522a4dc602fd80", "4005b0b6131a400e927343af9a20e154", "87a3fcd0fd8d4df1b885b1e106d085a8", "493826515d934872b80d127fbf8e6a85", "594aebcc9478429d9a5063327c9953bc", "7411b7336cab4e8f92347df274e93876", "7e91135b95964e35a11bd312983f31c3", "ab756a05d67241baabcb4ee84b35efe3", "9b16033c7b7a47568a0d078d708cf28d", "de806eb1cca0447c92917881ec18d49a", "00a9eda2268e47baaae96926bb7d8c51", "64cc1e2f91a44b218a7824aedd373b31", "e9c21ca7465449d3a8930234e9ed8dcf", "b775d1f8fbae434185d52dafd207b592", "0fc3d74e4d4a4ac8b057342c0a017394", "02a62e897a334ff88aa5282286de0bab", "2cbcffe4ddd8450db4b259d368516d9d", "880dce5bac5148988119a4c0f7296c83", "6790ba4beb8a4bae8f9a14f0cca3b5c9", "6cba2abf076d483ba8847ccbcf537c52", "c2fa2316330f4edc83a8e3e4de571cf3", "f55d98fcc3524d94ba73b3192ee19281", "21f755e5d9774eb3aab7604140054a6d" ] }, "id": "mu3vRO95GcjU", "outputId": "cfb89aaf-581a-4bc6-f13e-aa7d8990d81b" }, "outputs": [], "source": [ "data = ml_datasets.mnist()\n", "optimizer = Adam(0.001)\n", "wrapped_tf_model.initialize(X=train_X[:5], Y=train_Y[:5])\n", "train_model(data, wrapped_tf_model, optimizer, n_iter=10, batch_size=128)" ] }, { "cell_type": "markdown", "metadata": { "id": "YxiSA-iwGcjV" }, "source": [ "### Wrapping PyTorch models\n", "\n", "Here's the PyTorch version. Thinc's `PyTorchWrapper` wraps the model and turns it into a regular Thinc `Model`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "rBiDnLGhGcjW", "outputId": "a208e5b6-8dc9-460a-f98a-b3d14186c4dc", "scrolled": true }, "outputs": [], "source": [ "import torch\n", "import torch.nn\n", "import torch.nn.functional as F\n", "from thinc.api import PyTorchWrapper, Adam\n", "\n", "\n", "width = 32\n", "nO = 10\n", "nI = 784\n", "dropout = 0.2\n", "\n", "\n", "class PyTorchModel(torch.nn.Module):\n", " def __init__(self, width, nO, nI, dropout):\n", " super(PyTorchModel, self).__init__()\n", " self.dropout1 = torch.nn.Dropout2d(dropout)\n", " self.dropout2 = torch.nn.Dropout2d(dropout)\n", " self.fc1 = torch.nn.Linear(nI, width)\n", " self.fc2 = torch.nn.Linear(width, nO)\n", "\n", " def forward(self, x):\n", " x = F.relu(x)\n", " x = self.dropout1(x)\n", " x = self.fc1(x)\n", " x = F.relu(x)\n", " x = self.dropout2(x)\n", " x = self.fc2(x)\n", " output = F.log_softmax(x, dim=1)\n", " return output\n", " \n", "wrapped_pt_model = PyTorchWrapper(PyTorchModel(width, nO, nI, dropout))\n", "wrapped_pt_model" ] }, { "cell_type": "markdown", "metadata": { "id": "9DHValebGcjX" }, "source": [ "You can now use the same training code to train the model:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 201, "referenced_widgets": [ "9bce5f414ec043509c06f10840cc2d0f", "47fd69df905945a09183f89126c665f0", "50ded217cb2440249cd86a4dcc0e1b7a", "e1229e07527b4a67bb7de71715ed10ca", "987b752181564435ab5a7f8d838651f5", "009991c634044a2c8dfb58aa7da342a6", "5ee467d84bd24e5db0507a994273ea28", "6bc78efbc98a4cb5ad04647f893e2f1a", "973c950b92d14614a5df848d2a8c024e", "a702297c0c7e40b08546a7669dfb6917", "637ac772584f4f169d59c0964be8acfd", "dd2ea7e5c59f4a3a807a7f8048eafb1e", "fe0223b47b9346e7ad056b86841f91d9", "e32b04ebb4454ca2848b799045c30320", "608cfc45e4ec4579b75999043e62ab19", "69f5f6ef84e44fc284dd9be06beaaf65", "4381199cd6fd46e98175bc65f3283a07", "f8c7cd8112274e26996a56ecae42ec3f", "ad1659c9381a4afca67aac81d1470776", "28f837093edd4e60bde32ec8d23b7497", "f0c3740bcfb04fa6a12e1f1025aff42f", "191e3c3e02b44eda9ebe4859325830e5", "b7341f8df10a4e1ab8c3cbb475de0d82", "de11572a1baa4efabaa5c1436af92f06", "8619ba70e84f4bda9d5c966863d0d4e3", "0c037dcc8bbb4f38977b3e516d3a2014", "977ab80b593849389b224d18aefb6814", "d62d3423df7f49d18b45bb87e9919ade", "473ece24383049f6964082046f5a8cef", "a859b046e9e84f518b8c4aa449fb75cc", "50d48e02aa744ad8adbccce94148b060", "b3f89680663b466f9dda719fa6843707", "faa57a96c1e7416fa9a9a41b5bc6e308", "b4979a909ae64f48888d2383285f4f68", "732824b0216e44f7a88da251febff435", "c5b2f89f03264317aa734883c164cabb", "40b7a89564684301ae357cae6c517be4", "b91537eaa9ba44f8952cb65696d236fe", "79c6ecc409764fc78294fcbd9319c3c0", "b31897c725c946e8a08a2ef0e80b6520", "cb24ce5968194d92bf77463a59eea46b", "5bfe581cc5db4002b38c89df6b245720", "aa86d75f3dba49a481c2c15167387b99", "e83ab25fcda94a90bdd58143c3624263", "82076a20084549719b917b071d1d1b91", "49bbc050955c4ddd931efc9a468faccb", "ae7ec72f5d064a6a80433613be03f849", "5eb4571729ea4b92857d3ba3c575721a", "1cea7c77162d42b2a464aeb98f86d36d", "66fc9d3aad8f478c8884e74990c9f2f9", "15062403d526469e910691b9b59f06bd", "aa3e1f1cf64a47af9aa0930b855c14bc", "b875c88f7ae74f8391ac58fc31a3aabc", "4c6f9216f6b14905bbfeffd81e14c973", "550caabed61042e1b89dd8a826897b77", "27ca20cabb94467492f29713fad334dd", "70bb47f183e24e7c805d8b5e89ce1b3e", "838598dc75fb4836b3f4d769d68de597", "c2b02e00355041919382a3c23c0d6850", "6e396b43955349b28a280ccb1d41c716", "9f6277814410407fae19e3aee971c997", "1480b195483d454c844c9e6a724b02b3", "501c6677916d40f9afaea8f48be244fe", "2e78f48b6298490885474f27bcbf2928", "df901f8348654af087a63b43ec822b9e", "dffdd7d2ddf24707a1b2fb0df00cf957", "3fb34090b5b34d6fa8f039440e839fbd", "46796020aa1145fc87c7f458ee41e14e", "3b153a8becf5411c871221d482680caa", "0701da5b35604eaebcecf87335ad324c", "76c193b0729b4a57b1664a94163bb38a", "877c9e4a3541425eac50c9250e5ff568", "4e2c73f549d94202a34b4a1046d011e5", "847aaa75aecc40f3bc9d67c37cf03362", "8c10956546bd46cc94c322044b217a1a", "cfa1762b9dd740f39d4dc3f198abdcc6", "5edf3c8cd0f64046ac298d48a93ef32e", "77325a33c7b6495e9301c771dbf935de", "ce87dfd22b554e0a83b264913f7156c6", "2eb23201ad354f3ba8a0720757d4d8bd" ] }, "id": "OCXFDVIHGcjX", "outputId": "8fad70f4-c323-46b0-de52-2d4b65aed7b1", "scrolled": true }, "outputs": [], "source": [ "data = ml_datasets.mnist()\n", "optimizer = Adam(0.001)\n", "wrapped_pt_model.initialize(X=train_X[:5], Y=train_Y[:5])\n", "train_model(data, wrapped_pt_model, optimizer, n_iter=10, batch_size=128)" ] }, { "cell_type": "markdown", "metadata": { "id": "E91d8Wm3GcjX" }, "source": [ "### Wrapping MXNet models\n", "\n", "Here's the MXNet version. Thinc's `MXNetWrapper` wraps the model and turns it into a regular Thinc `Model`.\n", "\n", "MXNet doesn't provide a `Softmax` layer but a `.softmax()` operation/method for prediction and it integrates an internal softmax during training. So to be able to integrate it with the rest of the components, you combine it with a `Softmax()` Thinc layer using the `chain` combinator. Make sure you `initialize()` the MXNet model *and* the Thinc model." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6KU34c-1GcjY", "outputId": "5c5db8b7-9a5d-4652-f1c9-4efac0d0e1a2" }, "outputs": [], "source": [ "from mxnet.gluon.nn import Dense, Sequential, Dropout\n", "from thinc.api import enable_mxnet, MXNetWrapper, chain, Softmax\n", "import thinc.util\n", "enable_mxnet()\n", "\n", "assert thinc.util.has_mxnet\n", "\n", "width = 32\n", "nO = 10\n", "nI = 784\n", "dropout = 0.2\n", "\n", "mx_model = Sequential()\n", "mx_model.add(Dense(width, activation=\"relu\"))\n", "mx_model.add(Dropout(dropout))\n", "mx_model.add(Dense(width, activation=\"relu\"))\n", "mx_model.add(Dropout(dropout))\n", "mx_model.add(Dense(nO))\n", "mx_model.initialize()\n", "wrapped_mx_model = chain(MXNetWrapper(mx_model), Softmax())\n", "wrapped_mx_model" ] }, { "cell_type": "markdown", "metadata": { "id": "V9ySHavEGcjY" }, "source": [ "And train it the same way:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 227 }, "id": "SeE6CPUKGcjY", "outputId": "9616cc90-2164-4da5-d3fd-928c7d47b726" }, "outputs": [], "source": [ "data = ml_datasets.mnist()\n", "optimizer = Adam(0.001)\n", "wrapped_mx_model.initialize(X=train_X[:5], Y=train_Y[:5])\n", "train_model(data, wrapped_mx_model, optimizer, n_iter=10, batch_size=128)" ] }, { "cell_type": "markdown", "metadata": { "id": "v3uPO9ZYGcjY" }, "source": [ "---\n", "\n", "## Documentation and resources\n", "\n", "- USAGE [Configuration files](https://thinc.ai/docs/usage-config)\n", "- USAGE [Defining and using models](https://thinc.ai/docs/usage-models)\n", "- USAGE [Using Thinc with PyTorch, TensorFlow & MXNet](https://thinc.ai/docs/usage-frameworks)\n", "- API [Available layers and combinators](https://thinc.ai/docs/api-layers)\n", "- API [`Config` and `registry`](https://thinc.ai/docs/api-config)\n", "- API [`Model` class](https://thinc.ai/docs/api-model)" ] } ], "metadata": { "accelerator": "GPU", "colab": { "name": "00_intro_to_thinc.ipynb", "provenance": [] }, "file_extension": ".py", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" }, "mimetype": "text/x-python", "name": "python", "npconvert_exporter": "python", "pygments_lexer": "ipython3", "version": 3, "widgets": { "application/vnd.jupyter.widget-state+json": { "000b5ea0ab444688bf195d6c810a9ee4": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_630b657a06384d7abd3b63bcf02c3a3e", "IPY_MODEL_ac609c059aac45bba0ea7ee76e057977" ], "layout": "IPY_MODEL_5c9d8559f7134842ab00b99d28bfd644" } }, "0046f7bffaa6438d8cf31a0d558c4b46": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_efb84c9861764c61b09ad02f170d8530", "placeholder": "​", "style": "IPY_MODEL_0a3730284d6a4110bf5247d537a24262", "value": " 422/422 [00:01<00:00, 307.85it/s]" } }, "009991c634044a2c8dfb58aa7da342a6": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "00a9eda2268e47baaae96926bb7d8c51": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_0fc3d74e4d4a4ac8b057342c0a017394", "placeholder": "​", "style": "IPY_MODEL_b775d1f8fbae434185d52dafd207b592", "value": " 422/422 [00:04<00:00, 106.76it/s]" } }, "016371ed2b1e43d29e7542dc20f9ef64": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "017d16a6d32b4d6a9f868a57cd736568": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "02a62e897a334ff88aa5282286de0bab": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_880dce5bac5148988119a4c0f7296c83", "IPY_MODEL_6790ba4beb8a4bae8f9a14f0cca3b5c9" ], "layout": "IPY_MODEL_2cbcffe4ddd8450db4b259d368516d9d" } }, "03edea4af2724453bfbb6b8e2e74cda2": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "0443d3d3c8564616a9cae2616c370a72": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "0459c93679e54f9db4e7009420b8a612": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "054a82c3f2dc4de9864b83dcd1a2abd8": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "05de1b15d6244f82bcef782c8f73f8a8": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "05eaa0a6003243bab5378655193332c0": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_4b433703db1a41baa3e7e9f45d72aa57", "placeholder": "​", "style": "IPY_MODEL_2e0751da78e14c88bfaf8b45f30fcd05", "value": " 422/422 [00:01<00:00, 303.55it/s]" } }, "0701da5b35604eaebcecf87335ad324c": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "0829771aa327491e8b7d05ef2b084175": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "08b6e41233db46a6911d22fe531832f5": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "099e1066f01c4b1780cf20a0700414a5": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "0a3730284d6a4110bf5247d537a24262": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "0a9276f6ae784e63a6daaecdd2bc7e64": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_34d176a20c5e429a8852cb3e2d3bb507", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_fce1dcea8fd749569b29e353a086ad45", "value": 422 } }, "0a9b4f19291b403dadeca3938004561e": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "0b2d03b2d0f6447293576ff8e9ed9ea3": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_dc4f419827134de0b96b9b020fa8a788", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_cc7f3e43ff504effb6fcbd63bac5546f", "value": 422 } }, "0b62d25712a2403ab488914a7109ab47": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "0c037dcc8bbb4f38977b3e516d3a2014": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "0cdbaa847609462aa3163c49db61a7cd": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "0d95eef69a7d42418cc79e4cf4d8a3cd": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_61540f7e300545eebbd697227a3b3d7d", "IPY_MODEL_c9892de0df614a84b8ba7a6e259ffe09" ], "layout": "IPY_MODEL_84ddb87806a94da8902e3da8a06aa7e5" } }, "0ed86bd7b55f49bcb9927be28a279a49": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "0eea906841464f978a262640badc0fae": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_a63ede007e94496c884527478a9b0d17", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_6565004456e24a88a2e1e04ebe7004df", "value": 422 } }, "0fc3d74e4d4a4ac8b057342c0a017394": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "1017871f46b44c9cb3f976d1af607ffc": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "110b5a48694c48059985490cae348dc6": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_c99185c8dfbe47aab9e29a90b92c63a0", "IPY_MODEL_4553ca36932d4a20b898d7fa7b23bcc3" ], "layout": "IPY_MODEL_4c61f8b9314c4bec8a0c3a5ecab3356d" } }, "110f5508e00e4ec6b5c84877abc9c265": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "11daf0a19032495ab15cdda96b0030e7": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_1e34b8465bc84f94b13a3d7a94d5f9ce", "placeholder": "​", "style": "IPY_MODEL_e6b70306bfea4bd09f17eac179387a96", "value": " 422/422 [00:01<00:00, 311.51it/s]" } }, "14717f9c7a3f4bbc97978023bad0d876": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_4f27062765bd41f589215a61e2d0840a", "IPY_MODEL_f5f4c5a71a9c41f88fafc9abea500f14" ], "layout": "IPY_MODEL_d7d3d6ec8a144738b61b59e8e1d37f1e" } }, "1480b195483d454c844c9e6a724b02b3": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "14cf79b923404000b5eb2762d161ec78": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "15062403d526469e910691b9b59f06bd": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_4c6f9216f6b14905bbfeffd81e14c973", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_b875c88f7ae74f8391ac58fc31a3aabc", "value": 422 } }, "1687134f713c4c039365c0a66d1aab82": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "191e3c3e02b44eda9ebe4859325830e5": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "199cccb400aa4fc59a1f95317db0ae2b": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "19b5d9601cb94873b3f550214d586577": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "1a394e179354494487365d1a5242e2d3": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_35181a9eb7bc4967984c327a8b6f7f8f", "IPY_MODEL_3cf4e5fcc4a64c13b100093fb12e2cd2" ], "layout": "IPY_MODEL_e567c933e82146758cb690a190f1199c" } }, "1c2657c607454a0eb329ae8663665e82": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_eaa7c96f7ee849948f10033289dfbd05", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_db4cab1a1150482c861e22d6e7b2be09", "value": 422 } }, "1c4cfdd4f52a4db182cd08357b3d3abe": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_ef3638ddf37547fe8359b8f4333dc2e8", "placeholder": "​", "style": "IPY_MODEL_d23105e4cc4141b5937063dc03e9d565", "value": " 422/422 [00:01<00:00, 304.76it/s]" } }, "1cea7c77162d42b2a464aeb98f86d36d": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_15062403d526469e910691b9b59f06bd", "IPY_MODEL_aa3e1f1cf64a47af9aa0930b855c14bc" ], "layout": "IPY_MODEL_66fc9d3aad8f478c8884e74990c9f2f9" } }, "1de0cf05f59b49eb8f8d233b9a4e490e": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_aa7c50235a9f43fa96a7d9ef7be20861", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_af32974b6ed54e9da7b89fe35a749640", "value": 422 } }, "1e34b8465bc84f94b13a3d7a94d5f9ce": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "21f755e5d9774eb3aab7604140054a6d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "21f9b00564ea47ffa4523dd9a8eec4e9": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_34c8794ff06d4875aec3ecaacb7f11bd", "IPY_MODEL_05eaa0a6003243bab5378655193332c0" ], "layout": "IPY_MODEL_6f2523ef7d0243b38975e5b657b43dd9" } }, "2233981c90214b7cae8d5bfc7410802b": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "22a455a7b3f841a9b01bc83dee7717cc": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "247a4869ae564aefa501053956083a6a": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_2cdf06e67ced403795e3ba594fbf3c55", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_099e1066f01c4b1780cf20a0700414a5", "value": 422 } }, "2637352462d94fe795a409fbbbe70926": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "265c8c05122c406fa6b603070e2ca7bd": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "26fa7101f97f4aed98a774c83e802bc9": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_a73abf53972a4913bf2c50b0d341fc13", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_a21851e9b7b24098b3fbbe6d9f1f8e9c", "value": 422 } }, "27a1f038ed8a41dfb4d18175f80aab7a": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "27ca20cabb94467492f29713fad334dd": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "28f837093edd4e60bde32ec8d23b7497": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_de11572a1baa4efabaa5c1436af92f06", "placeholder": "​", "style": "IPY_MODEL_b7341f8df10a4e1ab8c3cbb475de0d82", "value": " 422/422 [00:01<00:00, 300.55it/s]" } }, "2be93e1e76224f61afd058eea4583a05": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2c303e0697ec4cca9e949207f89d7695": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2c6a4ebe2c914b028062eb3651de99e3": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "2cbcffe4ddd8450db4b259d368516d9d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2cdf06e67ced403795e3ba594fbf3c55": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2e0751da78e14c88bfaf8b45f30fcd05": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "2e5a7bb281d840e6a4522a4dc602fd80": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2e78f48b6298490885474f27bcbf2928": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2eb23201ad354f3ba8a0720757d4d8bd": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2fa0fd59f8844a4e99eda19fc4151962": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "3161c8b70d9748c5a1400c0fe543d442": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_3a1091487eac40cdac4046173caaaaf3", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_7326a18ab885419691c5bfc3666154bc", "value": 422 } }, "318b1b7bb5064c5aabd39540bf2d7bf2": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "31ef257d727346478de228f6cbd27021": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "32272e5a9e194bed9ffe5f16a3ae1d61": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "32ff8a0bfbcb44ebb0c80363f6115e07": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "34237141f8854d33af9223e75e390ba5": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "34c8794ff06d4875aec3ecaacb7f11bd": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_4a97428d8e9944d5b2a00466e6a80c53", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_31ef257d727346478de228f6cbd27021", "value": 422 } }, "34d176a20c5e429a8852cb3e2d3bb507": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "35181a9eb7bc4967984c327a8b6f7f8f": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_016371ed2b1e43d29e7542dc20f9ef64", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_b826f8a9468d4c23b35f6021791885b6", "value": 422 } }, "3563f3d4033b4ac7b43279cf13d8bdd2": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "370044cae56f42fd992e4c4ce3240f68": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_ca1968d9a9f7462e88c9a051cb7a6777", "placeholder": "​", "style": "IPY_MODEL_8dde5fd1fe4347c7bea1c51c47b14e5e", "value": " 422/422 [00:04<00:00, 95.92it/s]" } }, "3a1091487eac40cdac4046173caaaaf3": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "3a4fc2bfed8549d980a4884715d9c650": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_2233981c90214b7cae8d5bfc7410802b", "placeholder": "​", "style": "IPY_MODEL_6d23bd6b099746028b353af12380d226", "value": " 422/422 [00:04<00:00, 101.43it/s]" } }, "3ab377ee24544e2a95433448a8331ed1": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_70898e759e6945a1a479dcb2d434b50d", "placeholder": "​", "style": "IPY_MODEL_7fcc9f928ddd4f52a9d420862b9be6ef", "value": " 422/422 [00:01<00:00, 305.51it/s]" } }, "3b06657d55a44d2486a3d65af18286d6": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "3b153a8becf5411c871221d482680caa": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "3bbd206a74794ed4a5500b7bafe546ea": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_3161c8b70d9748c5a1400c0fe543d442", "IPY_MODEL_421fbeb9dd4c422999932f7dcd210da7" ], "layout": "IPY_MODEL_d6f5cf60a40c4825bfca5a960056d078" } }, "3c80e2934eda4d19825a76c6400a3823": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "3cf4e5fcc4a64c13b100093fb12e2cd2": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_6db4cb7968194992819296b341c378f1", "placeholder": "​", "style": "IPY_MODEL_70537ee37fd645c8ba0d3e88fc43fdb5", "value": " 422/422 [00:01<00:00, 310.58it/s]" } }, "3e395e497d8f4f10812b2af65ccac13b": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "3e448a3c76bc4fdfa57f82327411f2e2": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "3edb84e7ef724a1887df6dcf31f75448": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "3f0d72d9c4984f89a82862fcdd24643b": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "3fb34090b5b34d6fa8f039440e839fbd": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_0701da5b35604eaebcecf87335ad324c", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_3b153a8becf5411c871221d482680caa", "value": 422 } }, "4005b0b6131a400e927343af9a20e154": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_594aebcc9478429d9a5063327c9953bc", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_493826515d934872b80d127fbf8e6a85", "value": 422 } }, "407a6771394a4e69a504ea5b67164a64": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "40b7a89564684301ae357cae6c517be4": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "421fbeb9dd4c422999932f7dcd210da7": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_d64df8ba0ab04aad9e1c2c4551a0b7d9", "placeholder": "​", "style": "IPY_MODEL_0ed86bd7b55f49bcb9927be28a279a49", "value": " 422/422 [00:01<00:00, 301.60it/s]" } }, "4381199cd6fd46e98175bc65f3283a07": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_ad1659c9381a4afca67aac81d1470776", "IPY_MODEL_28f837093edd4e60bde32ec8d23b7497" ], "layout": "IPY_MODEL_f8c7cd8112274e26996a56ecae42ec3f" } }, "43b0d557889248f287edd4edf50e3a9b": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_7aebabcd7cd546e989eb0c148ebb1348", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_773cbd3194e142c694f73fd52ee6aa8c", "value": 422 } }, "43d68f9905354442bad801fb61bfd02a": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_19b5d9601cb94873b3f550214d586577", "placeholder": "​", "style": "IPY_MODEL_591e3bae35404f68b24f607ece97a9d3", "value": " 422/422 [00:01<00:00, 304.08it/s]" } }, "449ba373a94641f2ac9078d8f98c3f1a": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_14cf79b923404000b5eb2762d161ec78", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_3b06657d55a44d2486a3d65af18286d6", "value": 422 } }, "4553ca36932d4a20b898d7fa7b23bcc3": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_b32999bf8b8148e98bbbb6ba1acb4548", "placeholder": "​", "style": "IPY_MODEL_27a1f038ed8a41dfb4d18175f80aab7a", "value": " 422/422 [00:01<00:00, 308.41it/s]" } }, "46796020aa1145fc87c7f458ee41e14e": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_877c9e4a3541425eac50c9250e5ff568", "placeholder": "​", "style": "IPY_MODEL_76c193b0729b4a57b1664a94163bb38a", "value": " 422/422 [00:01<00:00, 297.86it/s]" } }, "473ece24383049f6964082046f5a8cef": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "47a3f9dad5e2486b98ddd34b7bcf1201": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_a27c932db2c84a86a75a92af92a07f0b", "IPY_MODEL_8d73c0c46c944eb89e95a9efb0a891a6" ], "layout": "IPY_MODEL_9bc1cd208dfd4a55bd52a4d0f399117c" } }, "47fd69df905945a09183f89126c665f0": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "490a7c3043e24e378892816de13970eb": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "493826515d934872b80d127fbf8e6a85": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "49bbc050955c4ddd931efc9a468faccb": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "4a97428d8e9944d5b2a00466e6a80c53": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "4a9b8833512a4f07a4411b1e8c2ca0c8": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_a0b0dd366b424f03adde1e0698b8b31f", "placeholder": "​", "style": "IPY_MODEL_aa1f805540a74c7380bd2b333b9ecc88", "value": " 422/422 [00:01<00:00, 308.54it/s]" } }, "4b2f4fa05e7a465eacf809489243b2a8": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_e18cf1aef5834391ae7410dcb90f1c59", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_df732c32eb1340a890c181eed7358452", "value": 422 } }, "4b433703db1a41baa3e7e9f45d72aa57": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "4bccad99024f4d77a23b657d9dc7746d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "4c60aa21f05a4d678b2135d4d1f2c99a": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "4c61f8b9314c4bec8a0c3a5ecab3356d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "4c6f9216f6b14905bbfeffd81e14c973": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "4e2c73f549d94202a34b4a1046d011e5": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_8c10956546bd46cc94c322044b217a1a", "IPY_MODEL_cfa1762b9dd740f39d4dc3f198abdcc6" ], "layout": "IPY_MODEL_847aaa75aecc40f3bc9d67c37cf03362" } }, "4f27062765bd41f589215a61e2d0840a": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_3edb84e7ef724a1887df6dcf31f75448", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_95f5d01ae2524dd2bcfab4945816b6a4", "value": 422 } }, "4faac8b7bdd748a7b908d46ed058aa3a": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_8584d1e513e7496192af75d2cf4f84c0", "IPY_MODEL_943c772ee3fe43cea3d05cea3f7f12bb" ], "layout": "IPY_MODEL_995ac4803a534d0883a15702eae4fc50" } }, "501c6677916d40f9afaea8f48be244fe": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "50b4abff394846eabd6f6fdcac8a7762": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "50d48e02aa744ad8adbccce94148b060": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "50ded217cb2440249cd86a4dcc0e1b7a": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_009991c634044a2c8dfb58aa7da342a6", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_987b752181564435ab5a7f8d838651f5", "value": 422 } }, "53065cc4a41d4652bfb986ae1d28ce9b": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_b7740ddd81034150bca1bf841f43af31", "IPY_MODEL_c330191809e44832a89abcc6c4a6fd5d" ], "layout": "IPY_MODEL_5cc3f44e4660481d920e9120fd0d254a" } }, "550caabed61042e1b89dd8a826897b77": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "565b64b2df2f4342bdb56ad34b468de2": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_6699fda35d5b495da6052e53f4e24a01", "IPY_MODEL_649359bad86d415094308180006a0e11" ], "layout": "IPY_MODEL_08b6e41233db46a6911d22fe531832f5" } }, "570de138283348be9b7575b51df33eea": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "583c6058061240838ad63f2a8ddf9a00": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "583d96a84b3642f4b864c7ae7ab6f598": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_5978e50fc32f4fe1ab99fbfc42e87c89", "placeholder": "​", "style": "IPY_MODEL_ee11cbb4ec3d4042b6c62536a477c10a", "value": " 422/422 [00:01<00:00, 314.30it/s]" } }, "584cadfb0a6c480f94aad4b9842c4d25": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_490a7c3043e24e378892816de13970eb", "placeholder": "​", "style": "IPY_MODEL_a991cedbd4b24c139430a06369ad527f", "value": " 422/422 [00:01<00:00, 310.32it/s]" } }, "591e3bae35404f68b24f607ece97a9d3": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "594aebcc9478429d9a5063327c9953bc": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "5978e50fc32f4fe1ab99fbfc42e87c89": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "5ac7bb8fbf0048c492fc4f6c8b69d828": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_fdd481739b6a4d64ac739965c621d3b8", "placeholder": "​", "style": "IPY_MODEL_2c6a4ebe2c914b028062eb3651de99e3", "value": " 422/422 [00:01<00:00, 311.10it/s]" } }, "5ac87cfe946d483b8088df90b22490d8": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "5bd005f55b724af4893bb2d0718d9408": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_4005b0b6131a400e927343af9a20e154", "IPY_MODEL_87a3fcd0fd8d4df1b885b1e106d085a8" ], "layout": "IPY_MODEL_2e5a7bb281d840e6a4522a4dc602fd80" } }, "5bfe581cc5db4002b38c89df6b245720": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "5c5c9d38d86c4d2486c547a3add4a04c": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_ceefe7af1738490d9414c6c690eb4681", "placeholder": "​", "style": "IPY_MODEL_eb2cfbd11882434e9373f36d62d06258", "value": " 422/422 [00:01<00:00, 307.38it/s]" } }, "5c9d8559f7134842ab00b99d28bfd644": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "5cc3f44e4660481d920e9120fd0d254a": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "5d84a716b7ed4ad8927ee8ea8493e4db": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "5eb4571729ea4b92857d3ba3c575721a": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "5edf3c8cd0f64046ac298d48a93ef32e": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "5ee467d84bd24e5db0507a994273ea28": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "5fe58d7f655243c8b9d29f31a0eb7b53": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "608cfc45e4ec4579b75999043e62ab19": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "61540f7e300545eebbd697227a3b3d7d": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_d74548d2826c45cba4e730b3a9638fd4", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_a08bba98a4994866949e19f6104e6991", "value": 422 } }, "630b657a06384d7abd3b63bcf02c3a3e": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_f7dd4ce672014ce6ba3d7d50ff090c9e", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_88a24010610d4a19a3fb81eddfcfaf52", "value": 422 } }, "637ac772584f4f169d59c0964be8acfd": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_e32b04ebb4454ca2848b799045c30320", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_fe0223b47b9346e7ad056b86841f91d9", "value": 422 } }, "6485d6b9b194425f8eb28b779d7d6e9a": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "649359bad86d415094308180006a0e11": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_a13d290a9ddf41deb2f258c617dfd2e3", "placeholder": "​", "style": "IPY_MODEL_c1a8a841a5124a6eb364863a2fc11447", "value": " 422/422 [00:01<00:00, 315.93it/s]" } }, "64cc1e2f91a44b218a7824aedd373b31": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "6565004456e24a88a2e1e04ebe7004df": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "65729f9c7457426eb006da855388182b": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "662835d152984f4eb87fa7cef0c0e28d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "6699fda35d5b495da6052e53f4e24a01": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_afe82cf54da249cb815dc3ece7bac260", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_f82fd9ccee6b423c8bdbc830ba0f8a93", "value": 422 } }, "66fc9d3aad8f478c8884e74990c9f2f9": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "6790ba4beb8a4bae8f9a14f0cca3b5c9": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_21f755e5d9774eb3aab7604140054a6d", "placeholder": "​", "style": "IPY_MODEL_f55d98fcc3524d94ba73b3192ee19281", "value": " 422/422 [00:04<00:00, 104.34it/s]" } }, "68b365d2d435430aae5af88ecdae39a5": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "69f5f6ef84e44fc284dd9be06beaaf65": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "6ae1111eff4043f294a7bbafcb5de189": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_f3abedf22ff649b4b90e85fc68f93c67", "IPY_MODEL_d4f5f106a2ed488fbba2b626bbd72714" ], "layout": "IPY_MODEL_0443d3d3c8564616a9cae2616c370a72" } }, "6b3e7a3ba015416cada97bb79d4c8fb1": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_0a9276f6ae784e63a6daaecdd2bc7e64", "IPY_MODEL_0046f7bffaa6438d8cf31a0d558c4b46" ], "layout": "IPY_MODEL_a780eb0b79ff40e9966a72a3c5a81eca" } }, "6b89100361a443bd85a01f8e47374c96": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "6bc78efbc98a4cb5ad04647f893e2f1a": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "6cba2abf076d483ba8847ccbcf537c52": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "6d23bd6b099746028b353af12380d226": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "6da928e744da4d0bb1cbb1df33c201ee": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "6db4cb7968194992819296b341c378f1": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "6e396b43955349b28a280ccb1d41c716": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_2e78f48b6298490885474f27bcbf2928", "placeholder": "​", "style": "IPY_MODEL_501c6677916d40f9afaea8f48be244fe", "value": " 422/422 [00:01<00:00, 300.05it/s]" } }, "6f2523ef7d0243b38975e5b657b43dd9": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "6f8967c159b1474ab706026b6becd9a1": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_017d16a6d32b4d6a9f868a57cd736568", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_6da928e744da4d0bb1cbb1df33c201ee", "value": 422 } }, "7048d397ed0647a19587c17deec944bb": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_a4823e3708aa4ccba43e3547a229095e", "placeholder": "​", "style": "IPY_MODEL_32272e5a9e194bed9ffe5f16a3ae1d61", "value": " 422/422 [00:01<00:00, 309.82it/s]" } }, "70537ee37fd645c8ba0d3e88fc43fdb5": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "70898e759e6945a1a479dcb2d434b50d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "70bb47f183e24e7c805d8b5e89ce1b3e": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_c2b02e00355041919382a3c23c0d6850", "IPY_MODEL_6e396b43955349b28a280ccb1d41c716" ], "layout": "IPY_MODEL_838598dc75fb4836b3f4d769d68de597" } }, "71522233b5b64b3dbd29ec69e47788d8": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "7326a18ab885419691c5bfc3666154bc": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "732824b0216e44f7a88da251febff435": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_b91537eaa9ba44f8952cb65696d236fe", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_40b7a89564684301ae357cae6c517be4", "value": 422 } }, "734031c5bb6e4e7d9e30f1a15861924f": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_8a0e36efabb04f869ba2c080446525da", "placeholder": "​", "style": "IPY_MODEL_34237141f8854d33af9223e75e390ba5", "value": " 422/422 [00:01<00:00, 304.14it/s]" } }, "7411b7336cab4e8f92347df274e93876": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "74632c71eef34180a7dba0c22fd9df80": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "759a4d04fe92425ab0d6d8681d3ed0c6": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "76c193b0729b4a57b1664a94163bb38a": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "77325a33c7b6495e9301c771dbf935de": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "773cbd3194e142c694f73fd52ee6aa8c": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "79574d891d35493da77efbbad6fff11f": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_989fb7b65c504a1aad8ec0f53e2e43c3", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_3563f3d4033b4ac7b43279cf13d8bdd2", "value": 422 } }, "79c6ecc409764fc78294fcbd9319c3c0": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "7ae0b9e9e6964641a7d529b03d60b034": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_84fb3096f29f40bf9f4d20bca7608c05", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_05de1b15d6244f82bcef782c8f73f8a8", "value": 422 } }, "7aebabcd7cd546e989eb0c148ebb1348": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "7b5bf62263a64441b7424aab153415be": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_d1758fb53b404e3f9b8f317be75684b4", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_7eb7725598674b13b049a370bb505ea7", "value": 422 } }, "7e44024663ce4bd4833c4dcdf2d63d14": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "7e569ac0f5974f4aaed7cf2e953bc316": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "7e91135b95964e35a11bd312983f31c3": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "7eb7725598674b13b049a370bb505ea7": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "7ed4511c19b24c7fadf283d962a612a2": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_4b2f4fa05e7a465eacf809489243b2a8", "IPY_MODEL_a3426fcb07904ca4be130a71b330c77a" ], "layout": "IPY_MODEL_7e44024663ce4bd4833c4dcdf2d63d14" } }, "7f3517a0116846708d65a947e534de05": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_ca4f1e1dbbbd46618b40291f94ef1102", "IPY_MODEL_3ab377ee24544e2a95433448a8331ed1" ], "layout": "IPY_MODEL_2fa0fd59f8844a4e99eda19fc4151962" } }, "7f60da0694d343fca576f9cfaf7352ac": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_db3333497eba4ee1a63225b4c6bf468c", "placeholder": "​", "style": "IPY_MODEL_ea6cbc2071af4c018f96e5846f328a1f", "value": " 422/422 [00:01<00:00, 308.78it/s]" } }, "7fcc9f928ddd4f52a9d420862b9be6ef": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "80016285573540f998aeec24132c0bb3": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_265c8c05122c406fa6b603070e2ca7bd", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_ebfa4d5418d84b3ea8fad62dfabce7c1", "value": 422 } }, "80538e2ccd7f490987a79d4c70c9571b": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_d17516de5c52450abfd79af7db04a282", "IPY_MODEL_584cadfb0a6c480f94aad4b9842c4d25" ], "layout": "IPY_MODEL_50b4abff394846eabd6f6fdcac8a7762" } }, "81a8b3ff6d644f2c83f04a835bef5333": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "82076a20084549719b917b071d1d1b91": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "829ad0cbf2bb49d9bde04dcff1f9cb3c": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "838598dc75fb4836b3f4d769d68de597": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8404870254bf4dfa80ce1a11acaa5969": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "847aaa75aecc40f3bc9d67c37cf03362": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "84ddb87806a94da8902e3da8a06aa7e5": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "84fb3096f29f40bf9f4d20bca7608c05": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8584d1e513e7496192af75d2cf4f84c0": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_dbd113a86ad44f0b95261ed9f6e6c93c", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_74632c71eef34180a7dba0c22fd9df80", "value": 422 } }, "85e62f6e0211431a9f6513285ef1aa0b": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "8619ba70e84f4bda9d5c966863d0d4e3": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_977ab80b593849389b224d18aefb6814", "IPY_MODEL_d62d3423df7f49d18b45bb87e9919ade" ], "layout": "IPY_MODEL_0c037dcc8bbb4f38977b3e516d3a2014" } }, "861a02913c8346f2a2c7c7c049364acd": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "86c4306d45c04ce783d40f202c30c350": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_6f8967c159b1474ab706026b6becd9a1", "IPY_MODEL_5c5c9d38d86c4d2486c547a3add4a04c" ], "layout": "IPY_MODEL_2be93e1e76224f61afd058eea4583a05" } }, "86ea34c601f447f18eaaf30fd1711f77": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "877c9e4a3541425eac50c9250e5ff568": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "87a3fcd0fd8d4df1b885b1e106d085a8": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_7e91135b95964e35a11bd312983f31c3", "placeholder": "​", "style": "IPY_MODEL_7411b7336cab4e8f92347df274e93876", "value": " 422/422 [00:04<00:00, 102.91it/s]" } }, "880dce5bac5148988119a4c0f7296c83": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_c2fa2316330f4edc83a8e3e4de571cf3", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_6cba2abf076d483ba8847ccbcf537c52", "value": 422 } }, "88a24010610d4a19a3fb81eddfcfaf52": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "8a0e36efabb04f869ba2c080446525da": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8a25115e9fef433e90b70e1ff3bbe341": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8b296000cd0446e2952bff859b785260": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_26fa7101f97f4aed98a774c83e802bc9", "IPY_MODEL_3a4fc2bfed8549d980a4884715d9c650" ], "layout": "IPY_MODEL_f6f53ccede894d5fa859543bcd5d07a1" } }, "8b2e77ece9f14c37ad8efab38442acbb": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8c10956546bd46cc94c322044b217a1a": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_77325a33c7b6495e9301c771dbf935de", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_5edf3c8cd0f64046ac298d48a93ef32e", "value": 422 } }, "8c639957ced245318db4865da9e0c1df": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_7b5bf62263a64441b7424aab153415be", "IPY_MODEL_370044cae56f42fd992e4c4ce3240f68" ], "layout": "IPY_MODEL_0cdbaa847609462aa3163c49db61a7cd" } }, "8d73c0c46c944eb89e95a9efb0a891a6": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_2c303e0697ec4cca9e949207f89d7695", "placeholder": "​", "style": "IPY_MODEL_cf424d3cddcb4e469f4c88d1df70dedb", "value": " 422/422 [00:01<00:00, 311.63it/s]" } }, "8dde5fd1fe4347c7bea1c51c47b14e5e": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "8f521dc0bd094a3da7cffd4da51ce7e0": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8ff0e222da2b47d99e8931080555cb7e": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "9024d8c79164492e80170ca565f2e367": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "92ae4ede68904e2f8b0b2322f099d32b": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "943c772ee3fe43cea3d05cea3f7f12bb": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_f4fd9c138d8c4192afdb4324afe46771", "placeholder": "​", "style": "IPY_MODEL_054a82c3f2dc4de9864b83dcd1a2abd8", "value": " 422/422 [00:04<00:00, 101.82it/s]" } }, "95f5d01ae2524dd2bcfab4945816b6a4": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "96e832df4dec40d9a97bd129ef55effa": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "973c950b92d14614a5df848d2a8c024e": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_637ac772584f4f169d59c0964be8acfd", "IPY_MODEL_dd2ea7e5c59f4a3a807a7f8048eafb1e" ], "layout": "IPY_MODEL_a702297c0c7e40b08546a7669dfb6917" } }, "977ab80b593849389b224d18aefb6814": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_a859b046e9e84f518b8c4aa449fb75cc", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_473ece24383049f6964082046f5a8cef", "value": 422 } }, "97e1cf826ec54af79646bee305e23601": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_1c2657c607454a0eb329ae8663665e82", "IPY_MODEL_1c4cfdd4f52a4db182cd08357b3d3abe" ], "layout": "IPY_MODEL_c8de4a1a7be449e68787a4dcdc94801d" } }, "987b752181564435ab5a7f8d838651f5": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "989fb7b65c504a1aad8ec0f53e2e43c3": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "995ac4803a534d0883a15702eae4fc50": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "99c3aedf530c44d69f3c145efc7da6da": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_9024d8c79164492e80170ca565f2e367", "placeholder": "​", "style": "IPY_MODEL_199cccb400aa4fc59a1f95317db0ae2b", "value": " 422/422 [00:01<00:00, 307.88it/s]" } }, "99fd455414304cb5a2a08077c2182452": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_449ba373a94641f2ac9078d8f98c3f1a", "IPY_MODEL_fa591816c3414db3a7dc1478649ac230" ], "layout": "IPY_MODEL_65729f9c7457426eb006da855388182b" } }, "9b16033c7b7a47568a0d078d708cf28d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "9bc1cd208dfd4a55bd52a4d0f399117c": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "9bce5f414ec043509c06f10840cc2d0f": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_50ded217cb2440249cd86a4dcc0e1b7a", "IPY_MODEL_e1229e07527b4a67bb7de71715ed10ca" ], "layout": "IPY_MODEL_47fd69df905945a09183f89126c665f0" } }, "9bf763a02b58454ab1e4f9598939fd79": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_e0077b7268614d85b4a08ad07183a2e4", "placeholder": "​", "style": "IPY_MODEL_407a6771394a4e69a504ea5b67164a64", "value": " 422/422 [00:01<00:00, 302.85it/s]" } }, "9c7baaf83e734b86b2234c735dca859d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "9e2a1ec730be42d38a3f04b967ed0b88": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "9f6277814410407fae19e3aee971c997": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "a08bba98a4994866949e19f6104e6991": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "a0b0dd366b424f03adde1e0698b8b31f": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a13d290a9ddf41deb2f258c617dfd2e3": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a16d1171acfe48b5abfd3652d0cf119f": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a183401dedf140979852bfc28122d689": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "a21851e9b7b24098b3fbbe6d9f1f8e9c": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "a27c932db2c84a86a75a92af92a07f0b": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_8b2e77ece9f14c37ad8efab38442acbb", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_a183401dedf140979852bfc28122d689", "value": 422 } }, "a3426fcb07904ca4be130a71b330c77a": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_8a25115e9fef433e90b70e1ff3bbe341", "placeholder": "​", "style": "IPY_MODEL_759a4d04fe92425ab0d6d8681d3ed0c6", "value": " 422/422 [00:04<00:00, 99.10it/s]" } }, "a4823e3708aa4ccba43e3547a229095e": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a5ac2b15a8ae40ce92160a960414279c": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_43b0d557889248f287edd4edf50e3a9b", "IPY_MODEL_99c3aedf530c44d69f3c145efc7da6da" ], "layout": "IPY_MODEL_b52a071acc34438d849dbc7adcc91631" } }, "a63ede007e94496c884527478a9b0d17": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a702297c0c7e40b08546a7669dfb6917": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a73abf53972a4913bf2c50b0d341fc13": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a780eb0b79ff40e9966a72a3c5a81eca": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a859b046e9e84f518b8c4aa449fb75cc": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a887772c5344437aa896b3ed1bd5208f": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_e53b1041df93415c9852da6d8a05b7d3", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_e5caa26da44e411f891a71b85c46c87a", "value": 422 } }, "a991cedbd4b24c139430a06369ad527f": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "aa1f805540a74c7380bd2b333b9ecc88": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "aa3e1f1cf64a47af9aa0930b855c14bc": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_27ca20cabb94467492f29713fad334dd", "placeholder": "​", "style": "IPY_MODEL_550caabed61042e1b89dd8a826897b77", "value": " 422/422 [00:01<00:00, 304.47it/s]" } }, "aa7c50235a9f43fa96a7d9ef7be20861": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "aa86d75f3dba49a481c2c15167387b99": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_49bbc050955c4ddd931efc9a468faccb", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_82076a20084549719b917b071d1d1b91", "value": 422 } }, "ab756a05d67241baabcb4ee84b35efe3": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_de806eb1cca0447c92917881ec18d49a", "IPY_MODEL_00a9eda2268e47baaae96926bb7d8c51" ], "layout": "IPY_MODEL_9b16033c7b7a47568a0d078d708cf28d" } }, "ab99a2cf8919454bb780cc24088f2b85": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_fddd7fb9ef3f4535a97775548abbabd1", "IPY_MODEL_fa68877e48ab41a48a3c10dc3fe329d1" ], "layout": "IPY_MODEL_9c7baaf83e734b86b2234c735dca859d" } }, "ac609c059aac45bba0ea7ee76e057977": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_318b1b7bb5064c5aabd39540bf2d7bf2", "placeholder": "​", "style": "IPY_MODEL_fdd43b573d18496a9eec5f61632b33ed", "value": " 422/422 [00:01<00:00, 315.84it/s]" } }, "ad1659c9381a4afca67aac81d1470776": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_191e3c3e02b44eda9ebe4859325830e5", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_f0c3740bcfb04fa6a12e1f1025aff42f", "value": 422 } }, "ad58dbfc6a294f3f9dc89c4a3f9658dc": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_0eea906841464f978a262640badc0fae", "IPY_MODEL_11daf0a19032495ab15cdda96b0030e7" ], "layout": "IPY_MODEL_8f521dc0bd094a3da7cffd4da51ce7e0" } }, "ae7ec72f5d064a6a80433613be03f849": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "af32974b6ed54e9da7b89fe35a749640": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "afe82cf54da249cb815dc3ece7bac260": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b1548f9f9f4642ef814e9d3565002501": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b31897c725c946e8a08a2ef0e80b6520": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b32999bf8b8148e98bbbb6ba1acb4548": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b34c1730161e41c5bb901128ccb4ff65": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b3664609744546988f30152c49d02ac8": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_247a4869ae564aefa501053956083a6a", "IPY_MODEL_5ac7bb8fbf0048c492fc4f6c8b69d828" ], "layout": "IPY_MODEL_3e395e497d8f4f10812b2af65ccac13b" } }, "b3f89680663b466f9dda719fa6843707": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b4979a909ae64f48888d2383285f4f68": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b50ff7a73c0f4a6da93443ca019ba785": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_e2a09b4280db464f863a1ae66d58ea02", "IPY_MODEL_7f60da0694d343fca576f9cfaf7352ac" ], "layout": "IPY_MODEL_0a9b4f19291b403dadeca3938004561e" } }, "b52a071acc34438d849dbc7adcc91631": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b668e892e9cb4571b173390e78d8d786": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_79574d891d35493da77efbbad6fff11f", "IPY_MODEL_583d96a84b3642f4b864c7ae7ab6f598" ], "layout": "IPY_MODEL_7e569ac0f5974f4aaed7cf2e953bc316" } }, "b7341f8df10a4e1ab8c3cbb475de0d82": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "b7740ddd81034150bca1bf841f43af31": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_583c6058061240838ad63f2a8ddf9a00", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_9e2a1ec730be42d38a3f04b967ed0b88", "value": 422 } }, "b775d1f8fbae434185d52dafd207b592": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "b826f8a9468d4c23b35f6021791885b6": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "b875c88f7ae74f8391ac58fc31a3aabc": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "b91537eaa9ba44f8952cb65696d236fe": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b9862082c1cf47d1bb6057537571499d": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "b9db25806c4a410db0004f77a1acaee5": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "bce5275ceea044c3ba0f1635b0657ac4": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_1017871f46b44c9cb3f976d1af607ffc", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_caff75ab1b874f9da109674579faadf3", "value": 422 } }, "c0db04b51d0c4e9e9081c0169cca1f4e": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_80016285573540f998aeec24132c0bb3", "IPY_MODEL_f999eff152854b6da98defded43c8818" ], "layout": "IPY_MODEL_cb35834c71e24301abd3574d82e017b9" } }, "c1a8a841a5124a6eb364863a2fc11447": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "c2b02e00355041919382a3c23c0d6850": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_1480b195483d454c844c9e6a724b02b3", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_9f6277814410407fae19e3aee971c997", "value": 422 } }, "c2fa2316330f4edc83a8e3e4de571cf3": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "c330191809e44832a89abcc6c4a6fd5d": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_110f5508e00e4ec6b5c84877abc9c265", "placeholder": "​", "style": "IPY_MODEL_e731309213c94e92be1a389d13a190f5", "value": " 422/422 [00:01<00:00, 314.36it/s]" } }, "c5b2f89f03264317aa734883c164cabb": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_b31897c725c946e8a08a2ef0e80b6520", "placeholder": "​", "style": "IPY_MODEL_79c6ecc409764fc78294fcbd9319c3c0", "value": " 422/422 [00:01<00:00, 305.91it/s]" } }, "c808822cdef941a3879bf1cc2b32720a": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_570de138283348be9b7575b51df33eea", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_c8967d63161647d4a9e778765d3e7ac2", "value": 422 } }, "c8967d63161647d4a9e778765d3e7ac2": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "c8de4a1a7be449e68787a4dcdc94801d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "c918030a689a4842b727d9b7ecbe39ae": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "c9892de0df614a84b8ba7a6e259ffe09": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_86ea34c601f447f18eaaf30fd1711f77", "placeholder": "​", "style": "IPY_MODEL_fac6ce9bd41f43f9821f45741359f5f4", "value": " 422/422 [00:04<00:00, 101.74it/s]" } }, "c99185c8dfbe47aab9e29a90b92c63a0": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_1687134f713c4c039365c0a66d1aab82", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_0829771aa327491e8b7d05ef2b084175", "value": 422 } }, "ca1968d9a9f7462e88c9a051cb7a6777": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "ca4f1e1dbbbd46618b40291f94ef1102": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_b1548f9f9f4642ef814e9d3565002501", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_5fe58d7f655243c8b9d29f31a0eb7b53", "value": 422 } }, "caff75ab1b874f9da109674579faadf3": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "cb24ce5968194d92bf77463a59eea46b": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_aa86d75f3dba49a481c2c15167387b99", "IPY_MODEL_e83ab25fcda94a90bdd58143c3624263" ], "layout": "IPY_MODEL_5bfe581cc5db4002b38c89df6b245720" } }, "cb35834c71e24301abd3574d82e017b9": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "cc7f3e43ff504effb6fcbd63bac5546f": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "cd54b80e170c4a6c94fe419c2cf8bcd6": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_4c60aa21f05a4d678b2135d4d1f2c99a", "placeholder": "​", "style": "IPY_MODEL_81a8b3ff6d644f2c83f04a835bef5333", "value": " 422/422 [00:04<00:00, 36.83it/s]" } }, "ce87dfd22b554e0a83b264913f7156c6": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "ceefe7af1738490d9414c6c690eb4681": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "cf424d3cddcb4e469f4c88d1df70dedb": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "cfa1762b9dd740f39d4dc3f198abdcc6": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_2eb23201ad354f3ba8a0720757d4d8bd", "placeholder": "​", "style": "IPY_MODEL_ce87dfd22b554e0a83b264913f7156c6", "value": " 422/422 [00:01<00:00, 303.83it/s]" } }, "d17516de5c52450abfd79af7db04a282": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_3c80e2934eda4d19825a76c6400a3823", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_22a455a7b3f841a9b01bc83dee7717cc", "value": 422 } }, "d1758fb53b404e3f9b8f317be75684b4": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "d23105e4cc4141b5937063dc03e9d565": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "d266fcfaaa9741b1a4be560f094ac1d2": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_71522233b5b64b3dbd29ec69e47788d8", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_db2b8e98efcd4a7599b7bbd57c55e70c", "value": 422 } }, "d4f5f106a2ed488fbba2b626bbd72714": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_ebebf706cc9549d9803b796ea2ef2853", "placeholder": "​", "style": "IPY_MODEL_b9862082c1cf47d1bb6057537571499d", "value": " 422/422 [00:01<00:00, 312.14it/s]" } }, "d62d3423df7f49d18b45bb87e9919ade": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_b3f89680663b466f9dda719fa6843707", "placeholder": "​", "style": "IPY_MODEL_50d48e02aa744ad8adbccce94148b060", "value": " 422/422 [00:01<00:00, 298.70it/s]" } }, "d64df8ba0ab04aad9e1c2c4551a0b7d9": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "d673cd4b0e384aee988f565ab73cb022": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "d6f5cf60a40c4825bfca5a960056d078": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "d74548d2826c45cba4e730b3a9638fd4": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "d7d3d6ec8a144738b61b59e8e1d37f1e": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "d904c7aebabb477a99f41e95f1b0b9cf": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "d98b018eb67447eca644cd5fa56f2723": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_a887772c5344437aa896b3ed1bd5208f", "IPY_MODEL_734031c5bb6e4e7d9e30f1a15861924f" ], "layout": "IPY_MODEL_8ff0e222da2b47d99e8931080555cb7e" } }, "d9ba3c88398d4e12a674eca10a8633ff": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_d266fcfaaa9741b1a4be560f094ac1d2", "IPY_MODEL_cd54b80e170c4a6c94fe419c2cf8bcd6" ], "layout": "IPY_MODEL_2637352462d94fe795a409fbbbe70926" } }, "db1b1bff50974cd0823dcccecd2ae1c4": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_e47127013eaa48979dc86657839ba227", "IPY_MODEL_eb6a91e79a1b4998bc2751d3e572b05f" ], "layout": "IPY_MODEL_fad451dd3ae040a8aede364098400642" } }, "db2b8e98efcd4a7599b7bbd57c55e70c": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "db3333497eba4ee1a63225b4c6bf468c": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "db4cab1a1150482c861e22d6e7b2be09": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "dba0b00af12d410cb8dfd4be838b173a": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_bce5275ceea044c3ba0f1635b0657ac4", "IPY_MODEL_7048d397ed0647a19587c17deec944bb" ], "layout": "IPY_MODEL_b34c1730161e41c5bb901128ccb4ff65" } }, "dbd113a86ad44f0b95261ed9f6e6c93c": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "dc4f419827134de0b96b9b020fa8a788": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "dd2ea7e5c59f4a3a807a7f8048eafb1e": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_69f5f6ef84e44fc284dd9be06beaaf65", "placeholder": "​", "style": "IPY_MODEL_608cfc45e4ec4579b75999043e62ab19", "value": " 422/422 [00:01<00:00, 301.40it/s]" } }, "dd43258264da429a9aeb315f1715b7db": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_4bccad99024f4d77a23b657d9dc7746d", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_861a02913c8346f2a2c7c7c049364acd", "value": 422 } }, "dd52397ee21b49f999121fb8a62ea4bf": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "de11572a1baa4efabaa5c1436af92f06": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "de806eb1cca0447c92917881ec18d49a": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_e9c21ca7465449d3a8930234e9ed8dcf", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_64cc1e2f91a44b218a7824aedd373b31", "value": 422 } }, "df732c32eb1340a890c181eed7358452": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "df901f8348654af087a63b43ec822b9e": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_3fb34090b5b34d6fa8f039440e839fbd", "IPY_MODEL_46796020aa1145fc87c7f458ee41e14e" ], "layout": "IPY_MODEL_dffdd7d2ddf24707a1b2fb0df00cf957" } }, "dffdd7d2ddf24707a1b2fb0df00cf957": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "e0077b7268614d85b4a08ad07183a2e4": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "e1229e07527b4a67bb7de71715ed10ca": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_6bc78efbc98a4cb5ad04647f893e2f1a", "placeholder": "​", "style": "IPY_MODEL_5ee467d84bd24e5db0507a994273ea28", "value": " 422/422 [00:01<00:00, 213.42it/s]" } }, "e18cf1aef5834391ae7410dcb90f1c59": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "e28f8422f22b4ef29ec9f6cffe959ecd": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_dd43258264da429a9aeb315f1715b7db", "IPY_MODEL_43d68f9905354442bad801fb61bfd02a" ], "layout": "IPY_MODEL_03edea4af2724453bfbb6b8e2e74cda2" } }, "e2a09b4280db464f863a1ae66d58ea02": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_5d84a716b7ed4ad8927ee8ea8493e4db", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_5ac87cfe946d483b8088df90b22490d8", "value": 422 } }, "e32b04ebb4454ca2848b799045c30320": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "e3ddfbf3678a41ab9926976cf1beee85": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_7ae0b9e9e6964641a7d529b03d60b034", "IPY_MODEL_4a9b8833512a4f07a4411b1e8c2ca0c8" ], "layout": "IPY_MODEL_a16d1171acfe48b5abfd3652d0cf119f" } }, "e47127013eaa48979dc86657839ba227": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_ff6267b3dd63479a8e260848a30709a8", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_0b62d25712a2403ab488914a7109ab47", "value": 422 } }, "e4e73b9dcadd4bacb50d03152e7d81e8": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_6485d6b9b194425f8eb28b779d7d6e9a", "placeholder": "​", "style": "IPY_MODEL_6b89100361a443bd85a01f8e47374c96", "value": " 422/422 [00:04<00:00, 95.15it/s]" } }, "e53b1041df93415c9852da6d8a05b7d3": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "e567c933e82146758cb690a190f1199c": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "e5caa26da44e411f891a71b85c46c87a": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "e6b70306bfea4bd09f17eac179387a96": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "e731309213c94e92be1a389d13a190f5": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "e82d78f382b343c384bb7895daa18c82": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "e83ab25fcda94a90bdd58143c3624263": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_5eb4571729ea4b92857d3ba3c575721a", "placeholder": "​", "style": "IPY_MODEL_ae7ec72f5d064a6a80433613be03f849", "value": " 422/422 [00:01<00:00, 294.05it/s]" } }, "e9228023d62243569a1e2e06a1cf94b5": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_c808822cdef941a3879bf1cc2b32720a", "IPY_MODEL_e4e73b9dcadd4bacb50d03152e7d81e8" ], "layout": "IPY_MODEL_f08fd096dcb743faafc6dbc604b45989" } }, "e9c21ca7465449d3a8930234e9ed8dcf": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "ea6cbc2071af4c018f96e5846f328a1f": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "eaa7c96f7ee849948f10033289dfbd05": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "eac2608b4c0e4ad9ac81838ad7d68657": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "eb2cfbd11882434e9373f36d62d06258": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "eb6a91e79a1b4998bc2751d3e572b05f": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_8404870254bf4dfa80ce1a11acaa5969", "placeholder": "​", "style": "IPY_MODEL_dd52397ee21b49f999121fb8a62ea4bf", "value": " 422/422 [00:04<00:00, 98.38it/s]" } }, "ebebf706cc9549d9803b796ea2ef2853": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "ebfa4d5418d84b3ea8fad62dfabce7c1": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "ee11cbb4ec3d4042b6c62536a477c10a": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "ef3638ddf37547fe8359b8f4333dc2e8": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "efb84c9861764c61b09ad02f170d8530": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "f08fd096dcb743faafc6dbc604b45989": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "f0c3740bcfb04fa6a12e1f1025aff42f": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "f160728d6cfc4cd380fafce5b253d2c7": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_0b2d03b2d0f6447293576ff8e9ed9ea3", "IPY_MODEL_f839ef53446f4fa9834edc8da44f1327" ], "layout": "IPY_MODEL_b9db25806c4a410db0004f77a1acaee5" } }, "f3abedf22ff649b4b90e85fc68f93c67": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_e82d78f382b343c384bb7895daa18c82", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_d904c7aebabb477a99f41e95f1b0b9cf", "value": 422 } }, "f4fd9c138d8c4192afdb4324afe46771": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "f55d98fcc3524d94ba73b3192ee19281": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "f5f4c5a71a9c41f88fafc9abea500f14": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_eac2608b4c0e4ad9ac81838ad7d68657", "placeholder": "​", "style": "IPY_MODEL_c918030a689a4842b727d9b7ecbe39ae", "value": " 422/422 [00:01<00:00, 313.61it/s]" } }, "f6f53ccede894d5fa859543bcd5d07a1": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "f7dd4ce672014ce6ba3d7d50ff090c9e": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "f82fd9ccee6b423c8bdbc830ba0f8a93": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "f839ef53446f4fa9834edc8da44f1327": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_0459c93679e54f9db4e7009420b8a612", "placeholder": "​", "style": "IPY_MODEL_68b365d2d435430aae5af88ecdae39a5", "value": " 422/422 [00:01<00:00, 292.61it/s]" } }, "f8c7cd8112274e26996a56ecae42ec3f": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "f999eff152854b6da98defded43c8818": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_92ae4ede68904e2f8b0b2322f099d32b", "placeholder": "​", "style": "IPY_MODEL_85e62f6e0211431a9f6513285ef1aa0b", "value": " 422/422 [00:01<00:00, 309.42it/s]" } }, "fa591816c3414db3a7dc1478649ac230": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_829ad0cbf2bb49d9bde04dcff1f9cb3c", "placeholder": "​", "style": "IPY_MODEL_d673cd4b0e384aee988f565ab73cb022", "value": " 422/422 [00:01<00:00, 311.00it/s]" } }, "fa68877e48ab41a48a3c10dc3fe329d1": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_3e448a3c76bc4fdfa57f82327411f2e2", "placeholder": "​", "style": "IPY_MODEL_96e832df4dec40d9a97bd129ef55effa", "value": " 422/422 [00:01<00:00, 317.23it/s]" } }, "faa57a96c1e7416fa9a9a41b5bc6e308": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_732824b0216e44f7a88da251febff435", "IPY_MODEL_c5b2f89f03264317aa734883c164cabb" ], "layout": "IPY_MODEL_b4979a909ae64f48888d2383285f4f68" } }, "fac6ce9bd41f43f9821f45741359f5f4": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "fad451dd3ae040a8aede364098400642": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "fc6d6eef364446c3b54b68c5c4c1cb1b": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_1de0cf05f59b49eb8f8d233b9a4e490e", "IPY_MODEL_9bf763a02b58454ab1e4f9598939fd79" ], "layout": "IPY_MODEL_662835d152984f4eb87fa7cef0c0e28d" } }, "fce1dcea8fd749569b29e353a086ad45": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "fdd43b573d18496a9eec5f61632b33ed": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "fdd481739b6a4d64ac739965c621d3b8": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "fddd7fb9ef3f4535a97775548abbabd1": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "", "description": "100%", "description_tooltip": null, "layout": "IPY_MODEL_3f0d72d9c4984f89a82862fcdd24643b", "max": 422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_32ff8a0bfbcb44ebb0c80363f6115e07", "value": 422 } }, "fe0223b47b9346e7ad056b86841f91d9": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "ff6267b3dd63479a8e260848a30709a8": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } } } } }, "nbformat": 4, "nbformat_minor": 1 } thinc-release-v9.1.1/examples/01_intro_model_definition_methods.ipynb000066400000000000000000000314351467064331700261030ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Intro to Thinc's `Model` class, model definition and methods\n", "\n", "Thinc follows a functional-programming approach to model definition. Its approach is especially effective for **complicated network architectures**, and use cases where different data types need to be passed through the network to reach specific subcomponents. This notebook shows how to compose Thinc models and how to use the `Model` class and its methods." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install \"thinc>=8.0.0\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Thinc provides a variety of [layers](https://thinc.ai/docs/api-layers), functions that create `Model` instances. Thinc tries to avoid inheritance, preferring function composition. The `Linear` function gives you a model that computes `Y = X @ W.T + b` (the function is defined in `thinc.layers.linear.forward`)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy\n", "from thinc.api import Linear, zero_init\n", "\n", "n_in = numpy.zeros((128, 16), dtype=\"f\")\n", "n_out = numpy.zeros((128, 10), dtype=\"f\")\n", "\n", "model = Linear(nI=n_in.shape[1], nO=n_out.shape[1], init_W=zero_init)\n", "nI = model.get_dim(\"nI\")\n", "nO = model.get_dim(\"nO\")\n", "print(f\"Initialized model with input dimension nI={nI} and output dimension nO={nO}.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Models support **dimension inference from data**. You can defer some or all of the dimensions." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = Linear(init_W=zero_init)\n", "print(f\"Initialized model with no input/output dimensions.\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "X = numpy.zeros((128, 16), dtype=\"f\")\n", "Y = numpy.zeros((128, 10), dtype=\"f\")\n", "model.initialize(X=X, Y=Y)\n", "nI = model.get_dim(\"nI\")\n", "nO = model.get_dim(\"nO\")\n", "print(f\"Initialized model with input dimension nI={nI} and output dimension nO={nO}.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `chain` function wires two model instances together, with a feed-forward relationship. Dimension inference is especially helpful here." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import chain, glorot_uniform_init\n", "\n", "n_hidden = 128\n", "X = numpy.zeros((128, 16), dtype=\"f\")\n", "Y = numpy.zeros((128, 10), dtype=\"f\")\n", "\n", "model = chain(Linear(n_hidden, init_W=glorot_uniform_init), Linear(init_W=zero_init),)\n", "model.initialize(X=X, Y=Y)\n", "nI = model.get_dim(\"nI\")\n", "nO = model.get_dim(\"nO\")\n", "nO_hidden = model.layers[0].get_dim(\"nO\")\n", "print(f\"Initialized model with input dimension nI={nI} and output dimension nO={nO}.\")\n", "print(f\"The size of the hidden layer is {nO_hidden}.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We call functions like `chain` [**combinators**](https://thinc.ai/docs/api-layers#combinators). Combinators take one or more models as arguments, and return another model instance, without introducing any new weight parameters. Another useful combinator is `concatenate`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import concatenate\n", "\n", "model = concatenate(Linear(n_hidden), Linear(n_hidden))\n", "model.initialize(X=X)\n", "nO = model.get_dim(\"nO\")\n", "print(f\"Initialized model with output dimension nO={nO}.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `concatenate` function produces a layer that **runs the child layers separately**, and then **concatenates their outputs together**. This is often useful for combining features from different sources. For instance, we use this all the time to build [spaCy](https://spacy.io)'s embedding layers.\n", "\n", "Some combinators work on a layer and a numeric argument. For instance, the `clone` combinator creates a number of copies of a layer, and chains them together into a deep feed-forward network. The shape inference is especially handy here: we want the first and last layers to have different shapes, so we can avoid providing any dimensions into the layer we clone. We then just have to specify the first layer's output size, and we can let the rest of the dimensions be inferred from the data." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import clone\n", "\n", "model = clone(Linear(), 5)\n", "model.layers[0].set_dim(\"nO\", n_hidden)\n", "model.initialize(X=X, Y=Y)\n", "nI = model.get_dim(\"nI\")\n", "nO = model.get_dim(\"nO\")\n", "print(f\"Initialized model with input dimension nI={nI} and output dimension nO={nO}.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can apply `clone` to model instances that have child layers, making it easy to define more complex architectures. For instance, we often want to attach an activation function and dropout to a linear layer, and then repeat that substructure a number of times. Of course, you can make whatever intermediate functions you find helpful." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import Relu, Dropout\n", "\n", "def Hidden(dropout=0.2):\n", " return chain(Linear(), Relu(), Dropout(dropout))\n", "\n", "model = clone(Hidden(0.2), 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Some combinators are unary functions: they take only one model. These are usually **input and output transformations**. For instance, the `with_array` combinator produces a model that flattens lists of arrays into a single array, and then calls the child layer to get the flattened output. It then reverses the transformation on the output." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import with_array\n", "\n", "model = with_array(Linear(4, 2))\n", "Xs = [model.ops.alloc2f(10, 2, dtype=\"f\")]\n", "model.initialize(X=Xs)\n", "Ys = model.predict(Xs)\n", "print(f\"Prediction shape: {Ys[0].shape}.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The combinator system makes it easy to wire together complex models very concisely. A concise notation is a huge advantage, because it lets you read and review your model with less clutter – making it easy to spot mistakes, and easy to make changes. For the ultimate in concise notation, you can also take advantage of Thinc's **operator overloading**, which lets you use an infix notation. Operator overloading can lead to unexpected results, so you have to enable the overloading explicitly **in a contextmanager**. This also lets you control how the operators are bound, making it easy to use the feature with your own combinators. For instance, here is a definition for a text classification network:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import add, chain, concatenate, clone\n", "from thinc.api import with_array, reduce_max, reduce_mean, residual\n", "from thinc.api import Model, Embed, Maxout, Softmax\n", "\n", "nH = 5\n", "\n", "with Model.define_operators({\">>\": chain, \"|\": concatenate, \"+\": add, \"**\": clone}):\n", " model = (\n", " with_array(\n", " (Embed(128, column=0) + Embed(64, column=1))\n", " >> Maxout(nH, normalize=True, dropout=0.2)\n", " )\n", " >> (reduce_max() | reduce_mean())\n", " >> residual(Relu() >> Dropout(0.2)) ** 2\n", " >> Softmax()\n", " )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The network above will expect a list of arrays as input, where each array should have two columns with different numeric identifier features. The two features will be embedded using separate embedding tables, and the two vectors added and passed through a `Maxout` layer with layer normalization and dropout. The sequences then pass through two pooling functions, and the concatenated results are passed through 2 `Relu` layers with dropout and residual connections. Finally, the sequence vectors are passed through an output layer, which has a `Softmax` activation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Using a model\n", "\n", "Define the model:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import Linear, Adam\n", "import numpy\n", "\n", "X = numpy.zeros((128, 10), dtype=\"f\")\n", "dY = numpy.zeros((128, 10), dtype=\"f\")\n", "\n", "model = Linear(10, 10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initialize the model with a sample of the data:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model.initialize(X=X, Y=dY)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Run the model over some data" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Y = model.predict(X)\n", "Y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Get a callback to backpropagate:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Y, backprop = model.begin_update(X)\n", "Y, backprop" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Run the callback to calculate the gradient with respect to the inputs. If the model has trainable parameters, gradients for the parameters are accumulated internally, as a side-effect." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dX = backprop(dY)\n", "dX" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `backprop()` callback only increments the parameter gradients, it doesn't actually change the weights. To increment the weights, call `model.finish_update()`, passing it an optimizer:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "optimizer = Adam()\n", "model.finish_update(optimizer)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can get and set dimensions, parameters and attributes by name:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dim = model.get_dim(\"nO\")\n", "W = model.get_param(\"W\")\n", "model.attrs[\"hello\"] = \"world\"\n", "model.attrs.get(\"foo\", \"bar\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also retrieve parameter gradients, and increment them explicitly:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dW = model.get_grad(\"W\")\n", "model.inc_grad(\"W\", dW * 0.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, you can serialize models using the `model.to_bytes` and `model.to_disk` methods, and load them back with `from_bytes` and `from_disk`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model_bytes = model.to_bytes()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 2 } thinc-release-v9.1.1/examples/02_transformers_tagger_bert.ipynb000066400000000000000000000521121467064331700247230ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Training a part-of-speech tagger with transformers (BERT)\n", "\n", "This example shows how to use Thinc and Hugging Face's [`transformers`](https://github.com/huggingface/transformers) library to implement and train a part-of-speech tagger on the Universal Dependencies [AnCora corpus](https://github.com/UniversalDependencies/UD_Spanish-AnCora). This notebook assumes familiarity with machine learning concepts, transformer models and Thinc's config system and `Model` API (see the \"Thinc for beginners\" notebook and the [documentation](https://thinc.ai/docs) for more info)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "!pip install \"thinc>=8.0.0\" transformers torch \"ml_datasets>=0.2.0\" \"tqdm>=4.41\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, let's use Thinc's `prefer_gpu` helper to make sure we're performing operations **on GPU if available**. The function should be called right after importing Thinc, and it returns a boolean indicating whether the GPU has been activated. If we're on GPU, we can also call `use_pytorch_for_gpu_memory` to route `cupy`'s memory allocation via PyTorch, so both can play together nicely." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import prefer_gpu, use_pytorch_for_gpu_memory\n", "\n", "is_gpu = prefer_gpu()\n", "print(\"GPU:\", is_gpu)\n", "if is_gpu:\n", " use_pytorch_for_gpu_memory()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Overview: the final config\n", "\n", "Here's the final config for the model we're building in this notebook. It references a custom `TransformersTagger` that takes the name of a starter (the pretrained model to use), an optimizer, a learning rate schedule with warm-up and the general training settings. You can keep the config string within your file or notebook, or save it to a `conig.cfg` file and load it in via `Config.from_disk`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "CONFIG = \"\"\"\n", "[model]\n", "@layers = \"TransformersTagger.v1\"\n", "starter = \"bert-base-multilingual-cased\"\n", "\n", "[optimizer]\n", "@optimizers = \"Adam.v1\"\n", "\n", "[optimizer.learn_rate]\n", "@schedules = \"warmup_linear.v1\"\n", "initial_rate = 0.01\n", "warmup_steps = 3000\n", "total_steps = 6000\n", "\n", "[loss]\n", "@losses = \"SequenceCategoricalCrossentropy.v1\"\n", "\n", "[training]\n", "batch_size = 128\n", "words_per_subbatch = 2000\n", "n_epoch = 10\n", "\"\"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Defining the model\n", "\n", "The Thinc model we want to define should consist of 3 components: the transformers **tokenizer**, the actual **transformer** implemented in PyTorch and a **softmax-activated output layer**.\n", "\n", "\n", "### 1. Wrapping the tokenizer\n", "\n", "To make it easier to keep track of the data that's passed around (and get type errors if something goes wrong), we first create a `TokensPlus` dataclass that holds the information we need from the `transformers` tokenizer. The most important work we'll do in this class is to build an _alignment map_. The transformer models are trained on input sequences that over-segment the sentence, so that they can work on smaller vocabularies. These over-segmentations are generally called \"word pieces\". The transformer will return a tensor with one vector per wordpiece. We need to map that to a tensor with one vector per POS-tagged token. We'll pass those token representations into a feed-forward network to predict the tag probabilities. During the backward pass, we'll then need to invert this mapping, so that we can calculate the gradients with respect to the wordpieces given the gradients with respect to the tokens. To keep things relatively simple, we'll store the alignment as a list of arrays, with each array mapping one token to one wordpiece vector (its first one). To make this work, we'll need to run the tokenizer with `is_split_into_words=True`, which should ensure that we get at least one wordpiece per token." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from typing import Optional, List\n", "import numpy\n", "from thinc.types import Ints1d, Floats2d\n", "from dataclasses import dataclass\n", "import torch\n", "from transformers import BatchEncoding, TokenSpan\n", "\n", "\n", "@dataclass\n", "class TokensPlus:\n", " batch_size: int\n", " tok2wp: List[Ints1d]\n", " input_ids: torch.Tensor\n", " token_type_ids: torch.Tensor\n", " attention_mask: torch.Tensor\n", " \n", " def __init__(self, inputs: List[List[str]], wordpieces: BatchEncoding):\n", " self.input_ids = wordpieces[\"input_ids\"]\n", " self.attention_mask = wordpieces[\"attention_mask\"]\n", " self.token_type_ids = wordpieces[\"token_type_ids\"]\n", " self.batch_size = self.input_ids.shape[0]\n", " self.tok2wp = []\n", " for i in range(self.batch_size):\n", " spans = [wordpieces.word_to_tokens(i, j) for j in range(len(inputs[i]))]\n", " self.tok2wp.append(self.get_wp_starts(spans))\n", " \n", " def get_wp_starts(self, spans: List[Optional[TokenSpan]]) -> Ints1d:\n", " \"\"\"Calculate an alignment mapping each token index to its first wordpiece.\"\"\"\n", " alignment = numpy.zeros((len(spans)), dtype=\"i\")\n", " for i, span in enumerate(spans):\n", " if span is None:\n", " raise ValueError(\n", " \"Token did not align to any wordpieces. Was the tokenizer \"\n", " \"run with is_split_into_words=True?\"\n", " )\n", " else:\n", " alignment[i] = span.start\n", " return alignment\n", " \n", "\n", "def test_tokens_plus(name: str=\"bert-base-multilingual-cased\"):\n", " from transformers import AutoTokenizer\n", " inputs = [\n", " [\"Our\", \"band\", \"is\", \"called\", \"worlthatmustbedivided\", \"!\"],\n", " [\"We\", \"rock\", \"!\"]\n", " ]\n", " tokenizer = AutoTokenizer.from_pretrained(name)\n", " wordpieces = tokenizer(\n", " inputs,\n", " is_split_into_words=True,\n", " add_special_tokens=True,\n", " return_token_type_ids=True,\n", " return_attention_mask=True,\n", " return_length=True,\n", " return_tensors=\"pt\",\n", " padding=\"longest\"\n", " )\n", " tplus = TokensPlus(inputs, wordpieces)\n", " assert len(tplus.tok2wp) == len(inputs) == len(tplus.input_ids)\n", " for i, align in enumerate(tplus.tok2wp):\n", " assert len(align) == len(inputs[i])\n", " for j in align:\n", " assert j >= 0 and j < tplus.input_ids.shape[1]\n", " \n", "test_tokens_plus()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The wrapped tokenizer will take a list-of-lists as input (the texts) and will output a `TokensPlus` object containing the fully padded batch of tokens. The wrapped transformer will take a list of `TokensPlus` objects and will output a list of 2-dimensional arrays.\n", "\n", "1. **TransformersTokenizer**: `List[List[str]]` → `TokensPlus`\n", "2. **Transformer**: `TokensPlus` → `List[Array2d]`\n", "\n", "> 💡 Since we're adding type hints everywhere (and Thinc is fully typed, too), you can run your code through [`mypy`](https://mypy.readthedocs.io/en/stable/) to find type errors and inconsistencies. If you're using an editor like Visual Studio Code, you can enable `mypy` linting and type errors will be highlighted in real time as you write code.\n", "\n", "To use the tokenizer as a layer in our network, we register a new function that returns a Thinc `Model`. The function takes the name of the pretrained weights (e.g. `\"bert-base-multilingual-cased\"`) as an argument that can later be provided via the config. After loading the `AutoTokenizer`, we can stash it in the attributes. This lets us access it at any point later on via `model.attrs[\"tokenizer\"]`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import thinc\n", "from thinc.api import Model\n", "from transformers import AutoTokenizer\n", "\n", "@thinc.registry.layers(\"transformers_tokenizer.v1\")\n", "def TransformersTokenizer(name: str) -> Model[List[List[str]], TokensPlus]:\n", " def forward(model, inputs: List[List[str]], is_train: bool):\n", " tokenizer = model.attrs[\"tokenizer\"]\n", " wordpieces = tokenizer(\n", " inputs,\n", " is_split_into_words=True,\n", " add_special_tokens=True,\n", " return_token_type_ids=True,\n", " return_attention_mask=True,\n", " return_length=True,\n", " return_tensors=\"pt\",\n", " padding=\"longest\"\n", " )\n", " return TokensPlus(inputs, wordpieces), lambda d_tokens: []\n", "\n", " return Model(\"tokenizer\", forward, attrs={\"tokenizer\": AutoTokenizer.from_pretrained(name)})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The forward pass takes the model and a list-of-lists of strings and outputs the `TokensPlus` dataclass. It also outputs a dummy callback function, to meet the API contract for Thinc models. Even though there's no way we can meaningfully \"backpropagate\" this layer, we need to make sure the function has the right signature, so that it can be used interchangeably with other layers." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Wrapping the transformer\n", "\n", "To load and wrap the transformer, we can use `transformers.AutoModel` and Thinc's `PyTorchWrapper`. The forward method of the wrapped model can take arbitrary positional arguments and keyword arguments. Here's what the wrapped model is going to look like:\n", "\n", "```python\n", "@thinc.registry.layers(\"transformers_model.v1\")\n", "def Transformer(name) -> Model[TokensPlus, List[Floats2d]]:\n", " return PyTorchWrapper(\n", " AutoModel.from_pretrained(name),\n", " convert_inputs=convert_transformer_inputs,\n", " convert_outputs=convert_transformer_outputs,\n", " )\n", "```\n", "\n", "The `Transformer` layer takes our `TokensPlus` dataclass as input and outputs a list of 2-dimensional arrays. The convert functions are used to **map inputs and outputs to and from the PyTorch model**. Each function should return the converted output, and a callback to use during the backward pass. To make the arbitrary positional and keyword arguments easier to manage, Thinc uses an `ArgsKwargs` dataclass, essentially a named tuple with `args` and `kwargs` that can be spread into a function as `*ArgsKwargs.args` and `**ArgsKwargs.kwargs`. The `ArgsKwargs` objects will be passed straight into the model in the forward pass, and straight into `torch.autograd.backward` during the backward pass." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from typing import List, Tuple, Callable\n", "from thinc.api import ArgsKwargs, torch2xp, xp2torch\n", "from thinc.types import Floats2d\n", "\n", "def convert_transformer_inputs(model, tokens: TokensPlus, is_train):\n", " kwargs = {\n", " \"input_ids\": tokens.input_ids,\n", " \"attention_mask\": tokens.attention_mask,\n", " \"token_type_ids\": tokens.token_type_ids,\n", " }\n", " return ArgsKwargs(args=(), kwargs=kwargs), lambda dX: []\n", "\n", "\n", "def convert_transformer_outputs(\n", " model: Model,\n", " inputs_outputs: Tuple[TokensPlus, Tuple[torch.Tensor]],\n", " is_train: bool\n", ") -> Tuple[List[Floats2d], Callable]:\n", " tplus, trf_outputs = inputs_outputs\n", " wp_vectors = torch2xp(trf_outputs[0])\n", " tokvecs = [wp_vectors[i, idx] for i, idx in enumerate(tplus.tok2wp)]\n", "\n", " def backprop(d_tokvecs: List[Floats2d]) -> ArgsKwargs:\n", " # Restore entries for BOS and EOS markers\n", " d_wp_vectors = model.ops.alloc3f(*trf_outputs[0].shape, dtype=\"f\")\n", " for i, idx in enumerate(tplus.tok2wp):\n", " d_wp_vectors[i, idx] += d_tokvecs[i]\n", " return ArgsKwargs(\n", " args=(trf_outputs[0],),\n", " kwargs={\"grad_tensors\": xp2torch(d_wp_vectors)},\n", " )\n", "\n", " return tokvecs, backprop" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The input and output transformation functions give you full control of how data is passed into and out of the underlying PyTorch model, so you can work with PyTorch layers that expect and return arbitrary objects. Putting it all together, we now have a nice layer that is configured with the name of a transformer model, that acts as a function mapping tokenized input into feature vectors." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import thinc\n", "from thinc.api import PyTorchWrapper\n", "from transformers import AutoModel\n", "\n", "@thinc.registry.layers(\"transformers_model.v1\")\n", "def Transformer(name: str) -> Model[TokensPlus, List[Floats2d]]:\n", " return PyTorchWrapper(\n", " AutoModel.from_pretrained(name),\n", " convert_inputs=convert_transformer_inputs,\n", " convert_outputs=convert_transformer_outputs,\n", " )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now combine the `TransformersTokenizer` and `Transformer` into a feed-forward network using the `chain` combinator. The `with_array` layer transforms a sequence of data into a contiguous 2d array on the way into and\n", "out of a model." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import chain, with_array, Softmax\n", "\n", "@thinc.registry.layers(\"TransformersTagger.v1\")\n", "def TransformersTagger(starter: str, n_tags: int = 17) -> Model[List[List[str]], List[Floats2d]]:\n", " return chain(\n", " TransformersTokenizer(starter),\n", " Transformer(starter),\n", " with_array(Softmax(n_tags)),\n", " )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Training the model\n", "\n", "### Setting up model and data\n", "\n", "Since we've registered all layers via `@thinc.registry.layers`, we can construct the model, its settings and other functions we need from a config (see `CONFIG` above). The result is a config object with a model, an optimizer, a function to calculate the loss and the training settings." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import Config, registry\n", "\n", "C = registry.resolve(Config().from_str(CONFIG))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = C[\"model\"]\n", "optimizer = C[\"optimizer\"]\n", "calculate_loss = C[\"loss\"]\n", "cfg = C[\"training\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We’ve prepared a separate package [`ml-datasets`](https://github.com/explosion/ml-datasets) with loaders for some common datasets, including the AnCora data. If we're using a GPU, calling `ops.asarray` on the outputs ensures that they're converted to `cupy` arrays (instead of `numpy` arrays). Calling `Model.initialize` with a batch of inputs and outputs allows Thinc to **infer the missing dimensions**." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import ml_datasets\n", "(train_X, train_Y), (dev_X, dev_Y) = ml_datasets.ud_ancora_pos_tags()\n", "\n", "train_Y = list(map(model.ops.asarray, train_Y)) # convert to cupy if needed\n", "dev_Y = list(map(model.ops.asarray, dev_Y)) # convert to cupy if needed\n", "\n", "model.initialize(X=train_X[:5], Y=train_Y[:5])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Helper functions for training and evaluation\n", "\n", "Before we can train the model, we also need to set up the following helper functions for batching and evaluation:\n", "\n", "* **`minibatch_by_words`:** Group pairs of sequences into minibatches under `max_words` in size, considering padding. The size of a padded batch is the length of its longest sequence multiplied by the number of elements in the batch.\n", "* **`evaluate_sequences`:** Evaluate the model sequences of two-dimensional arrays and return the score." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def minibatch_by_words(pairs, max_words):\n", " pairs = list(zip(*pairs))\n", " pairs.sort(key=lambda xy: len(xy[0]), reverse=True)\n", " batch = []\n", " for X, Y in pairs:\n", " batch.append((X, Y))\n", " n_words = max(len(xy[0]) for xy in batch) * len(batch)\n", " if n_words >= max_words:\n", " yield batch[:-1]\n", " batch = [(X, Y)]\n", " if batch:\n", " yield batch\n", "\n", "def evaluate_sequences(model, Xs: List[Floats2d], Ys: List[Floats2d], batch_size: int) -> float:\n", " correct = 0.0\n", " total = 0.0\n", " for X, Y in model.ops.multibatch(batch_size, Xs, Ys):\n", " Yh = model.predict(X)\n", " for yh, y in zip(Yh, Y):\n", " correct += (y.argmax(axis=1) == yh.argmax(axis=1)).sum()\n", " total += y.shape[0]\n", " return float(correct / total)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The training loop\n", "\n", "Transformers often learn best with **large batch sizes** – larger than fits in GPU memory. But you don't have to backprop the whole batch at once. Here we consider the \"logical\" batch size (number of examples per update) separately from the physical batch size. For the physical batch size, what we care about is the **number of words** (considering padding too). We also want to sort by length, for efficiency. \n", "\n", "At the end of the batch, we **call the optimizer** with the accumulated gradients, and **advance the learning rate schedules**. You might want to evaluate more often than once per epoch – that's up to you." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from tqdm.notebook import tqdm\n", "from thinc.api import fix_random_seed\n", "\n", "fix_random_seed(0)\n", "\n", "for epoch in range(cfg[\"n_epoch\"]):\n", " batches = model.ops.multibatch(cfg[\"batch_size\"], train_X, train_Y, shuffle=True)\n", " for outer_batch in tqdm(batches, leave=False):\n", " for batch in minibatch_by_words(outer_batch, cfg[\"words_per_subbatch\"]):\n", " inputs, truths = zip(*batch)\n", " inputs = list(inputs)\n", " guesses, backprop = model(inputs, is_train=True)\n", " backprop(calculate_loss.get_grad(guesses, truths))\n", " model.finish_update(optimizer)\n", " optimizer.step_schedules()\n", " score = evaluate_sequences(model, dev_X, dev_Y, cfg[\"batch_size\"])\n", " print(epoch, f\"{score:.3f}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you like, you can call `model.to_disk` or `model.to_bytes` to save the model weights to a directory or a bytestring." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 2 } thinc-release-v9.1.1/examples/03_pos_tagger_basic_cnn.ipynb000066400000000000000000000324121467064331700237640ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Basic CNN part-of-speech tagger with Thinc\n", "\n", "This notebook shows how to implement a basic CNN for part-of-speech tagging model in Thinc (without external dependencies) and train the model on the Universal Dependencies [AnCora corpus](https://github.com/UniversalDependencies/UD_Spanish-AnCora). The tutorial shows three different workflows:\n", "\n", "1. Composing the model **in code** (basic usage)\n", "2. Composing the model **via a config file only** (mostly to demonstrate advanced usage of configs)\n", "3. Composing the model **in code and configuring it via config** (recommended)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install \"thinc>=8.0.0\" \"ml_datasets>=0.2.0\" \"tqdm>=4.41\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We start by making sure the computation is performed on GPU if available. `prefer_gpu` should be called right after importing Thinc, and it returns a boolean indicating whether the GPU has been activated." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import prefer_gpu\n", "\n", "prefer_gpu()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also define the following helper functions for loading the data, and training and evaluating a given model. Don't forget to call `model.initialize` with a batch of input and output data to initialize the model and fill in any missing shapes." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import ml_datasets\n", "from tqdm.notebook import tqdm\n", "from thinc.api import fix_random_seed\n", "\n", "fix_random_seed(0)\n", "\n", "def train_model(model, optimizer, n_iter, batch_size):\n", " (train_X, train_y), (dev_X, dev_y) = ml_datasets.ud_ancora_pos_tags()\n", " model.initialize(X=train_X[:5], Y=train_y[:5])\n", " for n in range(n_iter):\n", " loss = 0.0\n", " batches = model.ops.multibatch(batch_size, train_X, train_y, shuffle=True)\n", " for X, Y in tqdm(batches, leave=False):\n", " Yh, backprop = model.begin_update(X)\n", " d_loss = []\n", " for i in range(len(Yh)):\n", " d_loss.append(Yh[i] - Y[i])\n", " loss += ((Yh[i] - Y[i]) ** 2).sum()\n", " backprop(d_loss)\n", " model.finish_update(optimizer)\n", " score = evaluate(model, dev_X, dev_y, batch_size)\n", " print(f\"{n}\\t{loss:.2f}\\t{score:.3f}\")\n", " \n", "def evaluate(model, dev_X, dev_Y, batch_size):\n", " correct = 0\n", " total = 0\n", " for X, Y in model.ops.multibatch(batch_size, dev_X, dev_Y):\n", " Yh = model.predict(X)\n", " for yh, y in zip(Yh, Y):\n", " correct += (y.argmax(axis=1) == yh.argmax(axis=1)).sum()\n", " total += y.shape[0]\n", " return float(correct / total)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## 1. Composing the model in code\n", "\n", "Here's the model definition, using the `>>` operator for the `chain` combinator. The `strings2arrays` transform converts a sequence of strings to a list of arrays. `with_array` transforms sequences (the sequences of arrays) into a contiguous 2-dimensional array on the way into and out of the model it wraps. This means our model has the following signature: `Model[Sequence[str], Sequence[Array2d]]`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import Model, chain, strings2arrays, with_array, HashEmbed, expand_window, Relu, Softmax, Adam, warmup_linear\n", "\n", "width = 32\n", "vector_width = 16\n", "nr_classes = 17\n", "learn_rate = 0.001\n", "n_iter = 10\n", "batch_size = 128\n", "\n", "with Model.define_operators({\">>\": chain}):\n", " model = strings2arrays() >> with_array(\n", " HashEmbed(nO=width, nV=vector_width, column=0)\n", " >> expand_window(window_size=1)\n", " >> Relu(nO=width, nI=width * 3)\n", " >> Relu(nO=width, nI=width)\n", " >> Softmax(nO=nr_classes, nI=width)\n", " )\n", "optimizer = Adam(learn_rate)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "train_model(model, optimizer, n_iter, batch_size)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Composing the model via a config file\n", "\n", "Thinc's config system lets describe **arbitrary trees of objects**. The config can include values like hyperparameters or training settings, or references to functions and the values of their arguments. Thinc will then construct the config **bottom-up** – so you can define one function with its arguments, and then pass the return value into another function.\n", "\n", "If we want to rebuild the model defined above in a config file, we first need to break down its structure:\n", "\n", "* `chain` (any number of positional arguments)\n", " * `strings2arrays` (no arguments)\n", " * `with_array` (one argument **layer**)\n", " * **layer:** `chain` (any number of positional arguments)\n", " * `HashEmbed`\n", " * `expand_window`\n", " * `Relu`\n", " * `Relu`\n", " * `Softmax`\n", "\n", "`chain` takes a variable number of positional arguments (the layers to compose). In the config, positional arguments can be expressed using `*` in the dot notation. For example, `model.layer` could describe a function passed to `model` as the argument `layer`, while `model.*.relu` defines a positional argument passed to `model`. The name of the argument, e.g. `relu` – doesn't matter in this case. It just needs to be unique.\n", "\n", "> ⚠️ **Important note:** This example is mostly intended to show what's possible. We don't recommend \"programming via config files\" as shown here, since it doesn't really solve any problem and makes the model definition just as complicated. Instead, we recommend a hybrid approach: wrap the model definition in a registered function and configure it via the config." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "CONFIG = \"\"\"\n", "[hyper_params]\n", "width = 32\n", "vector_width = 16\n", "learn_rate = 0.001\n", "\n", "[training]\n", "n_iter = 10\n", "batch_size = 128\n", "\n", "[model]\n", "@layers = \"chain.v1\"\n", "\n", "[model.*.strings2arrays]\n", "@layers = \"strings2arrays.v1\"\n", "\n", "[model.*.with_array]\n", "@layers = \"with_array.v1\"\n", "\n", "[model.*.with_array.layer]\n", "@layers = \"chain.v1\"\n", "\n", "[model.*.with_array.layer.*.hashembed]\n", "@layers = \"HashEmbed.v1\"\n", "nO = ${hyper_params:width}\n", "nV = ${hyper_params:vector_width}\n", "column = 0\n", "\n", "[model.*.with_array.layer.*.expand_window]\n", "@layers = \"expand_window.v1\"\n", "window_size = 1\n", "\n", "[model.*.with_array.layer.*.relu1]\n", "@layers = \"Relu.v1\"\n", "nO = ${hyper_params:width}\n", "nI = 96\n", "\n", "[model.*.with_array.layer.*.relu2]\n", "@layers = \"Relu.v1\"\n", "nO = ${hyper_params:width}\n", "nI = ${hyper_params:width}\n", "\n", "[model.*.with_array.layer.*.softmax]\n", "@layers = \"Softmax.v1\"\n", "nO = 17\n", "nI = ${hyper_params:width}\n", "\n", "[optimizer]\n", "@optimizers = \"Adam.v1\"\n", "learn_rate = ${hyper_params:learn_rate}\n", "\"\"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When the config is loaded, it's first parsed as a dictionary and all references to values from other sections, e.g. `${hyper_params:width}` are replaced. The result is a nested dictionary describing the objects defined in the config." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import registry, Config\n", "\n", "config = Config().from_str(CONFIG)\n", "config" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`registry.resolve` then creates the objects and calls the functions **bottom-up**." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "C = registry.resolve(config)\n", "C" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now have a model, optimizer and training settings, built from the config, and can use them to train the model." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = C[\"model\"]\n", "optimizer = C[\"optimizer\"]\n", "n_iter = C[\"training\"][\"n_iter\"]\n", "batch_size = C[\"training\"][\"batch_size\"]\n", "train_model(model, optimizer, n_iter, batch_size)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Composing the model with code and config\n", "\n", "The `@thinc.registry` decorator lets you register your own layers and model definitions, which can then be referenced in config files. This approach gives you the most flexibility, while also keeping your config and model definitions concise.\n", "\n", "> 💡 The function you register will be filled in by the config – e.g. the value of `width` defined in the config block will be passed in as the argument `width`. If arguments are missing, you'll see a validation error. If you're using **type hints** in the function, the values will be parsed to ensure they always have the right type. If they're invalid – e.g. if you're passing in a list as the value of `width` – you'll see an error. This makes it easier to prevent bugs caused by incorrect values lower down in the network." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import thinc\n", "from thinc.api import Model, chain, strings2arrays, with_array, HashEmbed, expand_window, Relu, Softmax, Adam, warmup_linear\n", "\n", "@thinc.registry.layers(\"cnn_tagger.v1\")\n", "def create_cnn_tagger(width: int, vector_width: int, nr_classes: int = 17):\n", " with Model.define_operators({\">>\": chain}):\n", " model = strings2arrays() >> with_array(\n", " HashEmbed(nO=width, nV=vector_width, column=0)\n", " >> expand_window(window_size=1)\n", " >> Relu(nO=width, nI=width * 3)\n", " >> Relu(nO=width, nI=width)\n", " >> Softmax(nO=nr_classes, nI=width)\n", " )\n", " return model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The config would then only need to define one model block with `@layers = \"cnn_tagger.v1\"` and the function arguments. Whether you move them out to a section like `[hyper_params]` or just hard-code them into the block is up to you. The advantage of a separate section is that the values are **preserved in the parsed config object** (and not just passed into the function), so you can always print and view them." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "CONFIG = \"\"\"\n", "[hyper_params]\n", "width = 32\n", "vector_width = 16\n", "learn_rate = 0.001\n", "\n", "[training]\n", "n_iter = 10\n", "batch_size = 128\n", "\n", "[model]\n", "@layers = \"cnn_tagger.v1\"\n", "width = ${hyper_params:width}\n", "vector_width = ${hyper_params:vector_width}\n", "nr_classes = 17\n", "\n", "[optimizer]\n", "@optimizers = \"Adam.v1\"\n", "learn_rate = ${hyper_params:learn_rate}\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "C = registry.resolve(Config().from_str(CONFIG))\n", "C" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = C[\"model\"]\n", "optimizer = C[\"optimizer\"]\n", "n_iter = C[\"training\"][\"n_iter\"]\n", "batch_size = C[\"training\"][\"batch_size\"]\n", "train_model(model, optimizer, n_iter, batch_size)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 4 } thinc-release-v9.1.1/examples/03_textcat_basic_neural_bow.ipynb000066400000000000000000000210421467064331700246620ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Basic neural bag-of-words text classifier with Thinc\n", "\n", "This notebook shows how to implement a simple neural text classification model in Thinc. Last tested with `thinc==8.0.13`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install thinc syntok \"ml_datasets>=0.2.0\" tqdm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For simple and standalone tokenization, we'll use the [`syntok`](https://github.com/fnl/syntok) package and the following function:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from syntok.tokenizer import Tokenizer\n", "\n", "def tokenize_texts(texts):\n", " tok = Tokenizer()\n", " return [[token.value for token in tok.tokenize(text)] for text in texts]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setting up the data\n", "\n", "The `load_data` function loads the DBPedia Ontology dataset, converts and tokenizes the data and generates a simple vocabulary mapping. Instead of `ml_datasets.dbpedia` you can also try `ml_datasets.imdb` for the IMDB review dataset." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import ml_datasets\n", "import numpy\n", "\n", "def load_data():\n", " train_data, dev_data = ml_datasets.dbpedia(train_limit=2000, dev_limit=2000)\n", " train_texts, train_cats = zip(*train_data)\n", " dev_texts, dev_cats = zip(*dev_data)\n", " unique_cats = list(numpy.unique(numpy.concatenate((train_cats, dev_cats))))\n", " nr_class = len(unique_cats)\n", " print(f\"{len(train_data)} training / {len(dev_data)} dev\\n{nr_class} classes\")\n", "\n", " train_y = numpy.zeros((len(train_cats), nr_class), dtype=\"f\")\n", " for i, cat in enumerate(train_cats):\n", " train_y[i][unique_cats.index(cat)] = 1\n", " dev_y = numpy.zeros((len(dev_cats), nr_class), dtype=\"f\")\n", " for i, cat in enumerate(dev_cats):\n", " dev_y[i][unique_cats.index(cat)] = 1\n", "\n", " train_tokenized = tokenize_texts(train_texts)\n", " dev_tokenized = tokenize_texts(dev_texts)\n", " # Generate simple vocab mapping, is 0\n", " vocab = {}\n", " count_id = 1\n", " for text in train_tokenized:\n", " for token in text:\n", " if token not in vocab:\n", " vocab[token] = count_id\n", " count_id += 1\n", " # Map texts using vocab\n", " train_X = []\n", " for text in train_tokenized:\n", " train_X.append(numpy.array([vocab.get(t, 0) for t in text]))\n", " dev_X = []\n", " for text in dev_tokenized:\n", " dev_X.append(numpy.array([vocab.get(t, 0) for t in text]))\n", " return (train_X, train_y), (dev_X, dev_y), vocab" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Defining the model and config\n", "\n", "The model takes a list of 2-dimensional arrays (the tokenized texts mapped to vocab IDs) and outputs a 2d array. Because the embed layer's `nV` dimension (the number of entries in the lookup table) depends on the vocab and the training data, it's passed in as an argument and registered as a **reference**. This makes it easy to retrieve it later on by calling `model.get_ref(\"embed\")`, so we can set its `nV` dimension." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from typing import List\n", "import thinc\n", "from thinc.api import Model, chain, list2ragged, with_array, reduce_mean, Softmax\n", "from thinc.types import Array2d\n", "\n", "@thinc.registry.layers(\"EmbedPoolTextcat.v1\")\n", "def EmbedPoolTextcat(embed: Model[Array2d, Array2d]) -> Model[List[Array2d], Array2d]:\n", " with Model.define_operators({\">>\": chain}):\n", " model = with_array(embed) >> list2ragged() >> reduce_mean() >> Softmax()\n", " model.set_ref(\"embed\", embed)\n", " return model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The config defines the top-level model using the registered `EmbedPoolTextcat` function, and the `embed` argument, referencing the `Embed` layer." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "CONFIG = \"\"\"\n", "[hyper_params]\n", "width = 64\n", "\n", "[model]\n", "@layers = \"EmbedPoolTextcat.v1\"\n", "\n", "[model.embed]\n", "@layers = \"Embed.v1\"\n", "nO = ${hyper_params:width}\n", "\n", "[optimizer]\n", "@optimizers = \"Adam.v1\"\n", "learn_rate = 0.001\n", "\n", "[training]\n", "batch_size = 8\n", "n_iter = 10\n", "\"\"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Training setup\n", "\n", "When the config is loaded, it's first parsed as a dictionary and all references to values from other sections, e.g. `${hyper_params:width}` are replaced. The result is a nested dictionary describing the objects defined in the config. `registry.resolve` then creates the objects and calls the functions **bottom-up**." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import registry, Config\n", "\n", "C = registry.resolve(Config().from_str(CONFIG))\n", "C" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once the data is loaded, we'll know the vocabulary size and can set the dimension on the embedding layer. `model.get_ref(\"embed\")` returns the layer defined as the ref `\"embed\"` and the `set_dim` method lets you set a value for a dimension. To fill in the other missing shapes, we can call `model.initialize` with some input and output data. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "(train_X, train_y), (dev_X, dev_y), vocab = load_data()\n", "\n", "batch_size = C[\"training\"][\"batch_size\"]\n", "optimizer = C[\"optimizer\"]\n", "model = C[\"model\"]\n", "model.get_ref(\"embed\").set_dim(\"nV\", len(vocab) + 1)\n", "\n", "model.initialize(X=train_X, Y=train_y)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def evaluate_model(model, dev_X, dev_Y, batch_size):\n", " correct = 0.0\n", " total = 0.0\n", " for X, Y in model.ops.multibatch(batch_size, dev_X, dev_Y):\n", " Yh = model.predict(X)\n", " for j in range(len(Yh)):\n", " correct += Yh[j].argmax(axis=0) == Y[j].argmax(axis=0)\n", " total += len(Y)\n", " return float(correct / total)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Training the model" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import fix_random_seed\n", "from tqdm.notebook import tqdm\n", "\n", "fix_random_seed(0)\n", "for n in range(C[\"training\"][\"n_iter\"]):\n", " loss = 0.0\n", " batches = model.ops.multibatch(batch_size, train_X, train_y, shuffle=True)\n", " for X, Y in tqdm(batches, leave=False):\n", " Yh, backprop = model.begin_update(X)\n", " d_loss = []\n", " for i in range(len(Yh)):\n", " d_loss.append(Yh[i] - Y[i])\n", " loss += ((Yh[i] - Y[i]) ** 2).sum()\n", " backprop(numpy.array(d_loss))\n", " model.finish_update(optimizer)\n", " score = evaluate_model(model, dev_X, dev_y, batch_size)\n", " print(f\"{n}\\t{loss:.2f}\\t{score:.3f}\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 2 } thinc-release-v9.1.1/examples/04_configure_gpu_memory.ipynb000066400000000000000000000104571467064331700240650ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Using a single memory pool for Cupy and PyTorch or TensorFlow\n", "\n", "Requesting memory from a GPU device directly is expensive, so most deep learning libraries will over-allocate, and maintain an internal pool of memory they will keep a hold of, instead of returning it back to the device. This means the libraries don't by default play well together: they all expect to be the single consumer of the GPU memory, so they hog it selfishly. If you use two frameworks together, you can get unexpected out-of-memory errors.\n", "\n", "Thinc's internal models use cupy for GPU operations, and cupy offers a nice solution for this problem. You can provide cupy with a custom memory allocation function, which allows us to route cupy's memory requests via another library. This avoids the memory problem when you use PyTorch and cupy together, or when you use cupy and Tensorflow together. We don't yet have a similar solution for using PyTorch and Tensorflow together, however.\n", "\n", "To start with, we call the `require_gpu()` function, which tells Thinc and PyTorch to allocate on GPU." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install \"thinc>=8.0.0\" torch \"tensorflow>=2.0\" " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import require_gpu\n", "\n", "require_gpu()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We then call `use_pytorch_for_gpu_memory()` to set up the allocation strategy. Now when `cupy` tries to request GPU memory, it will do so by asking PyTorch, rather than asking the GPU directly." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import use_pytorch_for_gpu_memory\n", "\n", "use_pytorch_for_gpu_memory()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To test that it's working, we make a little function that allocates an array using cupy, and prints its size, along with the current size of PyTorch's memory pool. Notice the over-allocation: PyTorch grabs a *much* bigger chunk of memory than just our little array. That's why we need to have only one memory pool." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import cupy \n", "import torch.cuda\n", "\n", "def allocate_cupy_tensor(size):\n", " array = cupy.zeros((size,), dtype=\"f\")\n", " print(array.size, torch.cuda.max_memory_allocated())\n", " return array\n", "allocate_cupy_tensor(16)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also see that even when we free the tensor, the memory isn't immediately released. On the other hand, we don't need to resize the memory pool when we make a second small allocation." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import tensorflow\n", "\n", "with tensorflow.device('/device:GPU:0'):\n", " arr = allocate_cupy_tensor(1000)\n", " arr = None\n", " arr = allocate_cupy_tensor(1000)\n", " arr = None" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we make a huge allocation, we'll have to resize the pool though. Let's make sure the pool resizes properly, and that memory is freed when the tensors are removed." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "arr = allocate_cupy_tensor(1000)\n", "for _ in range(100):\n", " arr2 = allocate_cupy_tensor(900000)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 4 } thinc-release-v9.1.1/examples/05_benchmarking_layers.ipynb000066400000000000000000000173741467064331700236560ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Benchmarking Thinc layers with a custom `benchmark` layer\n", "\n", "This notebook shows how to write a `benchmark` layer that can wrap any layer(s) in your network and that **logs the execution times** of the initialization, forward pass and backward pass. The benchmark layer can also be mapped to an operator like `@` to make it easy to add debugging to your network." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install \"thinc>=8.0.0\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To log the results, we first set up a custom logger using Python's `logging` module. You could also just print the stats instead, but using `logging` is cleaner, since it lets other users modify the logger's behavior more easily, and separates the logs from other output and write it to a file (e.g. if you're benchmarking several layers during training). The following logging config will output the date and time, the name of the logger and the logged results." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import logging\n", "\n", "logger = logging.getLogger(\"thinc:benchmark\")\n", "if not logger.hasHandlers(): # prevent Jupyter from adding multiple loggers\n", " formatter = logging.Formatter('%(asctime)s %(name)s %(message)s', datefmt=\"%Y-%m-%d %H:%M:%S\")\n", " handler = logging.StreamHandler()\n", " handler.setFormatter(formatter)\n", " logger.addHandler(handler)\n", " logger.setLevel(logging.DEBUG)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's a minimalistic time logger that can be initialized with the name of a given layer, and can track several events (e.g. `\"forward\"` and `\"backward\"`). When the `TimeLogger.end` method is called, the output is formatted nicely and the elapsed time is logged with the logger name and colored label." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from timeit import default_timer\n", "from wasabi import color\n", "\n", "\n", "class TimeLogger:\n", " def __init__(self, name):\n", " self.colors = {\"forward\": \"green\", \"backward\": \"blue\"}\n", " self.name = name\n", " self.timers = {}\n", " \n", " def start(self, name):\n", " self.timers[name] = default_timer()\n", " \n", " def end(self, name):\n", " result = default_timer() - self.timers[name]\n", " label = f\"{name.upper():<8}\"\n", " label = color(label, self.colors.get(name), bold=True)\n", " logger.debug(f\"{self.name:<12} | {label} | {result:.6f}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `benchmark` layer now has to wrap the forward pass, backward pass and initialization of the layer it wraps and log the execution times. It then returns a Thinc model instance with the custom `forward` function and a custom `init` function. We'll also allow setting a custom `name` to make it easier to tell multiple wrapped benchmark layers apart." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import Model\n", " \n", "def benchmark(layer, name=None):\n", " name = name if name is not None else layer.name\n", " t = TimeLogger(name)\n", " \n", " def init(model, X, Y):\n", " t.start(\"init\")\n", " result = layer.initialize(X, Y)\n", " t.end(\"init\")\n", " return result\n", " \n", " def forward(model, X, is_train):\n", " t.start(\"forward\")\n", " layer_Y, layer_callback = layer(X, is_train=is_train)\n", " t.end(\"forward\")\n", " \n", " def backprop(dY):\n", " t.start(\"backward\")\n", " result = layer_callback(dY)\n", " t.end(\"backward\")\n", " return result\n", " \n", " return layer_Y, backprop\n", " \n", " return Model(f\"benchmark:{layer.name}\", forward, init=init) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Usage examples\n", "\n", "### Using the `benchmark` layer as a function\n", "\n", "We can now wrap one or more layers (including nested layers) with the `benchmark` function. This is the original model:\n", "\n", "```python\n", "model = chain(Linear(1), Linear(1))\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy\n", "from thinc.api import chain, Linear\n", "\n", "X = numpy.zeros((1, 2), dtype=\"f\")\n", "\n", "model = benchmark(chain(benchmark(Linear(1)), Linear(1)), name=\"outer\")\n", "model.initialize(X=X)\n", "Y, backprop = model(X, is_train=False)\n", "dX = backprop(Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Using the `benchmark` layer as an operator\n", "\n", "Alternatively, we can also use `Model.define_operators` to map `benchmark` to an operator like `@`. The left argument of the operator is the first argument passed into the function (the layer) and the right argument is the second argument (the name). The following example wraps the whole network (two chained `Linear` layers) in a benchmark layer named `\"outer\"`, and the first `Linear` layer in a benchmark layer named `\"first\"`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "from thinc.api import Model\n", "\n", "with Model.define_operators({\">>\": chain, \"@\": benchmark}):\n", " model = (Linear(1) @ \"first\" >> Linear(1)) @ \"outer\"\n", " \n", "model.initialize(X=X)\n", "Y, backprop = model(X, is_train=True)\n", "dX = backprop(Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Using the `benchmark` layer during training" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import Model, chain, Relu, Softmax, Adam\n", "\n", "n_hidden = 32\n", "dropout = 0.2\n", "\n", "with Model.define_operators({\">>\": chain, \"@\": benchmark}):\n", " model = (\n", " Relu(nO=n_hidden, dropout=dropout) @ \"relu1\"\n", " >> Relu(nO=n_hidden, dropout=dropout) @ \"relu2\"\n", " >> Softmax()\n", " )\n", "\n", "train_X = numpy.zeros((5, 784), dtype=\"f\")\n", "train_Y = numpy.zeros((540, 10), dtype=\"f\")\n", "\n", "model.initialize(X=train_X[:5], Y=train_Y[:5])\n", "optimizer = Adam(0.001)\n", "for i in range(10):\n", " for X, Y in model.ops.multibatch(8, train_X, train_Y, shuffle=True):\n", " Yh, backprop = model.begin_update(X)\n", " backprop(Yh - Y)\n", " model.finish_update(optimizer)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 2 } thinc-release-v9.1.1/examples/05_visualizing_models.ipynb000066400000000000000000000134651467064331700235530ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Visualizing Thinc models (with shape inference)\n", "\n", "This is a simple notebook showing how you can easily visualize your Thinc models and their inputs and outputs using [Graphviz](https://www.graphviz.org/) and [`pydot`](https://github.com/pydot/pydot). If you're installing `pydot` via the notebook, make sure to restart your kernel (or Google Colab VM – [see here](https://stackoverflow.com/questions/49853303/how-to-install-pydot-graphviz-on-google-colab) for details) after installation." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "!pip install \"thinc>=8.0.0\" pydot graphviz svgwrite" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start by defining a model with a number of layers chained together using the `chain` combinator:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import chain, expand_window, Relu, Maxout, Linear, Softmax\n", "\n", "n_hidden = 32\n", "dropout = 0.2\n", "\n", "model= chain(\n", " expand_window(3),\n", " Relu(nO=n_hidden, dropout=dropout, normalize=True),\n", " Maxout(nO=n_hidden * 4),\n", " Linear(nO=n_hidden * 2),\n", " Relu(nO=n_hidden, dropout=dropout, normalize=True),\n", " Linear(nO=n_hidden),\n", " Relu(nO=n_hidden, dropout=dropout),\n", " Softmax(),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's the visualization we want to achieve for this model: the **name of the layer** or combination of layers and the **input and output dimensions**. Note that `>>` refers to a chaining of layers.\n", "\n", "![](https://user-images.githubusercontent.com/13643239/72763790-b8ab3900-3be5-11ea-8ea7-91e4e9fbb181.png)\n", "\n", "This means we need to add a node for each layer, edges connecting the nodes to the previous node (except for the first/last), and labels like `\"name|(nO,nI)\"` – for instance, `\"maxout|(128,32)\"`. Here's a simple function that takes a Thinc layer (i.e. a `Model` instance) and returns a label with the layer name and its dimensions, if available:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def get_label(layer):\n", " layer_name = layer.name\n", " nO = layer.get_dim(\"nO\") if layer.has_dim(\"nO\") else \"?\"\n", " nI = layer.get_dim(\"nI\") if layer.has_dim(\"nI\") else \"?\"\n", " return f\"{layer.name}|({nO}, {nI})\".replace(\">\", \">\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now use `pydot` to create a visualization for a given model. You can customize the direction of the notes by setting `\"rankdir\"` (e.g. `\"TB\"` for \"top to bottom\") and adjust the font and arrow styling. To make the visualization render nicely in a notebook, we can call into IPython's utilities." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pydot\n", "from IPython.display import SVG, display\n", "\n", "def visualize_model(model):\n", " dot = pydot.Dot()\n", " dot.set(\"rankdir\", \"LR\")\n", " dot.set_node_defaults(shape=\"record\", fontname=\"arial\", fontsize=\"10\")\n", " dot.set_edge_defaults(arrowsize=\"0.7\")\n", " nodes = {}\n", " for i, layer in enumerate(model.layers):\n", " label = get_label(layer)\n", " node = pydot.Node(layer.id, label=label)\n", " dot.add_node(node)\n", " nodes[layer.id] = node\n", " if i == 0:\n", " continue\n", " from_node = nodes[model.layers[i - 1].id]\n", " to_node = nodes[layer.id]\n", " if not dot.get_edge(from_node, to_node):\n", " dot.add_edge(pydot.Edge(from_node, to_node))\n", " display(SVG(dot.create_svg()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Calling `visualize_model` on the model defined above will render the visualization. However, most dimensions will now show up as `(?, ?)`, instead of the *actual* dimensions as shown in the graph above. That's because Thinc allows **defining models with missing shapes** and is able to **infer the missing shapes from the data** when you call `model.initialize`. The model visualized here doesn't define all its shapes, so the labels are incomplete." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "visualize_model(model)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To fill in the missing shapes, we can call `model.initialize` with examples of the expected input `X` and output `Y`. Running `visualize_model` again now shows the complete shapes." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy\n", "\n", "X = numpy.zeros((5, 784), dtype=\"f\")\n", "Y = numpy.zeros((54000, 10), dtype=\"f\")\n", "model.initialize(X=X, Y=Y)\n", "\n", "visualize_model(model)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 2 } thinc-release-v9.1.1/examples/06_predicting_like_terms.ipynb000066400000000000000000000543101467064331700242050ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Predicting Like Polynomial Terms\n", "\n", "Remember in Algebra how you had to combine \"like terms\" to simplify problems? \n", "\n", "You'd see expressions such as `60 + 2x^3 - 6x + x^3 + 17x` in which there are **5** total terms but only **4** are \"like terms\". \n", "\n", "`2x^3` and `x^3` are like, and `-6x` and `17x` are like, while `60` doesn't have any like siblings.\n", "\n", "Can we teach a model to predict that there are `4` like terms in the above expression?\n", "\n", "Let's give it a shot using [Mathy](https://mathy.ai) to generate math problems and [thinc](https://github.com/explosion/thinc) to build a regression model that outputs the number of like terms in each input problem." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install \"thinc>=8.0.0\" mathy_core" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sketch a Model\n", "\n", "Before we get started it can be good to have an idea of what input/output shapes we want for our model.\n", "\n", "We'll convert text math problems into lists of lists of integers, so our example (X) type can be represented using thinc's `Ints2d` type.\n", "\n", "The model will predict how many like terms there are in each sequence, so our output (Y) type can represented with the `Floats2d` type.\n", "\n", "Knowing the thinc types we want enables us to create an alias for our model, so we only have to type out the verbose generic signature once." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from typing import List\n", "from thinc.api import Model\n", "from thinc.types import Ints2d, Floats1d\n", "\n", "ModelX = Ints2d\n", "ModelY = Floats1d\n", "ModelT = Model[List[ModelX], ModelY]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Encode Text Inputs\n", "\n", "Mathy generates ascii-math problems and we have to encode them into integers that the model can process. \n", "\n", "To do this we'll build a vocabulary of all the possible characters we'll see, and map each input character to its index in the list.\n", "\n", "For math problems our vocabulary will include all the characters of the alphabet, numbers 0-9, and special characters like `*`, `-`, `.`, etc." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from typing import List\n", "from thinc.api import Model\n", "from thinc.types import Ints2d, Floats1d\n", "from thinc.api import Ops, get_current_ops\n", "\n", "vocab = \" .+-/^*()[]-01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n", "\n", "def encode_input(text: str) -> ModelX:\n", " ops: Ops = get_current_ops()\n", " indices: List[List[int]] = []\n", " for c in text:\n", " if c not in vocab:\n", " raise ValueError(f\"'{c}' missing from vocabulary in text: {text}\")\n", " indices.append([vocab.index(c)])\n", " return ops.asarray2i(indices)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Try It\n", "\n", "Let's try it out on some fixed data to be sure it works. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "outputs = encode_input(\"4+2\")\n", "assert outputs[0][0] == vocab.index(\"4\")\n", "assert outputs[1][0] == vocab.index(\"+\")\n", "assert outputs[2][0] == vocab.index(\"2\")\n", "print(outputs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Generate Math Problems\n", "\n", "We'll use Mathy to generate random polynomial problems with a variable number of like terms. The generated problems will act as training data for our model." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from typing import List, Optional, Set\n", "import random\n", "from mathy_core.problems import gen_simplify_multiple_terms\n", "\n", "def generate_problems(number: int, exclude: Optional[Set[str]] = None) -> List[str]:\n", " if exclude is None:\n", " exclude = set()\n", " problems: List[str] = []\n", " while len(problems) < number:\n", " text, complexity = gen_simplify_multiple_terms(\n", " random.randint(2, 6),\n", " noise_probability=1.0,\n", " noise_terms=random.randint(2, 10),\n", " op=[\"+\", \"-\"],\n", " )\n", " assert text not in exclude, \"duplicate problem generated!\"\n", " exclude.add(text)\n", " problems.append(text)\n", " return problems" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Try It" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "generate_problems(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Count Like Terms\n", "\n", "Now that we can generate input problems, we'll need a function that can count the like terms in each one and return the value for use as a label.\n", "\n", "To accomplish this we'll use a few helpers from mathy to enumerate the terms and compare them to see if they're like." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from typing import Optional, List, Dict\n", "from mathy_core import MathExpression, ExpressionParser, get_terms, get_term_ex, TermEx\n", "from mathy_core.problems import mathy_term_string\n", "\n", "parser = ExpressionParser()\n", "\n", "def count_like_terms(input_problem: str) -> int:\n", " expression: MathExpression = parser.parse(input_problem)\n", " term_nodes: List[MathExpression] = get_terms(expression)\n", " node_groups: Dict[str, List[MathExpression]] = {}\n", " for term_node in term_nodes:\n", " ex: Optional[TermEx] = get_term_ex(term_node)\n", " assert ex is not None, f\"invalid expression {term_node}\"\n", " key = mathy_term_string(variable=ex.variable, exponent=ex.exponent)\n", " if key == \"\":\n", " key = \"const\"\n", " if key not in node_groups:\n", " node_groups[key] = [term_node]\n", " else:\n", " node_groups[key].append(term_node)\n", " like_terms = 0\n", " for k, v in node_groups.items():\n", " if len(v) <= 1:\n", " continue\n", " like_terms += len(v)\n", " return like_terms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Try It" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "assert count_like_terms(\"4x - 2y + q\") == 0\n", "assert count_like_terms(\"x + x + z\") == 2\n", "assert count_like_terms(\"4x + 2x - x + 7\") == 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Generate Problem/Answer pairs\n", "\n", "Now that we can generate problems, count the number of like terms in them, and encode their text into integers, we have the pieces required to generate random problems and answers that we can train a neural network with.\n", "\n", "Let's write a function that will return a tuple of: the problem text, its encoded example form, and the output label." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from typing import Tuple\n", "from thinc.api import Ops, get_current_ops\n", "\n", "def to_example(input_problem: str) -> Tuple[str, ModelX, ModelY]:\n", " ops: Ops = get_current_ops()\n", " encoded_input = encode_input(input_problem)\n", " like_terms = count_like_terms(input_problem)\n", " return input_problem, encoded_input, ops.asarray1f([like_terms])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Try It" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "text, X, Y = to_example(\"x+2x\")\n", "assert text == \"x+2x\"\n", "assert X[0] == vocab.index(\"x\")\n", "assert Y[0] == 2\n", "print(text, X, Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Build a Model\n", "\n", "Now that we can generate X/Y values, let's define our model and verify that it can process a single input/output.\n", "\n", "For this we'll use Thinc and the `define_operators` context manager to connect the pieces together using overloaded operators for `chain` and `clone` operations." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from typing import List\n", "from thinc.model import Model\n", "from thinc.api import concatenate, chain, clone, list2ragged\n", "from thinc.api import reduce_sum, Mish, with_array, Embed, residual\n", "\n", "def build_model(n_hidden: int, dropout: float = 0.1) -> ModelT:\n", " with Model.define_operators({\">>\": chain, \"|\": concatenate, \"**\": clone}):\n", " model = (\n", " # Iterate over each element in the batch\n", " with_array(\n", " # Embed the vocab indices\n", " Embed(n_hidden, len(vocab), column=0)\n", " # Activate each batch of embedding sequences separately first\n", " >> Mish(n_hidden, dropout=dropout)\n", " )\n", " # Convert to ragged so we can use the reduction layers\n", " >> list2ragged()\n", " # Sum the features for each batch input\n", " >> reduce_sum()\n", " # Process with a small resnet\n", " >> residual(Mish(n_hidden, normalize=True)) ** 4\n", " # Convert (batch_size, n_hidden) to (batch_size, 1)\n", " >> Mish(1)\n", " )\n", " return model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Try It\n", "\n", "Let's pass an example through the model to make sure we have all the sizes right." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "text, X, Y = to_example(\"14x + 2y - 3x + 7x\")\n", "m = build_model(12)\n", "m.initialize([X], m.ops.asarray(Y, dtype=\"f\"))\n", "mY = m.predict([X])\n", "print(mY.shape)\n", "assert mY.shape == (1, 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Generate Training Datasets\n", "\n", "Now that we can generate examples and we have a model that can process them, let's generate random unique training and evaluation datasets.\n", "\n", "For this we'll write another helper function that can generate (n) training examples and respects an exclude list to avoid letting examples from the training/test sets overlap." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from typing import Tuple, Optional, Set, List\n", "\n", "DatasetTuple = Tuple[List[str], List[ModelX], List[ModelY]]\n", "\n", "def generate_dataset(\n", " size: int,\n", " exclude: Optional[Set[str]] = None,\n", ") -> DatasetTuple:\n", " ops: Ops = get_current_ops()\n", " texts: List[str] = generate_problems(size, exclude=exclude)\n", " examples: List[ModelX] = []\n", " labels: List[ModelY] = []\n", " for i, text in enumerate(texts):\n", " text, x, y = to_example(text)\n", " examples.append(x)\n", " labels.append(y)\n", "\n", " return texts, examples, labels" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Try It\n", "\n", "Generate a small dataset to be sure everything is working as expected" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "texts, x, y = generate_dataset(10)\n", "assert len(texts) == 10\n", "assert len(x) == 10\n", "assert len(y) == 10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Evaluate Model Performance\n", "\n", "We're almost ready to train our model, we just need to write a function that will check a given trained model against a given dataset and return a 0-1 score of how accurate it was.\n", "\n", "We'll use this function to print the score as training progresses and print final test predictions at the end of training." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from typing import List\n", "from wasabi import msg\n", "\n", "def evaluate_model(\n", " model: ModelT,\n", " *,\n", " print_problems: bool = False,\n", " texts: List[str],\n", " X: List[ModelX],\n", " Y: List[ModelY],\n", "):\n", " Yeval = model.predict(X)\n", " correct_count = 0\n", " print_n = 12\n", " if print_problems:\n", " msg.divider(f\"eval samples max({print_n})\")\n", " for text, y_answer, y_guess in zip(texts, Y, Yeval):\n", " y_guess = round(float(y_guess))\n", " correct = y_guess == int(y_answer)\n", " print_fn = msg.fail\n", " if correct:\n", " correct_count += 1\n", " print_fn = msg.good\n", " if print_problems and print_n > 0:\n", " print_n -= 1\n", " print_fn(f\"Answer[{int(y_answer[0])}] Guess[{y_guess}] Text: {text}\")\n", " if print_problems:\n", " print(f\"Model predicted {correct_count} out of {len(X)} correctly.\")\n", " return correct_count / len(X)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Try It\n", "\n", "Let's try it out with an untrained model and expect to see a really sad score." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "texts, X, Y = generate_dataset(128)\n", "m = build_model(12)\n", "m.initialize(X, m.ops.asarray(Y, dtype=\"f\"))\n", "# Assume the model should do so poorly as to round down to 0\n", "assert round(evaluate_model(m, texts=texts, X=X, Y=Y)) == 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Train/Evaluate a Model\n", "\n", "The final helper function we need is one to train and evaluate a model given two input datasets. \n", "\n", "This function does a few things:\n", "\n", " 1. Create an Adam optimizer we can use for minimizing the model's prediction error.\n", " 2. Loop over the given training dataset (epoch) number of times.\n", " 3. For each epoch, make batches of (batch_size) examples. For each batch(X), predict the number of like terms (Yh) and subtract the known answers (Y) to get the prediction error. Update the model using the optimizer with the calculated error.\n", " 5. After each epoch, check the model performance against the evaluation dataset.\n", " 6. Save the model weights for the best score out of all the training epochs.\n", " 7. After all training is done, restore the best model and print results from the evaluation set." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from thinc.api import Adam\n", "from wasabi import msg\n", "import numpy\n", "from tqdm.auto import tqdm\n", "\n", "def train_and_evaluate(\n", " model: ModelT,\n", " train_tuple: DatasetTuple,\n", " eval_tuple: DatasetTuple,\n", " *,\n", " lr: float = 3e-3,\n", " batch_size: int = 64,\n", " epochs: int = 48,\n", ") -> float:\n", " (train_texts, train_X, train_y) = train_tuple\n", " (eval_texts, eval_X, eval_y) = eval_tuple\n", " msg.divider(\"Train and Evaluate Model\")\n", " msg.info(f\"Batch size = {batch_size}\\tEpochs = {epochs}\\tLearning Rate = {lr}\")\n", "\n", " optimizer = Adam(lr)\n", " best_score: float = 0.0\n", " best_model: Optional[bytes] = None\n", " for n in range(epochs):\n", " loss = 0.0\n", " batches = model.ops.multibatch(batch_size, train_X, train_y, shuffle=True)\n", " for X, Y in tqdm(batches, leave=False, unit=\"batches\"):\n", " Y = model.ops.asarray(Y, dtype=\"float32\")\n", " Yh, backprop = model.begin_update(X)\n", " err = Yh - Y\n", " backprop(err)\n", " loss += (err ** 2).sum()\n", " model.finish_update(optimizer)\n", " score = evaluate_model(model, texts=eval_texts, X=eval_X, Y=eval_y)\n", " if score > best_score:\n", " best_model = model.to_bytes()\n", " best_score = score\n", " print(f\"{n}\\t{score:.2f}\\t{loss:.2f}\")\n", "\n", " if best_model is not None:\n", " model.from_bytes(best_model)\n", " print(f\"Evaluating with best model\")\n", " score = evaluate_model(\n", " model, texts=eval_texts, print_problems=True, X=eval_X, Y=eval_y\n", " )\n", " print(f\"Final Score: {score}\")\n", " return score\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll generate the dataset first, so we can iterate on the model without having to spend time generating examples for each run. This also ensures we have the same dataset across different model runs, to make it easier to compare performance." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "train_size = 1024 * 8\n", "test_size = 2048\n", "seen_texts: Set[str] = set()\n", "with msg.loading(f\"Generating train dataset with {train_size} examples...\"):\n", " train_dataset = generate_dataset(train_size, seen_texts)\n", "msg.good(f\"Train set created with {train_size} examples.\")\n", "with msg.loading(f\"Generating eval dataset with {test_size} examples...\"):\n", " eval_dataset = generate_dataset(test_size, seen_texts)\n", "msg.good(f\"Eval set created with {test_size} examples.\")\n", "init_x = train_dataset[1][:2]\n", "init_y = train_dataset[2][:2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we can build, train, and evaluate our model!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = build_model(64)\n", "model.initialize(init_x, init_y)\n", "train_and_evaluate(\n", " model, train_dataset, eval_dataset, lr=2e-3, batch_size=64, epochs=16\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Intermediate Exercise\n", "\n", "The model we built can train up to ~80% given 100 or more epochs. Improve the model architecture so that it trains to a similar accuracy while requiring fewer epochs or a smaller dataset size." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from typing import List\n", "from thinc.model import Model\n", "from thinc.types import Array2d, Array1d\n", "from thinc.api import chain, clone, list2ragged, reduce_mean, Mish, with_array, Embed, residual\n", "\n", "def custom_model(n_hidden: int, dropout: float = 0.1) -> Model[List[Array2d], Array2d]:\n", " # Put your custom architecture here\n", " return build_model(n_hidden, dropout)\n", "\n", "model = custom_model(64)\n", "model.initialize(init_x, init_y)\n", "train_and_evaluate(\n", " model, train_dataset, eval_dataset, lr=2e-3, batch_size=64, epochs=16\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Advanced Exercise\n", "\n", "Rewrite the model to encode the whole expression with a BiLSTM, and then generate pairs of terms, using the BiLSTM vectors. Over each pair of terms, predict whether the terms are alike or unlike." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from dataclasses import dataclass\n", "from thinc.types import Array2d, Ragged\n", "from thinc.model import Model\n", "\n", "\n", "@dataclass\n", "class Comparisons:\n", " data: Array2d # Batch of vectors for each pair\n", " indices: Array2d # Int array of shape (N, 3), showing the (batch, term1, term2) positions\n", "\n", "def pairify() -> Model[Ragged, Comparisons]:\n", " \"\"\"Create pair-wise comparisons for items in a sequence. For each sequence of N\n", " items, there will be (N**2-N)/2 comparisons.\"\"\"\n", " ...\n", "\n", "def predict_over_pairs(model: Model[Array2d, Array2d]) -> Model[Comparisons, Comparisons]:\n", " \"\"\"Apply a prediction model over a batch of comparisons. Outputs a Comparisons\n", " object where the data is the scores. The prediction model should predict over\n", " two classes, True and False.\"\"\"\n", " ...\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 4 } thinc-release-v9.1.1/examples/benchmarks/000077500000000000000000000000001467064331700204015ustar00rootroot00000000000000thinc-release-v9.1.1/examples/benchmarks/lstm_tagger.py000066400000000000000000000105121467064331700232620ustar00rootroot00000000000000""" Compare tagging speed for LSTM, using dummy data. Results on CPU laptop: PyTorchLSTM.v1: Predicted 39017 4.033804399892688 Ys[0] 0.05000001 5.551115e-17 LSTM (NumpyOps): Predicted 39018 13.174870599992573 Ys[0] 0.05000001 5.551115e-17 So PyTorch is 3x faster currently. """ from typing import List import typer import tqdm import numpy.random from timeit import default_timer as timer from thinc.api import Model, Config, registry from thinc.api import chain, list2padded, with_array, with_padded from thinc.api import to_categorical, set_current_ops from thinc.api import Ops, NumpyOps, CupyOps, fix_random_seed, require_gpu from thinc.types import Ints1d, Ints2d, Floats2d, Padded CONFIG = """ [data] n_samples = 1000 n_tags = 20 n_vocab = 10000 length_mean = 50 length_variance = 5 [common] width = 300 [model] @layers = "LSTMTagger.v1" [model.embed] @layers = "Embed.v1" nO = ${common:width} nV = ${data:n_vocab} column = 0 [model.encode] @layers = "LSTM.v1" nO = ${common:width} nI = ${common:width} depth = 2 bi = true [model.predict] @layers = "Linear.v1" nO = ${data:n_tags} """ @registry.layers("LSTMTagger.v1") def build_tagger( embed: Model[Ints2d, Floats2d], encode: Model[Padded, Padded], predict: Model[Floats2d, Floats2d], ) -> Model[List[Ints1d], Padded]: model = chain( with_array(embed), with_padded(encode), with_array(predict), list2padded() ) model.set_ref("embed", embed) model.set_ref("encode", encode) model.set_ref("predict", model.layers[-1]) return model def get_dummy_data(n_samples, n_tags, n_vocab, length_mean, length_variance): Xs = [] Ys = [] for _ in range(n_samples): length = numpy.random.normal(size=1, scale=length_variance) + length_mean shape = (max(1, int(length)),) X = numpy.random.uniform(0, n_vocab - 1, shape) Y = numpy.random.uniform(0, n_tags - 1, shape) assert X.size, length assert Y.size, length Xs.append(X.reshape((-1, 1)).astype("i")) Ys.append(to_categorical(Y.astype("i"))) return Xs, Ys def run_forward(model, Xs, n_times=1): total = 0.0 for _ in range(n_times): for batch in tqdm.tqdm(Xs): Y = model.predict(batch) total += Y.data.sum() return float(total) def run_forward_backward(model, batches, n_times=1): total = 0.0 for _ in range(n_times): for X, Y in tqdm.tqdm(batches): Yh, get_dX = model.begin_update(X) get_dX(Yh) total += Yh.data.sum() return float(total) def set_backend(name, gpu_id): global CONFIG if name == "generic": set_current_ops(Ops()) else: if gpu_id == -1: set_current_ops(NumpyOps(use_blis=True)) else: set_current_ops(CupyOps()) if name == "pytorch": import torch torch.set_num_threads(1) CONFIG = CONFIG.replace("LSTM.v1", "PyTorchLSTM.v1") def main( numpy: bool = False, pytorch: bool = False, generic: bool = False, gpu_id: int = -1 ): global CONFIG fix_random_seed(0) if gpu_id >= 0: require_gpu(gpu_id) print("Set GPU", gpu_id) backends = {"pytorch": pytorch, "numpy": numpy, "generic": generic} for name, use_backend in backends.items(): if not use_backend: print(f"Skipping {name}") continue set_backend(name, gpu_id) print("Getting data") C = registry.resolve(Config().from_str(CONFIG)) model = C["model"] X, Y = get_dummy_data(**C["data"]) print("Copy to device") X = [model.ops.asarray(x) for x in X] Y = [model.ops.asarray(y) for y in Y] print("Begin init", len(X)) model.initialize(X=X[:5]) print("Pre-batch") n_words = sum(len(x) for x in X) batches = model.ops.multibatch(16, X, Y) batches = [(model.layers[0].predict(x), y) for x, y in batches] model.layers.pop(0) print("Start") start_time = timer() total = run_forward(model, [x for x, y in batches]) end_time = timer() print(name, n_words, total, end_time - start_time) start_time = timer() total = run_forward_backward(model, batches) end_time = timer() print(name, n_words, total, end_time - start_time) if __name__ == "__main__": typer.run(main) thinc-release-v9.1.1/examples/benchmarks/mappers.py000066400000000000000000000076221467064331700224310ustar00rootroot00000000000000from thinc.api import remap_ids_v2 from thinc.api import premap_ids from thinc.api import chain, Embed, HashEmbed import time import random import numpy as np import cupy as cp N_symbols = 200000 N_tokens = 50000 N_batch = 500 N_columns = 4 N_dim = 300 mapper = {} numbers = list(range(N_symbols)) random.shuffle(numbers) for v, k in enumerate(numbers): mapper[k] = v class time_context: """Register the running time of a context.""" def __enter__(self): self.start = time.perf_counter() return self def __exit__(self, type, value, traceback): self.elapsed = time.perf_counter() - self.start def speed_test_no_column(): remap = remap_ids_v2(mapper) premap = premap_ids(mapper) keys = np.random.randint(0, N_symbols, N_tokens) with time_context() as elapsed: for i in range(100): remap(keys, False) remaptime = elapsed.elapsed with time_context() as elapsed: for i in range(100): premap(keys, False) premaptime = elapsed.elapsed print("remap", remaptime) print("premap", premaptime) print("speedup", remaptime / premaptime) def speed_test_column(): remap = remap_ids_v2(mapper, column=3) premap = premap_ids(mapper, column=3) keys = np.random.randint(0, N_symbols, (N_tokens, N_columns)) with time_context() as elapsed: for i in range(100): remap(keys, False) remaptime = elapsed.elapsed with time_context() as elapsed: for i in range(100): premap(keys, False) premaptime = elapsed.elapsed print("remap", remaptime) print("premap", premaptime) print("speedup", remaptime / premaptime) def speed_test_cupy(): remap = remap_ids_v2(mapper) premap = premap_ids(mapper) keys = cp.random.randint(0, N_symbols, N_tokens) with time_context() as elapsed: for i in range(100): remap(keys, False) remaptime = elapsed.elapsed with time_context() as elapsed: for i in range(100): premap(keys, False) premaptime = elapsed.elapsed print("remap", remaptime) print("premap", premaptime) print("speedup", remaptime / premaptime) def speed_test_with_embed(): remap = chain(remap_ids_v2(mapper), Embed(N_dim, N_symbols)) premap = chain(premap_ids(mapper), Embed(N_dim, N_symbols)) remap.initialize() premap.initialize() keys = np.random.randint(0, N_symbols, N_tokens) with time_context() as elapsed: for i in range(100): remap(keys, False) remaptime = elapsed.elapsed with time_context() as elapsed: for i in range(100): premap(keys, False) premaptime = elapsed.elapsed print("remap", remaptime) print("premap", premaptime) print("speedup", remaptime / premaptime) def speed_test_cupy_with_embed(): remap = chain(remap_ids_v2(mapper), Embed(N_dim, N_symbols)) premap = chain(premap_ids(mapper), Embed(N_dim, N_symbols)) remap.initialize() premap.initialize() keys = cp.random.randint(0, N_symbols, N_tokens) with time_context() as elapsed: for i in range(100): remap(keys, False) remaptime = elapsed.elapsed with time_context() as elapsed: for i in range(100): premap(keys, False) premaptime = elapsed.elapsed print("remap", remaptime) print("premap", premaptime) print("speedup", remaptime / premaptime) def speed_test_hashembed(): embed = HashEmbed(N_dim, N_symbols) embed.initialize() keys = np.random.randint(0, N_symbols, N_tokens) with time_context() as elapsed: for i in range(100): embed(keys, False) print(elapsed.elapsed) print("No columns") speed_test_no_column() print("Columns") speed_test_column() print("Cupy") speed_test_cupy() print("With Embed") speed_test_with_embed() print("Cupy With Embed") speed_test_cupy_with_embed() print("HashEmbed speed") speed_test_hashembed() thinc-release-v9.1.1/examples/bloom_embeddings.ipynb000066400000000000000000002670341467064331700226340ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 3527, "status": "ok", "timestamp": 1648197799884, "user": { "displayName": "Vincent D. Warmerdam", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gh4KYzhhhK0YDTnAQsUIaQPw-0dKIP-kLBID7nFdQ=s64", "userId": "05641618555626735638" }, "user_tz": -60 }, "id": "ssfd1qsSxtRS", "outputId": "7c6e6585-2362-4be2-da05-db00a0307fe6", "tags": [] }, "outputs": [], "source": [ "%pip install mmh3 numpy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Bloom embeddings algorithm\n", "\n", "In a normal embedding table, each word-string is mapped to a distinct ID.\n", "Usually these IDs will be sequential, so if you have a vocabulary of 100 words,\n", "your words will be mapped to numbers `range(100)`. The sequential IDs can then\n", "be used as indices into an embedding table: if you have 100 words in your\n", "vocabulary, you have 100 rows in the table, and each word receives its own\n", "vector.\n", "\n", "However, there's no limit to the number of unique words that might occur in a\n", "sample of text, while we definitely want a limited number of rows in our\n", "embedding table. Some of the rows in our table will therefore need to be shared\n", "between multiple words in our vocabulary. One obvious solution is to set aside a\n", "single vector in the table. Words 0-98 will each receive their own vector, while\n", "all other words are assigned to vector 99.\n", "\n", "However, this asks vector 99 to do a lot of work. What if we gave more vectors\n", "to the unknown words?" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "executionInfo": { "elapsed": 10, "status": "ok", "timestamp": 1648197799885, "user": { "displayName": "Vincent D. Warmerdam", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gh4KYzhhhK0YDTnAQsUIaQPw-0dKIP-kLBID7nFdQ=s64", "userId": "05641618555626735638" }, "user_tz": -60 }, "id": "Eb895XpR-VUB" }, "outputs": [], "source": [ "def get_row(word_id, number_vector=100, number_oov=10):\n", " if word_id < (number_vector - number_oov):\n", " return word_id\n", " else:\n", " return number_vector + (word_id % number_oov)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This gives the model a little more resolution for the unknown words. If all\n", "out-of-vocabulary words are assigned the same vector, then they'll all look\n", "identical to the model. Even if the training data actually includes information\n", "that shows two different out-of-vocabulary words have important, different\n", "implications -- for instance, if one word is a strong indicator of positive\n", "sentiment, while the other is a strong indicator of negative sentiment -- the\n", "model won't be able to tell them apart. However, if we have 10 buckets for the\n", "unknown words, we might get lucky, and assign these words to different buckets.\n", "If so, the model would be able to learn that one of the unknown-word vectors\n", "makes positive sentiment more likely, while the other vector makes negative\n", "sentiment more likely.\n", "\n", "If this is good, then why not do more of it? Bloom embeddings are like an\n", "extreme version, where _every_ word is handled like the unknown words above:\n", "there are 100 vectors for the \"unknown\" portion, and 0 for the \"known\" portion.\n", "\n", "So far, this approach seems weird, but not necessarily good. The part that makes\n", "it unfairly effective is the next step: by simply doing the same thing multiple\n", "times, we can greatly improve the resolution, and have unique representations\n", "for far more words than we have vectors. The code in full:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "executionInfo": { "elapsed": 8, "status": "ok", "timestamp": 1648197799885, "user": { "displayName": "Vincent D. Warmerdam", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gh4KYzhhhK0YDTnAQsUIaQPw-0dKIP-kLBID7nFdQ=s64", "userId": "05641618555626735638" }, "user_tz": -60 }, "id": "tTkqM3EixhWM" }, "outputs": [], "source": [ "import numpy\n", "import mmh3\n", "\n", "def allocate(n_vectors, n_dimensions):\n", " table = numpy.zeros((n_vectors, n_dimensions), dtype='f')\n", " table += numpy.random.uniform(-0.1, 0.1, table.size).reshape(table.shape)\n", " return table\n", "\n", "def get_vector(table, word):\n", " hash1 = mmh3.hash(word, seed=0)\n", " hash2 = mmh3.hash(word, seed=1)\n", " row1 = hash1 % table.shape[0]\n", " row2 = hash2 % table.shape[0]\n", " return table[row1] + table[row2]\n", "\n", "def update_vector(table, word, d_vector):\n", " hash1 = mmh3.hash(word, seed=0)\n", " hash2 = mmh3.hash(word, seed=1)\n", " row1 = hash1 % table.shape[0]\n", " row2 = hash2 % table.shape[0]\n", " table[row1] -= 0.001 * d_vector\n", " table[row2] -= 0.001 * d_vector" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example, we've used two keys, assigned from two random hash functions.\n", "It's unlikely that two words will collide on both keys, so by simply summing the\n", "vectors together, we'll assign most words a unique representation.\n", "\n", "For the sake of illustration, let's step through a very small example,\n", "explicitly.\n", "\n", "Let's say we have this vocabulary of 20 words:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "executionInfo": { "elapsed": 8, "status": "ok", "timestamp": 1648197799885, "user": { "displayName": "Vincent D. Warmerdam", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gh4KYzhhhK0YDTnAQsUIaQPw-0dKIP-kLBID7nFdQ=s64", "userId": "05641618555626735638" }, "user_tz": -60 }, "id": "QMaz-mr9xjPG" }, "outputs": [], "source": [ "vocab = ['apple', 'strawberry', 'orange', 'juice', 'drink', 'smoothie',\n", " 'eat', 'fruit', 'health', 'wellness', 'steak', 'fries', 'ketchup',\n", " 'burger', 'chips', 'lobster', 'caviar', 'service', 'waiter', 'chef']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll embed these into two dimensions. Normally this would give us a table of\n", "`(20, 2)` floats, which we would randomly initialise. With the hashing trick, we\n", "can make the table smaller. Let's give it 15 vectors:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "executionInfo": { "elapsed": 8, "status": "ok", "timestamp": 1648197799886, "user": { "displayName": "Vincent D. Warmerdam", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gh4KYzhhhK0YDTnAQsUIaQPw-0dKIP-kLBID7nFdQ=s64", "userId": "05641618555626735638" }, "user_tz": -60 }, "id": "LNg60lvqxkmP" }, "outputs": [], "source": [ "normal_embed = numpy.random.uniform(-0.1, 0.1, (20, 2))\n", "hashed_embed = numpy.random.uniform(-0.1, 0.1, (15, 2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the normal table, we want to map each word in our vocabulary to its own\n", "vector:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "executionInfo": { "elapsed": 5, "status": "ok", "timestamp": 1648197801914, "user": { "displayName": "Vincent D. Warmerdam", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gh4KYzhhhK0YDTnAQsUIaQPw-0dKIP-kLBID7nFdQ=s64", "userId": "05641618555626735638" }, "user_tz": -60 }, "id": "9wFC_iR_xlBH" }, "outputs": [], "source": [ "word2id = {}\n", "def get_normal_vector(word, table):\n", " if word not in word2id.keys():\n", " word2id[word] = len(word2id)\n", " return table[word2id[word]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The hashed table only has 15 rows, so some words will have to share. We'll\n", "handle this by mapping the word into an arbitrary integer – called a \"hash\n", "value\". The hash function will return an arbitrary integer, which we'll mod into\n", "the range `(0, 15)`. Importantly, we need to be able to compute _multiple,\n", "distinct_ hash values for each key – so Python's built-in hash function is\n", "inconvenient. We'll therefore use MurmurHash.\n", "\n", "Let's see what keys we get for our 20 vocabulary items, using MurmurHash:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "executionInfo": { "elapsed": 4, "status": "ok", "timestamp": 1648197804508, "user": { "displayName": "Vincent D. Warmerdam", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gh4KYzhhhK0YDTnAQsUIaQPw-0dKIP-kLBID7nFdQ=s64", "userId": "05641618555626735638" }, "user_tz": -60 }, "id": "Gs69d2KRxmg9" }, "outputs": [], "source": [ "hashes1 = [mmh3.hash(w, 1) % 15 for w in vocab]\n", "assert hashes1 == [3, 6, 4, 13, 8, 3, 13, 1, 9, 12, 11, 4, 2, 13, 5, 10, 0, 2, 10, 13]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, some keys are shared between multiple words, while 2/15 keys are\n", "unoccupied. This is obviously unideal! If multiple words have the same key,\n", "they'll map to the same vector – as far as the model is concerned, \"strawberry\"\n", "and \"heart\" will be indistinguishable. It won't be clear which word was used –\n", "they have the same representation.\n", "\n", "To address this, we simply hash the words again, this time using a different\n", "seed – so that we get a different set of arbitrary keys:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "executionInfo": { "elapsed": 3, "status": "ok", "timestamp": 1648197804508, "user": { "displayName": "Vincent D. Warmerdam", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gh4KYzhhhK0YDTnAQsUIaQPw-0dKIP-kLBID7nFdQ=s64", "userId": "05641618555626735638" }, "user_tz": -60 }, "id": "acpOxkljynPo" }, "outputs": [], "source": [ "from collections import Counter\n", "\n", "hashes2 = [mmh3.hash(w, 2) % 15 for w in vocab]\n", "assert len(Counter(hashes2).most_common()) == 12" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This one's even worse – 3 keys unoccupied! But our strategy is not to keep drawing until we get a favorable seed. Instead, consider this:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "executionInfo": { "elapsed": 3, "status": "ok", "timestamp": 1648197805024, "user": { "displayName": "Vincent D. Warmerdam", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gh4KYzhhhK0YDTnAQsUIaQPw-0dKIP-kLBID7nFdQ=s64", "userId": "05641618555626735638" }, "user_tz": -60 }, "id": "W7tfxLQBytWP" }, "outputs": [], "source": [ "assert len(Counter(zip(hashes1, hashes2))) == 20" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By combining the results from the two hashes, our 20 words distribute perfectly,\n", "into 20 unique combinations. This makes sense: we expect to have some words\n", "overlapping on one of the keys, but we'd have to be very unlucky for a pair of\n", "words to overlap on _both_ keys.\n", "\n", "This means that if we simply add the two vectors together, each word once more\n", "has a unique representation:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 2, "status": "ok", "timestamp": 1648197805764, "user": { "displayName": "Vincent D. Warmerdam", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gh4KYzhhhK0YDTnAQsUIaQPw-0dKIP-kLBID7nFdQ=s64", "userId": "05641618555626735638" }, "user_tz": -60 }, "id": "wI5yayZWyxVP", "outputId": "4f62b77d-709f-483b-a0bb-4e5fbe68d5fe" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "apple -0.033 -0.012\n", "strawberry -0.023 -0.037\n", "orange 0.158 -0.031\n", "juice -0.045 0.139\n", "drink 0.024 0.030\n", "smoothie 0.121 0.076\n", "eat -0.093 0.153\n", "fruit 0.083 0.052\n", "health 0.064 -0.046\n", "wellness 0.143 0.112\n", "steak 0.011 -0.097\n", "fries 0.036 0.041\n", "ketchup 0.081 0.029\n", "burger -0.045 0.139\n", "chips -0.118 -0.090\n", "lobster 0.016 -0.107\n", "caviar -0.033 -0.012\n", "service 0.081 0.029\n", "waiter 0.179 -0.038\n", "chef -0.047 0.062\n" ] } ], "source": [ "for word in vocab:\n", " key1 = mmh3.hash(word, 0) % 15\n", " key2 = mmh3.hash(word, 1) % 15\n", " vector = hashed_embed[key1] + hashed_embed[key2]\n", " print(word, '%.3f %.3f' % tuple(vector))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now have a function that maps our 20 words to 20 unique vectors – but we're\n", "storing weights for only 15 vectors in memory. Now the question is: will we be\n", "able to find values for these weights that let us actually map words to useful\n", "vectors?\n", "\n", "Let's do a quick experiment to see how this works. We'll assign \"true\" values\n", "for our little vocabulary, and see how well we can approximate them with our\n", "compressed table. To get the \"true\" values, we _could_ put the \"science\" in data\n", "science, and drag the words around into reasonable-looking clusters. But for our\n", "purposes, the actual \"true\" values don't matter. We'll therefore just do a\n", "simulation: we'll assign random vectors as the \"true\" state, and see if we can\n", "learn values for the hash embeddings that match them.\n", "\n", "The learning procedure will be a simple stochastic gradient descent:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "background_save": true }, "executionInfo": { "elapsed": 3, "status": "aborted", "timestamp": 1648199186370, "user": { "displayName": "Vincent D. Warmerdam", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gh4KYzhhhK0YDTnAQsUIaQPw-0dKIP-kLBID7nFdQ=s64", "userId": "05641618555626735638" }, "user_tz": -60 }, "id": "ET4n9AA5y0fX" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "499 43.47128495286\n" ] } ], "source": [ "import numpy\n", "import numpy.random as random\n", "import mmh3\n", "\n", "random.seed(0)\n", "nb_epoch = 500\n", "learn_rate = 0.001\n", "nr_hash_vector = 1000\n", "\n", "words = [str(i) for i in range(2000)]\n", "true_vectors = numpy.random.uniform(-0.1, 0.1, (len(words), 10))\n", "hash_vectors = numpy.random.uniform(-0.1, 0.1, (nr_hash_vector, 10))\n", "examples = list(zip(words, true_vectors))\n", "\n", "for epoch in range(nb_epoch):\n", " random.shuffle(examples)\n", " loss=0.\n", " for word, truth in examples:\n", " key1 = mmh3.hash(word, 0) % nr_hash_vector\n", " key2 = mmh3.hash(word, 1) % nr_hash_vector\n", " hash_vector = hash_vectors[key1] + hash_vectors[key2]\n", " diff = hash_vector - truth\n", " hash_vectors[key1] -= learn_rate * diff\n", " hash_vectors[key2] -= learn_rate * diff\n", " loss += (diff**2).sum()\n", "print(epoch, loss)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's worth taking some time to play with this simulation. You can start by doing\n", "some sanity checks:\n", "\n", "- How does the loss change with `nr_hash_vector`?\n", "- If you remove `key2`, does the loss go up?\n", "- What happens if you add more hash keys?\n", "- What happens as the vocabulary size increases?\n", "- What happens when more dimensions are added?\n", "- How sensitive are the hash embeddings to the initial conditions? If we change the random seed, do we ever get unlucky?\n", "\n", "If you play with the simulation for a while, you'll start to get a good feel for\n", "the dynamics, and hopefully you'll have a clear idea of why the technique works." ] }, { "cell_type": "markdown", "metadata": { "id": "TuRoY34yQb0v", "tags": [] }, "source": [ "## Bonus Section \n", "\n", "To make it easier for folks to try out a whole bunch of settings we'd added a little bit of code below that makes it easier to get relevant visuals." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 2919, "status": "ok", "timestamp": 1648200042349, "user": { "displayName": "Vincent D. Warmerdam", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gh4KYzhhhK0YDTnAQsUIaQPw-0dKIP-kLBID7nFdQ=s64", "userId": "05641618555626735638" }, "user_tz": -60 }, "id": "NPVKX_pbXJYs", "outputId": "fc046666-d690-426d-b8a7-dc557f12832d", "tags": [] }, "outputs": [], "source": [ "%pip install altair pandas" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": { "background_save": true }, "id": "nHd1wo6m1q-J" }, "outputs": [], "source": [ "from functools import reduce \n", "\n", "\n", "def calc_losses(epochs=500, seed=0, learn_rate=0.001, nr_hash_vector=1000, n_hash=3, n_words=1000, size_vector=10):\n", " random.seed(seed)\n", " nb_epoch = epochs\n", " learn_rate = learn_rate\n", " nr_hash_vector = nr_hash_vector\n", "\n", " words = [str(i) for i in range(n_words)]\n", " true_vectors = numpy.random.uniform(-0.1, 0.1, (len(words), size_vector))\n", " hash_vectors = numpy.random.uniform(-0.1, 0.1, (nr_hash_vector, size_vector))\n", " examples = list(zip(words, true_vectors))\n", "\n", " losses = []\n", " for epoch in range(nb_epoch):\n", " random.shuffle(examples)\n", " loss=0.\n", " for word, truth in examples:\n", " keys = [mmh3.hash(word, k) % nr_hash_vector for k in range(n_hash)]\n", " hash_vector = reduce(lambda a, b: a + b, [hash_vectors[k] for k in keys])\n", " diff = hash_vector - truth\n", " for key in keys:\n", " hash_vectors[key] -= learn_rate * diff\n", " loss += (diff**2).sum()\n", " losses.append(loss)\n", " return losses\n", "\n", "data = []\n", "for n_hash in [1, 2, 3, 4, 5]:\n", " losses = calc_losses(nr_hash_vector=2_000, n_words=10_000, n_hash=n_hash, epochs=150)\n", " data = data + [{\"loss\": l, \"nr_hash_vector\": nr_hash_vector, \"n_hash\": str(n_hash), \"epoch\": e} for e, l in enumerate(losses)]" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "colab": { "background_save": true }, "id": "P0Q0k9bjXMm3" }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "import altair as alt\n", "\n", "source = pd.DataFrame(data)\n", "\n", "(alt.Chart(source)\n", " .mark_line()\n", " .encode(x='epoch', y='loss', color='n_hash')\n", " .properties(width=600, height=250)\n", " .interactive())" ] } ], "metadata": { "colab": { "authorship_tag": "ABX9TyPAXtr/TeMWYmJkxrXcAPIT", "collapsed_sections": [], "name": "bloom_embeddings.ipynb", "version": "" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.6" } }, "nbformat": 4, "nbformat_minor": 4 } thinc-release-v9.1.1/examples/mnist.py000066400000000000000000000030671467064331700177760ustar00rootroot00000000000000""" PyTorch version: https://github.com/pytorch/examples/blob/master/mnist/main.py TensorFlow version: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist.py """ # pip install thinc ml_datasets typer from thinc.api import Model, chain, Relu, Softmax, Adam import ml_datasets from wasabi import msg from tqdm import tqdm import typer def main( n_hidden: int = 256, dropout: float = 0.2, n_iter: int = 10, batch_size: int = 128 ): # Define the model model: Model = chain( Relu(nO=n_hidden, dropout=dropout), Relu(nO=n_hidden, dropout=dropout), Softmax(), ) # Load the data (train_X, train_Y), (dev_X, dev_Y) = ml_datasets.mnist() # Set any missing shapes for the model. model.initialize(X=train_X[:5], Y=train_Y[:5]) train_data = model.ops.multibatch(batch_size, train_X, train_Y, shuffle=True) dev_data = model.ops.multibatch(batch_size, dev_X, dev_Y) # Create the optimizer. optimizer = Adam(0.001) for i in range(n_iter): for X, Y in tqdm(train_data, leave=False): Yh, backprop = model.begin_update(X) backprop(Yh - Y) model.finish_update(optimizer) # Evaluate and print progress correct = 0 total = 0 for X, Y in dev_data: Yh = model.predict(X) correct += (Yh.argmax(axis=1) == Y.argmax(axis=1)).sum() total += Yh.shape[0] score = correct / total msg.row((i, f"{score:.3f}"), widths=(3, 5)) if __name__ == "__main__": typer.run(main) thinc-release-v9.1.1/examples/transformers_tagger.py000066400000000000000000000173221467064331700227210ustar00rootroot00000000000000"""Train a transformer tagging model, using Huggingface's Transformers.""" # pip install thinc ml_datasets typer tqdm transformers torch from dataclasses import dataclass from typing import List, Optional, Tuple, Callable import torch from pathlib import Path from transformers import AutoTokenizer, AutoModel import thinc from thinc.api import PyTorchWrapper, Softmax, chain, with_array, Model, Config from thinc.api import torch2xp, xp2torch, SequenceCategoricalCrossentropy from thinc.api import prefer_gpu, use_pytorch_for_gpu_memory from thinc.types import Floats2d, ArgsKwargs import ml_datasets import tqdm import typer CONFIG = """ [model] @layers = "TransformersTagger.v1" starter = "bert-base-multilingual-cased" [optimizer] @optimizers = "RAdam.v1" weight_decay = 1e-8 [optimizer.learn_rate] @schedules = "warmup_linear.v1" initial_rate = 0.01 warmup_steps = 3000 total_steps = 6000 [training] batch_size = 128 words_per_subbatch = 2000 n_epoch = 10 """ def main(path: Optional[Path] = None, out_dir: Optional[Path] = None): if prefer_gpu(): print("Using gpu!") use_pytorch_for_gpu_memory() # You can edit the CONFIG string within the file, or copy it out to # a separate file and pass in the path. if path is None: config = Config().from_str(CONFIG) else: config = Config().from_disk(path) # resolve constructs objects whenever you have blocks with an @ key. # In the optimizer block we write @optimizers = "Adam.v1". This tells Thinc # to use registry.optimizers to fetch the "Adam.v1" function. You can # register your own functions as well and build up trees of objects. C = thinc.registry.resolve(config) words_per_subbatch = C["training"]["words_per_subbatch"] n_epoch = C["training"]["n_epoch"] batch_size = C["training"]["batch_size"] model = C["model"] optimizer = C["optimizer"] calculate_loss = SequenceCategoricalCrossentropy() (train_X, train_Y), (dev_X, dev_Y) = ml_datasets.ud_ancora_pos_tags() # Convert the outputs to cupy (if we're using that) train_Y = list(map(model.ops.asarray, train_Y)) dev_Y = list(map(model.ops.asarray, dev_Y)) # Pass in a small batch of data, to fill in missing shapes model.initialize(X=train_X[:5], Y=train_Y[:5]) for epoch in range(n_epoch): # Transformers often learn best with large batch sizes -- larger than # fits in GPU memory. But you don't have to backprop the whole batch # at once. Here we consider the "logical" batch size (number of examples # per update) separately from the physical batch size. batches = model.ops.multibatch(batch_size, train_X, train_Y, shuffle=True) for outer_batch in tqdm.tqdm(batches, leave=False): # For the physical batch size, what we care about is the number # of words (considering padding too). We also want to sort by # length, for efficiency. for batch in minibatch_by_words(outer_batch, words_per_subbatch): inputs, truths = zip(*batch) guesses, backprop = model(inputs, is_train=True) backprop(calculate_loss.get_grad(guesses, truths)) # At the end of the batch, we call the optimizer with the accumulated # gradients, and advance the learning rate schedules. model.finish_update(optimizer) optimizer.step_schedules() # You might want to evaluate more often than once per epoch; that's up # to you. score = evaluate_sequences(model, dev_X, dev_Y, 128) print(epoch, f"{score:.3f}") if out_dir: model.to_disk(out_dir / f"{epoch}.bin") @dataclass class TokensPlus: """Dataclass to hold the output of the Huggingface 'batch_encode_plus' method.""" input_ids: torch.Tensor token_type_ids: torch.Tensor attention_mask: torch.Tensor input_len: List[int] overflowing_tokens: Optional[torch.Tensor] = None num_truncated_tokens: Optional[torch.Tensor] = None special_tokens_mask: Optional[torch.Tensor] = None @thinc.registry.layers("TransformersTagger.v1") def TransformersTagger( starter: str, n_tags: int = 17 ) -> Model[List[List[str]], List[Floats2d]]: return chain( TransformersTokenizer(starter), Transformer(starter), with_array(Softmax(nO=n_tags)), ) @thinc.registry.layers("transformers_tokenizer.v1") def TransformersTokenizer(name: str) -> Model[List[List[str]], TokensPlus]: def forward( model, texts: List[List[str]], is_train: bool ) -> Tuple[TokensPlus, Callable]: tokenizer = model.attrs["tokenizer"] token_data = tokenizer.batch_encode_plus( [(text, None) for text in texts], add_special_tokens=True, return_token_type_ids=True, return_attention_masks=True, return_input_lengths=True, return_tensors="pt", ) return TokensPlus(**token_data), lambda d_tokens: [] return Model( "tokenizer", forward, attrs={"tokenizer": AutoTokenizer.from_pretrained(name)}, ) @thinc.registry.layers("transformers_model.v1") def Transformer(name: str) -> Model[TokensPlus, List[Floats2d]]: return PyTorchWrapper( AutoModel.from_pretrained(name), convert_inputs=convert_transformer_inputs, convert_outputs=convert_transformer_outputs, ) def convert_transformer_inputs(model, tokens: TokensPlus, is_train): kwargs = { "input_ids": tokens.input_ids, "attention_mask": tokens.attention_mask, "token_type_ids": tokens.token_type_ids, } return ArgsKwargs(args=(), kwargs=kwargs), lambda dX: [] def convert_transformer_outputs(model, inputs_outputs, is_train): layer_inputs, torch_outputs = inputs_outputs torch_tokvecs: torch.Tensor = torch_outputs[0] # Free the memory as soon as we can torch_outputs = None lengths = list(layer_inputs.input_len) tokvecs: List[Floats2d] = model.ops.unpad(torch2xp(torch_tokvecs), lengths) # Remove the BOS and EOS markers. tokvecs = [arr[1:-1] for arr in tokvecs] def backprop(d_tokvecs: List[Floats2d]) -> ArgsKwargs: # Restore entries for bos and eos markers. shim = model.shims[0] row = model.ops.alloc2f(1, d_tokvecs[0].shape[1]) d_tokvecs = [model.ops.xp.vstack((row, arr, row)) for arr in d_tokvecs] return ArgsKwargs( args=(torch_tokvecs,), kwargs={ "grad_tensors": xp2torch(model.ops.pad(d_tokvecs, device=shim.device)) }, ) return tokvecs, backprop def evaluate_sequences( model, Xs: List[Floats2d], Ys: List[Floats2d], batch_size: int ) -> float: correct = 0.0 total = 0.0 for X, Y in model.ops.multibatch(batch_size, Xs, Ys): Yh = model.predict(X) for yh, y in zip(Yh, Y): correct += (y.argmax(axis=1) == yh.argmax(axis=1)).sum() total += y.shape[0] return float(correct / total) def minibatch_by_words(pairs, max_words): """Group pairs of sequences into minibatches under max_words in size, considering padding. The size of a padded batch is the length of its longest sequence multiplied by the number of elements in the batch. """ pairs = list(zip(*pairs)) pairs.sort(key=lambda xy: len(xy[0]), reverse=True) batch = [] for X, Y in pairs: batch.append((X, Y)) n_words = max(len(xy[0]) for xy in batch) * len(batch) if n_words >= max_words: # We went *over* the cap, so don't emit the batch with this # example -- move that example into the next one. yield batch[:-1] batch = [(X, Y)] if batch: yield batch if __name__ == "__main__": typer.run(main) thinc-release-v9.1.1/examples/type_checking.py000066400000000000000000000026561467064331700214630ustar00rootroot00000000000000from typing import List from thinc.layers import Relu, Softmax, chain, reduce_max, concatenate from thinc.model import Model # Define Custom X/Y types MyModelX = List[List[float]] MyModelY = List[List[float]] model: Model[MyModelX, MyModelY] = chain( Relu(12), Relu(12, dropout=0.2), Softmax(), ) # ERROR: incompatible type "bool", expected "List[List[float]]" model(False) # ERROR: List item 0 has incompatible type "str"; expected "float" model.begin_update([["0"]]) # ERROR: incompatible type "bool", expected "List[List[float]]" model.predict(True) # This example should be run with mypy. This is an example of type-level checking # for network validity. # # We first define an invalid network. # It's invalid because reduce_max expects Array3d as input, while Relu produces # Array2d as output. chain has type-logic to verify input and output types # line up. # # You should see the error an error, # examples/howto/type_chain.py:10: error: Cannot infer type argument 2 of "chain" bad_model = chain(Relu(10), reduce_max(), Softmax()) concate_model = concatenate(Relu(10), reduce_max(), Relu(10), Relu(10)), reduce_max() concate_chain_model = chain( concatenate(Relu(10), reduce_max(), Relu(10), Relu(10)), reduce_max() ) # Now let's try it with a network that does work, just to be sure. good_model = chain(Relu(10), Relu(10), Softmax()) # Finally we can reveal_type on the good model, to see what it thinks. reveal_type(good_model) thinc-release-v9.1.1/netlify.toml000066400000000000000000000001401467064331700170100ustar00rootroot00000000000000[build] base = "website" publish = "public" command = "npm run deploy" ignore = "false" thinc-release-v9.1.1/pyproject.toml000066400000000000000000000031171467064331700173640ustar00rootroot00000000000000[build-system] requires = [ "setuptools", "cython>=0.25,<3.0", "murmurhash>=1.0.2,<1.1.0", "cymem>=2.0.2,<2.1.0", "preshed>=3.0.2,<3.1.0", "blis>=1.0.0,<1.1.0", "numpy>=2.0.0,<3.0.0; python_version < '3.9'", "numpy>=2.0.0,<3.0.0; python_version >= '3.9'", ] build-backend = "setuptools.build_meta" [tool.cibuildwheel] build = "*" skip = "pp* cp36* cp37* cp38*" test-skip = "" free-threaded-support = false archs = ["native"] build-frontend = "default" config-settings = {} dependency-versions = "pinned" environment = {} environment-pass = [] build-verbosity = 0 before-all = "" before-build = "" repair-wheel-command = "" test-command = "" before-test = "" test-requires = [] test-extras = [] container-engine = "docker" manylinux-x86_64-image = "manylinux2014" manylinux-i686-image = "manylinux2014" manylinux-aarch64-image = "manylinux2014" manylinux-ppc64le-image = "manylinux2014" manylinux-s390x-image = "manylinux2014" manylinux-pypy_x86_64-image = "manylinux2014" manylinux-pypy_i686-image = "manylinux2014" manylinux-pypy_aarch64-image = "manylinux2014" musllinux-x86_64-image = "musllinux_1_2" musllinux-i686-image = "musllinux_1_2" musllinux-aarch64-image = "musllinux_1_2" musllinux-ppc64le-image = "musllinux_1_2" musllinux-s390x-image = "musllinux_1_2" [tool.cibuildwheel.linux] repair-wheel-command = "auditwheel repair -w {dest_dir} {wheel}" [tool.cibuildwheel.macos] repair-wheel-command = "delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel}" [tool.cibuildwheel.windows] [tool.cibuildwheel.pyodide] [tool.isort] profile = "black" thinc-release-v9.1.1/requirements.txt000066400000000000000000000014471467064331700177400ustar00rootroot00000000000000# Explosion-provided dependencies murmurhash>=1.0.2,<1.1.0 cymem>=2.0.2,<2.1.0 preshed>=3.0.2,<3.1.0 blis>=1.0.0,<1.1.0 srsly>=2.4.0,<3.0.0 wasabi>=0.8.1,<1.2.0 catalogue>=2.0.4,<2.1.0 confection>=0.0.1,<1.0.0 ml_datasets>=0.2.0,<0.3.0; python_version < "3.11" # Third-party dependencies pydantic>=1.7.4,!=1.8,!=1.8.1,<3.0.0 numpy>=2.0.0,<3.0.0 packaging>=20.0 # Development dependencies cython>=0.25.0,<3.0 hypothesis>=3.27.0,<6.72.2 pytest>=8.2.0 pytest-cov>=2.7.0,<5.0.0 coverage>=5.0.0,<8.0.0 mock>=2.0.0,<3.0.0 flake8>=3.5.0,<3.6.0 mypy>=1.5.0,<1.6.0; platform_machine != "aarch64" types-mock>=0.1.1 # Executing notebook tests ipykernel>=5.1.4,<5.2.0 nbconvert>=5.6.1,<6.2.0 nbformat>=5.0.4,<5.2.0 # Test to_disk/from_disk against pathlib.Path subclasses pathy>=0.3.5 black>=22.0,<23.0 isort>=5.0,<6.0 thinc-release-v9.1.1/setup.cfg000066400000000000000000000072251467064331700162750ustar00rootroot00000000000000[metadata] description = A refreshing functional take on deep learning, compatible with your favorite libraries url = https://github.com/explosion/thinc author = Explosion author_email = contact@explosion.ai license = MIT long_description = file: README.md long_description_content_type = text/markdown classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers Intended Audience :: Science/Research License :: OSI Approved :: MIT License Operating System :: POSIX :: Linux Operating System :: MacOS :: MacOS X Operating System :: Microsoft :: Windows Programming Language :: Cython Programming Language :: Python :: 3 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 Topic :: Scientific/Engineering [options] zip_safe = false include_package_data = true python_requires = >=3.9 setup_requires = cython>=0.25,<3.0 numpy>=2.0.0,<3.0.0 # We also need our Cython packages here to compile against cymem>=2.0.2,<2.1.0 preshed>=3.0.2,<3.1.0 murmurhash>=1.0.2,<1.1.0 blis>=1.0.0,<1.1.0 install_requires = # Explosion-provided dependencies blis>=1.0.0,<1.1.0 murmurhash>=1.0.2,<1.1.0 cymem>=2.0.2,<2.1.0 preshed>=3.0.2,<3.1.0 wasabi>=0.8.1,<1.2.0 srsly>=2.4.0,<3.0.0 catalogue>=2.0.4,<2.1.0 confection>=0.0.1,<1.0.0 # Third-party dependencies setuptools numpy>=2.0.0,<3.0.0 pydantic>=1.7.4,!=1.8,!=1.8.1,<3.0.0 packaging>=20.0 [options.entry_points] pytest_randomly.random_seeder = thinc = thinc.api:fix_random_seed [options.extras_require] cuda = cupy>=5.0.0b4 cuda80 = cupy-cuda80>=5.0.0b4 cuda90 = cupy-cuda90>=5.0.0b4 cuda91 = cupy-cuda91>=5.0.0b4 cuda92 = cupy-cuda92>=5.0.0b4 cuda100 = cupy-cuda100>=5.0.0b4 cuda101 = cupy-cuda101>=5.0.0b4 cuda102 = cupy-cuda102>=5.0.0b4 cuda110 = cupy-cuda110>=5.0.0b4 cuda111 = cupy-cuda111>=5.0.0b4 cuda112 = cupy-cuda112>=5.0.0b4 cuda113 = cupy-cuda113>=5.0.0b4 cuda114 = cupy-cuda114>=5.0.0b4 cuda115 = cupy-cuda115>=5.0.0b4 cuda116 = cupy-cuda116>=5.0.0b4 cuda117 = cupy-cuda117>=5.0.0b4 cuda11x = cupy-cuda11x>=11.0.0 cuda12x = cupy-cuda12x>=11.5.0 cuda-autodetect = cupy-wheel>=11.0.0 datasets = ml_datasets>=0.2.0,<0.3.0 torch = torch>=1.6.0 tensorflow = tensorflow>=2.0.0,<2.6.0 mxnet = mxnet>=1.5.1,<1.6.0 [bdist_wheel] universal = false [sdist] formats = gztar [flake8] ignore = E203, E266, E501, E731, W503, E741 max-line-length = 80 select = B,C,E,F,W,T4,B9 exclude = thinc/__init__.py thinc/layers/__init__.py thinc/shims/__init__.py thinc/api.py thinc/types.py thinc/tests/mypy [tool:pytest] markers = slow [coverage:run] plugins = Cython.Coverage omit = **/tests/* thinc/types.py thinc/backends/cupy_ops.py thinc/backends/_custom_kernels.py thinc/backends/_cupy_allocators.py thinc/layers/staticvectors.py [coverage:report] show_missing = True exclude_lines = pragma: no cover # Don't complain about missing debug-only code: def __unicode__ def __repr__ if self\.debug # Don't complain if tests don't hit defensive assertion code: raise AssertionError raise NotImplementedError # Don't complain if non-runnable code isn't run: if 0: if __name__ == .__main__.: assert False [mypy] ignore_missing_imports = True no_implicit_optional = True plugins = pydantic.mypy, thinc.mypy [mypy-thinc.tests.*] implicit_reexport = True [mypy-thinc.tests.mypy.*] ignore_errors = True thinc-release-v9.1.1/setup.py000066400000000000000000000066101467064331700161630ustar00rootroot00000000000000#!/usr/bin/env python import platform import sys from setuptools.command.build_ext import build_ext from sysconfig import get_path from setuptools import Extension, setup, find_packages from pathlib import Path import numpy from Cython.Build import cythonize from Cython.Compiler import Options # Preserve `__doc__` on functions and classes # http://docs.cython.org/en/latest/src/userguide/source_files_and_compilation.html#compiler-options Options.docstrings = True ACCELERATE = "thinc.backends._accelerate" APPLE_OPS = ["thinc.backends.apple_ops", ACCELERATE] PACKAGES = find_packages() MOD_NAMES = [ "thinc.backends.cblas", "thinc.backends.numpy_ops", "thinc.layers.sparselinear", "thinc.layers.premap_ids", ] + (APPLE_OPS if platform.system() == "Darwin" else []) COMPILE_OPTIONS = { "msvc": ["/Ox", "/EHsc"], "other": ["-O3", "-Wno-strict-prototypes", "-Wno-unused-function", "-std=c++11"], } COMPILER_DIRECTIVES = { "language_level": 3, "embedsignature": True, "annotation_typing": False, "profile": sys.version_info < (3, 12), } LINK_OPTIONS = {"msvc": [], "other": []} # By subclassing build_extensions we have the actual compiler that will be used # which is really known only after finalize_options # http://stackoverflow.com/questions/724664/python-distutils-how-to-get-a-compiler-that-is-going-to-be-used class build_ext_options: def build_options(self): if hasattr(self.compiler, "initialize"): self.compiler.initialize() self.compiler.platform = sys.platform[:6] for e in self.extensions: e.extra_compile_args = COMPILE_OPTIONS.get( self.compiler.compiler_type, COMPILE_OPTIONS["other"] ) e.extra_link_args = LINK_OPTIONS.get( self.compiler.compiler_type, LINK_OPTIONS["other"] ) class build_ext_subclass(build_ext, build_ext_options): def build_extensions(self): build_ext_options.build_options(self) build_ext.build_extensions(self) def clean(path): for path in path.glob("**/*"): if path.is_file() and path.suffix in (".so", ".cpp"): print(f"Deleting {path.name}") path.unlink() def setup_package(): root = Path(__file__).parent if len(sys.argv) > 1 and sys.argv[1] == "clean": return clean(root / "thinc") with (root / "thinc" / "about.py").open("r") as f: about = {} exec(f.read(), about) include_dirs = [numpy.get_include(), get_path("include")] ext_modules = [] for name in MOD_NAMES: mod_path = name.replace(".", "/") + ".pyx" if name == ACCELERATE: ext = Extension( name, [mod_path], language="c++", include_dirs=include_dirs, libraries=["blas"], ) else: ext = Extension(name, [mod_path], language="c++", include_dirs=include_dirs) ext_modules.append(ext) print("Cythonizing sources") ext_modules = cythonize( ext_modules, compiler_directives=COMPILER_DIRECTIVES, language_level=2 ) setup( name="thinc", packages=PACKAGES, version=about["__version__"], ext_modules=ext_modules, cmdclass={"build_ext": build_ext_subclass}, package_data={"": ["*.pyx", "*.pxd", "*.pxi", "*.cu", "*.hh"]}, ) if __name__ == "__main__": setup_package() thinc-release-v9.1.1/thinc/000077500000000000000000000000001467064331700155535ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/__init__.pxd000066400000000000000000000000001467064331700200150ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/__init__.py000066400000000000000000000003251467064331700176640ustar00rootroot00000000000000# Necessary for some side-effects in Cython. Not sure I understand. import numpy from .about import __version__ from .config import registry # fmt: off __all__ = [ "registry", "__version__", ] # fmt: on thinc-release-v9.1.1/thinc/about.py000066400000000000000000000000511467064331700172330ustar00rootroot00000000000000__version__ = "9.1.1" __release__ = True thinc-release-v9.1.1/thinc/api.py000066400000000000000000000135701467064331700167040ustar00rootroot00000000000000from .backends import ( CupyOps, MPSOps, NumpyOps, Ops, get_current_ops, get_ops, set_current_ops, set_gpu_allocator, use_ops, use_pytorch_for_gpu_memory, use_tensorflow_for_gpu_memory, ) from .compat import enable_mxnet, enable_tensorflow, has_cupy from .config import Config, ConfigValidationError, registry from .initializers import ( configure_normal_init, glorot_uniform_init, normal_init, uniform_init, zero_init, ) from .layers import ( LSTM, CauchySimilarity, ClippedLinear, Dish, Dropout, Embed, Gelu, HardSigmoid, HardSwish, HardSwishMobilenet, HardTanh, HashEmbed, LayerNorm, Linear, Logistic, Maxout, Mish, MultiSoftmax, MXNetWrapper, ParametricAttention, ParametricAttention_v2, PyTorchLSTM, PyTorchRNNWrapper, PyTorchWrapper, PyTorchWrapper_v2, PyTorchWrapper_v3, Relu, ReluK, Sigmoid, Softmax, Softmax_v2, SparseLinear, SparseLinear_v2, Swish, TensorFlowWrapper, TorchScriptWrapper_v1, add, array_getitem, bidirectional, chain, clone, concatenate, expand_window, keras_subclass, list2array, list2padded, list2ragged, map_list, noop, padded2list, premap_ids, pytorch_to_torchscript_wrapper, ragged2list, reduce_first, reduce_last, reduce_max, reduce_mean, reduce_sum, remap_ids, remap_ids_v2, residual, resizable, siamese, sigmoid_activation, softmax_activation, strings2arrays, tuplify, uniqued, with_array, with_array2d, with_cpu, with_debug, with_flatten, with_flatten_v2, with_getitem, with_list, with_nvtx_range, with_padded, with_ragged, with_reshape, with_signpost_interval, ) from .loss import ( CategoricalCrossentropy, CosineDistance, L2Distance, SequenceCategoricalCrossentropy, ) from .model import ( Model, change_attr_values, deserialize_attr, serialize_attr, set_dropout_rate, wrap_model_recursive, ) from .optimizers import SGD, Adam, Optimizer, RAdam from .schedules import ( Schedule, compounding, constant, constant_then, cyclic_triangular, decaying, plateau, slanted_triangular, warmup_linear, ) from .shims import ( MXNetShim, PyTorchGradScaler, PyTorchShim, Shim, TensorFlowShim, TorchScriptShim, keras_model_fns, maybe_handshake_model, ) from .types import ArgsKwargs, Padded, Ragged, Unserializable from .util import ( DataValidationError, data_validation, fix_random_seed, get_array_module, get_torch_default_device, get_width, is_cupy_array, mxnet2xp, prefer_gpu, require_cpu, require_gpu, set_active_gpu, tensorflow2xp, to_categorical, to_numpy, torch2xp, xp2mxnet, xp2tensorflow, xp2torch, ) try: from .backends import AppleOps except ImportError: AppleOps = None # fmt: off __all__ = [ # .config "Config", "registry", "ConfigValidationError", # .initializers "normal_init", "uniform_init", "glorot_uniform_init", "zero_init", "configure_normal_init", # .loss "CategoricalCrossentropy", "L2Distance", "CosineDistance", "SequenceCategoricalCrossentropy", # .model "Model", "serialize_attr", "deserialize_attr", "set_dropout_rate", "change_attr_values", "wrap_model_recursive", # .shims "Shim", "PyTorchGradScaler", "PyTorchShim", "TensorFlowShim", "keras_model_fns", "MXNetShim", "TorchScriptShim", "maybe_handshake_model", # .optimizers "Adam", "RAdam", "SGD", "Optimizer", # .schedules "Schedule", "cyclic_triangular", "warmup_linear", "constant", "constant_then", "decaying", "slanted_triangular", "compounding", "plateau", # .types "Ragged", "Padded", "ArgsKwargs", "Unserializable", # .util "fix_random_seed", "is_cupy_array", "set_active_gpu", "prefer_gpu", "require_gpu", "require_cpu", "DataValidationError", "data_validation", "to_categorical", "get_width", "get_array_module", "to_numpy", "torch2xp", "xp2torch", "tensorflow2xp", "xp2tensorflow", "mxnet2xp", "xp2mxnet", "get_torch_default_device", # .compat "enable_mxnet", "enable_tensorflow", "has_cupy", # .backends "get_ops", "set_current_ops", "get_current_ops", "use_ops", "Ops", "AppleOps", "CupyOps", "MPSOps", "NumpyOps", "set_gpu_allocator", "use_pytorch_for_gpu_memory", "use_tensorflow_for_gpu_memory", # .layers "Dropout", "Embed", "expand_window", "HashEmbed", "LayerNorm", "Linear", "Maxout", "Mish", "MultiSoftmax", "Relu", "softmax_activation", "Softmax", "LSTM", "CauchySimilarity", "ParametricAttention", "Logistic", "resizable", "sigmoid_activation", "Sigmoid", "SparseLinear", "ClippedLinear", "ReluK", "HardTanh", "HardSigmoid", "Dish", "HardSwish", "HardSwishMobilenet", "Swish", "Gelu", "PyTorchWrapper", "PyTorchRNNWrapper", "PyTorchLSTM", "TensorFlowWrapper", "keras_subclass", "MXNetWrapper", "PyTorchWrapper_v2", "Softmax_v2", "PyTorchWrapper_v3", "SparseLinear_v2", "TorchScriptWrapper_v1", "ParametricAttention_v2", "add", "bidirectional", "chain", "clone", "concatenate", "noop", "residual", "uniqued", "siamese", "list2ragged", "ragged2list", "map_list", "with_array", "with_array2d", "with_padded", "with_list", "with_ragged", "with_flatten", "with_reshape", "with_getitem", "strings2arrays", "list2array", "list2ragged", "ragged2list", "list2padded", "padded2list", "remap_ids", "remap_ids_v2", "premap_ids", "array_getitem", "with_cpu", "with_debug", "with_nvtx_range", "with_signpost_interval", "tuplify", "with_flatten_v2", "pytorch_to_torchscript_wrapper", "reduce_first", "reduce_last", "reduce_max", "reduce_mean", "reduce_sum", ] # fmt: on thinc-release-v9.1.1/thinc/backends/000077500000000000000000000000001467064331700173255ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/backends/__init__.pxd000066400000000000000000000000001467064331700215670ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/backends/__init__.py000066400000000000000000000123171467064331700214420ustar00rootroot00000000000000import contextlib import threading from contextvars import ContextVar from typing import Any, Callable, Dict, Optional, Type, cast from .. import registry from ..compat import cupy, has_cupy from ..util import ( assert_pytorch_installed, assert_tensorflow_installed, get_torch_default_device, is_cupy_array, require_cpu, ) from ._cupy_allocators import cupy_pytorch_allocator, cupy_tensorflow_allocator from ._param_server import ParamServer from .cupy_ops import CupyOps from .mps_ops import MPSOps from .numpy_ops import NumpyOps from .ops import Ops try: from .apple_ops import AppleOps except ImportError: AppleOps = None context_ops: ContextVar[Optional[Ops]] = ContextVar("context_ops", default=None) context_pools: ContextVar[dict] = ContextVar("context_pools", default={}) # Internal use of thread-local storage only for detecting cases where a Jupyter # notebook might not have preserved contextvars across cells. _GLOBAL_STATE = {"ops": None} # Thread-local state. _LOCAL_STATE = threading.local() def set_gpu_allocator(allocator: str) -> None: # pragma: no cover """Route GPU memory allocation via PyTorch or tensorflow. Raise an error if the given argument does not match either of the two. """ if allocator == "pytorch": use_pytorch_for_gpu_memory() elif allocator == "tensorflow": use_tensorflow_for_gpu_memory() else: raise ValueError( f"Invalid 'gpu_allocator' argument: '{allocator}'. Available allocators are: 'pytorch', 'tensorflow'" ) def use_pytorch_for_gpu_memory() -> None: # pragma: no cover """Route GPU memory allocation via PyTorch. This is recommended for using PyTorch and cupy together, as otherwise OOM errors can occur when there's available memory sitting in the other library's pool. We'd like to support routing Tensorflow memory allocation via PyTorch as well (or vice versa), but do not currently have an implementation for it. """ assert_pytorch_installed() if get_torch_default_device().type != "cuda": return pools = context_pools.get() if "pytorch" not in pools: pools["pytorch"] = cupy.cuda.MemoryPool(allocator=cupy_pytorch_allocator) cupy.cuda.set_allocator(pools["pytorch"].malloc) def use_tensorflow_for_gpu_memory() -> None: # pragma: no cover """Route GPU memory allocation via TensorFlow. This is recommended for using TensorFlow and cupy together, as otherwise OOM errors can occur when there's available memory sitting in the other library's pool. We'd like to support routing PyTorch memory allocation via Tensorflow as well (or vice versa), but do not currently have an implementation for it. """ assert_tensorflow_installed() pools = context_pools.get() if "tensorflow" not in pools: pools["tensorflow"] = cupy.cuda.MemoryPool(allocator=cupy_tensorflow_allocator) cupy.cuda.set_allocator(pools["tensorflow"].malloc) def _import_extra_cpu_backends(): try: from thinc_bigendian_ops import BigEndianOps except ImportError: pass def get_ops(name: str, **kwargs) -> Ops: """Get a backend object. The special name "cpu" returns the best available CPU backend.""" ops_by_name = {ops_cls.name: ops_cls for ops_cls in registry.ops.get_all().values()} # type: ignore cls: Optional[Callable[..., Ops]] = None if name == "cpu": _import_extra_cpu_backends() cls = ops_by_name.get("numpy") cls = ops_by_name.get("apple", cls) cls = ops_by_name.get("bigendian", cls) else: cls = ops_by_name.get(name) if cls is None: raise ValueError(f"Invalid backend: {name}") return cls(**kwargs) def get_array_ops(arr): """Return CupyOps for a cupy array, NumpyOps otherwise.""" if is_cupy_array(arr): return CupyOps() else: return NumpyOps() @contextlib.contextmanager def use_ops(name: str, **kwargs): """Change the backend to execute on for the scope of the block.""" current_ops = get_current_ops() set_current_ops(get_ops(name, **kwargs)) try: yield finally: set_current_ops(current_ops) def get_current_ops() -> Ops: """Get the current backend object.""" if context_ops.get() is None: require_cpu() return cast(Ops, context_ops.get()) def set_current_ops(ops: Ops) -> None: """Change the current backend object.""" context_ops.set(ops) _get_thread_state().ops = ops def contextvars_eq_thread_ops() -> bool: current_ops = context_ops.get() thread_ops = _get_thread_state().ops if type(current_ops) == type(thread_ops): return True return False def _get_thread_state() -> threading.local: """Get a thread-specific state variable that inherits from a global state when it's created.""" if not hasattr(_LOCAL_STATE, "initialized") or not _LOCAL_STATE.initialized: for name, value in _GLOBAL_STATE.items(): setattr(_LOCAL_STATE, name, value) _LOCAL_STATE.initialized = True return _LOCAL_STATE __all__ = [ "set_current_ops", "get_current_ops", "use_ops", "ParamServer", "Ops", "AppleOps", "CupyOps", "MPSOps", "NumpyOps", "has_cupy", ] thinc-release-v9.1.1/thinc/backends/_accelerate.pxd000066400000000000000000000036701467064331700222770ustar00rootroot00000000000000cdef extern from "Accelerate/Accelerate.h": enum CBLAS_ORDER: CblasRowMajor, CblasColMajor enum CBLAS_TRANSPOSE: CblasNoTrans, CblasTrans, CblasConjTrans enum CBLAS_UPLO: CblasUpper, CblasLower enum CBLAS_DIAG: CblasNonUnit, CblasUnit enum CBLAS_SIDE: CblasLeft, CblasRight # BLAS level 1 routines void cblas_sswap(int M, float *x, int incX, float *y, int incY) nogil void cblas_sscal(int N, float alpha, float *x, int incX) nogil void cblas_scopy(int N, float *x, int incX, float *y, int incY) nogil void cblas_saxpy(int N, float alpha, float *x, int incX, float *y, int incY ) nogil float cblas_sdot(int N, float *x, int incX, float *y, int incY ) nogil float cblas_snrm2(int N, float *x, int incX) nogil float cblas_sasum(int N, float *x, int incX) nogil int cblas_isamax(int N, float *x, int incX) nogil # BLAS level 2 routines void cblas_sgemv(CBLAS_ORDER Order, CBLAS_TRANSPOSE TransA, int M, int N, float alpha, float *A, int lda, float *x, int incX, float beta, float *y, int incY) nogil void cblas_sger(CBLAS_ORDER Order, int M, int N, float alpha, float *x, int incX, float *y, int incY, float *A, int lda) nogil # BLAS level 3 routines void cblas_sgemm(CBLAS_ORDER Order, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, int M, int N, int K, float alpha, float *A, int lda, float *B, int ldb, float beta, float *C, int ldc) nogil cdef void sgemm(bint TransA, bint TransB, int M, int N, int K, float alpha, const float* A, int lda, const float *B, int ldb, float beta, float* C, int ldc) nogil cdef void saxpy(int N, float alpha, const float* X, int incX, float *Y, int incY) nogil thinc-release-v9.1.1/thinc/backends/_accelerate.pyx000066400000000000000000000036431467064331700223240ustar00rootroot00000000000000cimport numpy as np from libc.stdint cimport uintptr_t import numpy cpdef np.ndarray gemm(float[:, ::1] A, float[:, ::1] B, bint trans1=False, bint trans2=False, np.ndarray out=None): cdef int nM = A.shape[0] if not trans1 else A.shape[1] cdef int nK = A.shape[1] if not trans1 else A.shape[0] cdef int nK_b = B.shape[0] if not trans2 else B.shape[1] cdef int nN = B.shape[1] if not trans2 else B.shape[0] cdef float[:, ::1] C = out if out is None: out = numpy.empty((nM, nN), dtype="f") C = out else: if C.shape[0] != nM or C.shape[1] != nN: msg = "Shape mismatch for output matrix, was: (%d, %d), expected (%d, %d)" raise ValueError(msg % (C.shape[0], C.shape[1], nM, nN)) if nK != nK_b: msg = "Shape mismatch for gemm: (%d, %d), (%d, %d)" raise ValueError(msg % (nM, nK, nK_b, nN)) if nM == 0 or nK == 0 or nN == 0: return out cblas_sgemm( CblasRowMajor, CblasTrans if trans1 else CblasNoTrans, CblasTrans if trans2 else CblasNoTrans, nM, nN, nK, 1.0, &A[0, 0], A.shape[1], &B[0, 0], B.shape[1], 0.0, &C[0, 0], C.shape[1] ) return out cdef void sgemm(bint TransA, bint TransB, int M, int N, int K, float alpha, const float* A, int lda, const float *B, int ldb, float beta, float* C, int ldc) nogil: cblas_sgemm( CblasRowMajor, CblasTrans if TransA else CblasNoTrans, CblasTrans if TransB else CblasNoTrans, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc ) cdef void saxpy(int N, float alpha, const float* X, int incX, float *Y, int incY) nogil: cblas_saxpy(N, alpha, X, incX, Y, incY) thinc-release-v9.1.1/thinc/backends/_cupy_allocators.py000066400000000000000000000042501467064331700232420ustar00rootroot00000000000000from typing import cast from ..compat import cupy, tensorflow, torch from ..types import ArrayXd from ..util import get_torch_default_device, tensorflow2xp def cupy_tensorflow_allocator(size_in_bytes: int): """Function that can be passed into cupy.cuda.set_allocator, to have cupy allocate memory via TensorFlow. This is important when using the two libraries together, as otherwise OOM errors can occur when there's available memory sitting in the other library's pool. """ size_in_bytes = max(1024, size_in_bytes) tensor = tensorflow.zeros((size_in_bytes // 4,), dtype=tensorflow.dtypes.float32) # type: ignore # We convert to cupy via dlpack, so that we can get a memory pointer. cupy_array = cast(ArrayXd, tensorflow2xp(tensor)) address = int(cupy_array.data) # cupy has a neat class to help us here. Otherwise it will try to free. memory = cupy.cuda.memory.UnownedMemory(address, size_in_bytes, cupy_array) # Now return a new memory pointer. return cupy.cuda.memory.MemoryPointer(memory, 0) def cupy_pytorch_allocator(size_in_bytes: int): device = get_torch_default_device() """Function that can be passed into cupy.cuda.set_allocator, to have cupy allocate memory via PyTorch. This is important when using the two libraries together, as otherwise OOM errors can occur when there's available memory sitting in the other library's pool. """ # Cupy was having trouble with very small allocations? size_in_bytes = max(1024, size_in_bytes) # We use pytorch's underlying FloatStorage type to avoid overhead from # creating a whole Tensor. # This turns out to be way faster than making FloatStorage? Maybe # a Python vs C++ thing I guess? torch_tensor = torch.zeros( (size_in_bytes // 4,), requires_grad=False, device=device ) # cupy has a neat class to help us here. Otherwise it will try to free. # I think this is a private API? It's not in the types. address = torch_tensor.data_ptr() # type: ignore memory = cupy.cuda.memory.UnownedMemory(address, size_in_bytes, torch_tensor) # Now return a new memory pointer. return cupy.cuda.memory.MemoryPointer(memory, 0) thinc-release-v9.1.1/thinc/backends/_custom_kernels.cu000066400000000000000000000446061467064331700230640ustar00rootroot00000000000000// Use grid strided loops, described here: // https://devblogs.nvidia.com/cuda-pro-tip-write-flexible-kernels-grid-stride-loops/ // This pattern ensures that all of the loop values are visited once, no matter // what grid parameters are used for the function. // We cannot include CUDA header for mathematical constants, since it requires // that the development headers of the CUDA toolkit are installed. template struct Constants {}; template <> struct Constants { static constexpr double INV_SQRT_2 = 0.7071067811865475; static constexpr double INV_SQRT_2PI = 0.3989422804014327; }; template <> struct Constants { static constexpr float INV_SQRT_2 = 0.70710677; static constexpr float INV_SQRT_2PI = 0.3989423; }; template __global__ void gather_add(U* out_bo, const U* table_to, const int* indices_bk, int T, int O, int B, int K) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int b = _loop_start; b < B; b += _loop_stride) { for (int k = 0; k < K; ++k) { int idx = indices_bk[b * K + k]; const U* table = table_to + idx * O; U* out = out_bo + b * O; for (int o = 0; o < O; ++o) { out[o] += table[o]; } } } } template __global__ void seq2col(T* output, const T* X, const int* lengths, int nW, int B, int I, int nL) { // Let's say nW is 1 (it usually is). Then we want to take: // 1a 1b 1c // 2a 2b 2c // 3a 3b 3c // And make // __ __ __ 1a 1b 1c 2a 2b 2c // 1a 1b 1c 2a 2b 2c 3a 3b 3c // 2a 2b 2c 3a 3b 3c __ __ __ // Where __ is padding. // Now let's say nW is 2. Then we want to take: // 1a 1b 1c // 2a 2b 2c // 3a 3b 3c // And make // __ __ __ __ __ __ 1a 1b 1c 2a 2b 2c 3a 3b 3c // __ __ __ 1a 1b 1c 2a 2b 2c 3a 3b 3c __ __ __ // 1a 1b 1c 2a 2b 2c 3a 3b 3c __ __ __ __ __ __ // * x_start=-6, x_end=9 : (0-2) * 3, (0+2+1) * 3 // * x_start=-3, x_end=13 : (1-2) * 3, (1+2+1) * 3 // * x_start=0, x_end=16 : (2-2) * 3, (2+2+1) * 3 // // If lengths > 1, then the sequence lengths dictate // the boundaries/padding rather than the begin/end // of X. int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; int nF = nW * 2 + 1; int seq = 0; int seq_start = 0; for (int b = _loop_start; b < B; b += _loop_stride) { // Find sequence sequence in which b lies. for (; seq < nL; ++seq) { if (b < seq_start + lengths[seq]) { break; } seq_start += lengths[seq]; } // Calculate the bounds of the sequence wherein b lies. int seq_end = seq_start + lengths[seq]; // Find the unconstrained window around b, which // may be out of the sequence bounds. int window_start = b - nW; int window_end = b + nW + 1; // Find the sequence-constrained window around b. int x_start = max(seq_start, window_start); int x_end = min(seq_end, window_end); int n_elems = x_end - x_start; // If the left window is cut short, we want to start by // the same amount in the output. int out_offset = x_start - window_start; for (int i = 0; i < n_elems * I; i++) { output[(b * I * nF) + (out_offset * I) + i] = X[(x_start * I) + i]; } } } template __global__ void pad(T* out, T const **seqs, int const *lengths, int stride, int N, int L) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int i = _loop_start; i < L * stride; i += _loop_stride) { for (int j = 0; j < N; ++j) { T const *seq = seqs[j]; if (i < lengths[j] * stride) { out[j * L * stride + i] = seq[i]; } else { out[j * L * stride + i] = T(); } } } } template __global__ void maxout(T* best, int* which, const T* cands, int B, int O, int P) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int bo = _loop_start; bo < B * O; bo += _loop_stride) { // Go to the candidates at the output we're working on const T* cands_bo = &cands[bo * P]; int best_idx = 0; T best_val = cands_bo[0]; for (int p = 1; p < P; ++p) { if (cands_bo[p] > best_val) { best_idx = p; best_val = cands_bo[p]; } } which[bo] = best_idx; best[bo] = best_val; } } template __global__ void clipped_linear(T* Y, const T* X, double slope, double offset, double min_val, double max_val, int N) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int i = _loop_start; i < N; i += _loop_stride) { T y = X[i] * slope + offset; Y[i] = min(max(y, min_val), max_val); } } template __global__ void dish(T* Y, const T* X, int N) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int i = _loop_start; i < N; i += _loop_stride) { T x = X[i]; Y[i] = 0.5 * x * (x / sqrt(1 + x * x) + 1); } } template __global__ void gelu(T* Y, const T* X, double threshold, int N) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int i = _loop_start; i < N; i += _loop_stride) { T x = X[i]; if (x >= threshold) { Y[i] = x; } else if (x <= -threshold) { Y[i] = 0.0; } else { T cdf = 0.5 * (1.0 + erf(Constants::INV_SQRT_2 * x)); Y[i] = x * cdf; } } } template __global__ void mish(T* Y, const T* X, double threshold, int N) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; T one = 1.; for (int i = _loop_start; i < N; i += _loop_stride) { if (X[i] >= threshold) Y[i] = X[i]; else Y[i] = X[i] * tanh(log(one + exp(X[i]))); } } template __global__ void swish(T* Y, const T* X, double threshold, int N) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int i = _loop_start; i < N; i += _loop_stride) { if (X[i] >= threshold) { Y[i] = X[i]; } else if (X[i] <= -threshold) { Y[i] = 0.0; } else { T logistic_cdf = 1.0 / (1.0 + exp(-X[i])); Y[i] = X[i] * logistic_cdf; } } } template __global__ void reduce_sum(U* output, const U* X, const int* lengths, int B, int T, int O) { // Compute sums of a batch of concatenated sequences int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int b = _loop_start; b < B; b += _loop_stride) { // Go to the regions we're working on U* output_b = &output[b*O]; // Find the sequence item we're working on int t = 0; for (int i=0; i < b; ++i) { t += lengths[i]; } int length = lengths[b]; // Each invocation of the kernel sums one batch. for (int i=0; i < length; ++i) // Iterate over rows { const U* X_t = &X[(t+i)*O]; for (int j=0; j < O; ++j) { output_b[j] += X_t[j]; } } } } template __global__ void reduce_max(U* maxes, int* which, const U* X, const int* lengths, int B, int T, int O) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int b = _loop_start; b < B; b += _loop_stride) { // Go to the regions we're working on U* maxes_b = &maxes[b*O]; int* which_b = &which[b*O]; // Find the sequence item we're working on const U* X_t = X; for (int i=0; i < b; ++i) { X_t += lengths[i] * O; } // Each invocation of the kernel maxes one sequence. // Start by assuming maxes are the first element. for (int i=0; i < O; ++i) { maxes_b[i] = X_t[i]; which_b[i] = 0; } int length = lengths[b]; for (int i=1; i < length; ++i) // Iterate over rows { X_t += O; for (int j=0; j < O; ++j) { if (X_t[j] > maxes_b[j]) { maxes_b[j] = X_t[j]; which_b[j] = i; } } } } } template __global__ void backprop_seq2col(T* d_seqs, const T* d_cols, const int* lengths, int nW, int B, int I, int nL) { // Here's what we're doing, if we had 2d indexing. //for i in range(B): // d_seq[i] += d_cols[i-2, 4] // d_seq[i] += d_cols[i-1, 3] // d_seq[i] += d_cols[i, 2] // d_seq[i] += d_cols[i+1, 1] // d_seq[i] += d_cols[i+2, 0] int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; int nF = nW * 2 + 1; int seq = 0; int seq_start = 0; for (int b = _loop_start; b < B; b += _loop_stride) { // Find sequence offset in which b lies. // Fixme: do not restart offset search for every b. for (; seq < nL; ++seq) { if (b < seq_start + lengths[seq]) { break; } seq_start += lengths[seq]; } // Calculate the bounds of the sequence wherein b lies. int seq_end = seq_start + lengths[seq]; // Find the unconstrained window around b, which // may be out of the sequence bounds. int window_start = b - nW; int window_end = b + nW + 1; // Find the sequence-constrained window around b. int d_seqs_start = max(seq_start, window_start); int d_seqs_end = min(seq_end, window_end); // The here update proceeds differently than the other seq2col // implementations. We have to do all the updates for the b in this loop // iteration, otherwise we get data races due to parallelism in CUDA. // // A batch item b occurs, given nw=1, in: // // position 0 in b - 1 (if present) <- window_start // position 1 in b // position 2 in b + 1 (if present) <- window_end // // The following loop sums the gradients for those occurrences. // b_w loops over [b - 1, b, b + 1] and computes the position // of b within the column gradients of [b - 1 ... b + 1]. for (int b_w = d_seqs_start; b_w < d_seqs_end; ++b_w) { int position = (2 * nW) - (b_w - window_start); int start = (b_w * I * nF) + (position * I); for (int i = 0; i < I; ++i) { d_seqs[(b*I + i)] += d_cols[start + i]; } } } } template __global__ void backprop_clipped_linear(T* dX, const T* dY, const T* X, double slope, double offset, double min_val, double max_val, int N) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; T low = (min_val - offset) / slope; T high = (max_val - offset) / slope; for (int i = _loop_start; i < N; i += _loop_stride) { T x = X[i]; if (low < x && x < high) { dX[i] = dY[i] * slope; } else { dX[i] = 0; } } } template __global__ void backprop_hard_swish(T* dX, const T* dY, const T* X, int N) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int i = _loop_start; i < N; i += _loop_stride) { if (X[i] > 2.5) { dX[i] = dY[i]; } else if (X[i] < -2.5) { dX[i] = 0; } else { dX[i] = dY[i] * (X[i] * 0.4 + 0.5); } } } template __global__ void backprop_hard_swish_mobilenet(T* dX, const T* dY, const T* X, int N) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int i = _loop_start; i < N; i += _loop_stride) { if (X[i] > 3.0) { dX[i] = dY[i]; } else if (X[i] < -3.0) { dX[i] = 0; } else { dX[i] = dY[i] * ((X[i] * 2.0 + 3.0) / 6.0); } } } template __global__ void backprop_dish(T* dX, const T* dY, const T* X, int N) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int i = _loop_start; i < N; i += _loop_stride) { T x = X[i]; T x_sq = x * x; T x_sq_plus_one = x_sq + 1.0; dX[i] = dY[i] * (x/sqrt(x_sq_plus_one) - (0.5 * x * x_sq) / pow(x_sq_plus_one, static_cast(1.5)) + 0.5); } } template __global__ void backprop_gelu(T* dX, const T* dY, const T* X, double threshold, int N) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int i = _loop_start; i < N; i += _loop_stride) { T x = X[i]; if (x >= threshold) { dX[i] = dY[i]; } else if (x <= -threshold) { dX[i] = 0.0; } else { T cdf = 0.5 * (1.0 + erf(Constants::INV_SQRT_2 * x)); T pdf = Constants::INV_SQRT_2PI * exp(-0.5 * x * x); dX[i] = dY[i] * (cdf + x * pdf); } } } template __global__ void backprop_maxout(T* dX, const T* dY, const int* which, int B, int O, int P) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int b = _loop_start; b < B; b += _loop_stride) { // Go to the regions we're working on T* dX_b = &dX[b*O*P]; const T* dY_b = &dY[b*O]; const int* which_b = &which[b*O]; for (int i=0; i < O; ++i) dX_b[(i*P)+which_b[i]] = dY_b[i]; } } template __global__ void backprop_mish(T* dX, const T* dY, const T* X, double threshold, int N) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int i = _loop_start; i < N; i += _loop_stride) { T x = X[i]; if (x >= threshold) { dX[i] = dY[i]; } else { T exp_x = exp(x); T exp_2x = exp(2*x); T exp_3x = exp(3*x); T omega = (4. * (x+1)) + (4 * exp_2x) + exp_3x + exp_x * (4.*x+6); T delta = 2 * exp_x + exp_2x + 2; dX[i] = dY[i] * ((exp_x * omega) / (delta * delta)); } } } template __global__ void backprop_swish(T* dX, const T* dY, const T* X, const T* Y, double threshold, int N) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int i = _loop_start; i < N; i += _loop_stride) { T x = X[i]; T y = Y[i]; if (x >= threshold) { dX[i] = dY[i]; } else if (x <= -threshold) { dX[i] = 0.0; } else { T cdf = 1.0 / (1 + exp(-x)); T d = y + cdf * (1 - y); dX[i] = dY[i] * d; } } } template __global__ void backprop_reduce_sum(U* dX, const U* d_sum, const int* lengths, int B, int T, int O) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; int seq_start = 0; int b = 0; for (int t = _loop_start; t < T; t += _loop_stride) { // Find the sequence item we're working on while ((b < B) && (seq_start+lengths[b]) <= t) { seq_start += lengths[b]; b += 1; } if (lengths[b] == 0) continue; for (int i=0; i < O; ++i) { dX[t * O + i] = d_sum[b * O + i]; } } } template __global__ void backprop_reduce_mean(U* dX, const U* d_mean, const int* lengths, int B, int T, int O) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; int seq_start = 0; int b = 0; for (int t = _loop_start; t < T; t += _loop_stride) { // Find the sequence item we're working on while ((b < B) && (seq_start+lengths[b]) <= t) { seq_start += lengths[b]; b += 1; } if (lengths[b] == 0) continue; U* dX_t = &dX[t * O]; const U* d_mean_b = &d_mean[b * O]; int lengths_b = lengths[b]; for (int i=0; i < O; ++i) { dX_t[i] = d_mean_b[i] / lengths_b; } } } template __global__ void backprop_reduce_max(U* dX, const U* d_maxes, const int* which, const int* lengths, int B, int T, int O) { int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; int seq_start = 0; int b = 0; for (int t = _loop_start; t < T; t += _loop_stride) { // We're calculating the gradient of the unpooled sequences, from // the gradient of the maxes. In this loop, we're getting the gradient // of a single sequence item, t. We need to know the sequence index, // b. while ((b < B) && (seq_start+lengths[b]) <= t) { seq_start += lengths[b]; b += 1; } if (lengths[b] == 0) continue; // The "which" array tells us which rows were selected as the max. // So we need to find the index of our t in the sequence. int index_of_t = t-seq_start; // Get the rows we're dealing with, to avoid cluttering the loop // with the index math. U* dX_t = &dX[t*O]; const U* d_maxes_b = &d_maxes[b*O]; const int* which_b = &which[b*O]; // Now loop over our row. for (int i=0; i < O; ++i) { // If we used the value for this cell, // pass the gradient if (which_b[i] == index_of_t) dX_t[i] = d_maxes_b[i]; } } } thinc-release-v9.1.1/thinc/backends/_custom_kernels.py000066400000000000000000000614321467064331700231010ustar00rootroot00000000000000import operator import re from collections import defaultdict from functools import reduce from pathlib import Path from typing import Callable, Optional, Tuple import numpy from ..compat import cupy, has_cupy_gpu PWD = Path(__file__).parent KERNELS_SRC = (PWD / "_custom_kernels.cu").read_text(encoding="utf8") KERNELS_LIST = [ "backprop_clipped_linear", "backprop_clipped_linear", "backprop_dish", "backprop_dish", "backprop_gelu", "backprop_gelu", "backprop_hard_swish", "backprop_hard_swish", "backprop_hard_swish_mobilenet", "backprop_hard_swish_mobilenet", "backprop_maxout", "backprop_maxout", "backprop_mish", "backprop_mish", "backprop_reduce_max", "backprop_reduce_max", "backprop_reduce_mean", "backprop_reduce_mean", "backprop_reduce_sum", "backprop_reduce_sum", "backprop_seq2col", "backprop_seq2col", "backprop_swish", "backprop_swish", "clipped_linear", "clipped_linear", "dish", "dish", "gather_add", "gather_add", "gelu", "gelu", "maxout", "maxout", "mish", "mish", "pad", "pad", "pad", "pad", "reduce_max", "reduce_max", "reduce_sum", "reduce_sum", "seq2col", "seq2col", "swish", "swish", ] KERNELS = ( cupy.RawModule( code=KERNELS_SRC, options=("--std=c++11",), name_expressions=KERNELS_LIST ) if has_cupy_gpu else None ) class LazyKernel: """Wraps around `cupy.RawModule` and `cupy.RawKernel` to verify CuPy availability and lazily compile the latter on first invocation. The default CuPy behaviour triggers the compilation as soon as the `cupy.RawKernel` object is accessed.""" name: str _kernel: Optional["cupy.RawKernel"] _compile_callback: Optional[Callable[[], "cupy.RawKernel"]] __slots__ = ["name", "_kernel", "_compile_callback"] def __init__( self, name: str, *, compile_callback: Optional[Callable[[], "cupy.RawKernel"]] = None, ) -> None: self.name = name self._kernel = None self._compile_callback = compile_callback def __call__(self, *args, **kwargs): self._compile_kernel() self._kernel(*args, **kwargs) def _compile_kernel(self): if self._kernel is not None: return if self._compile_callback is not None: self._kernel = self._compile_callback() elif KERNELS is not None: self._kernel = KERNELS.get_function(self.name) if self._kernel is None: raise ValueError(f"couldn't compile Cupy kernel '{self.name}'") def compile_mmh(): if not has_cupy_gpu: return None return cupy.RawKernel((PWD / "_murmur3.cu").read_text(encoding="utf8"), "hash_data") clipped_linear_kernel_float = LazyKernel("clipped_linear") clipped_linear_kernel_double = LazyKernel("clipped_linear") dish_kernel_float = LazyKernel("dish") dish_kernel_double = LazyKernel("dish") gather_add_kernel_float = LazyKernel("gather_add") gather_add_kernel_double = LazyKernel("gather_add") gelu_kernel_float = LazyKernel("gelu") gelu_kernel_double = LazyKernel("gelu") hash_data_kernel = LazyKernel("hash_data", compile_callback=compile_mmh) maxout_kernel_float = LazyKernel("maxout") maxout_kernel_double = LazyKernel("maxout") mish_kernel_float = LazyKernel("mish") mish_kernel_double = LazyKernel("mish") pad_kernel_float = LazyKernel("pad") pad_kernel_double = LazyKernel("pad") pad_kernel_int32 = LazyKernel("pad") pad_kernel_int64 = LazyKernel("pad") reduce_max_kernel_float = LazyKernel("reduce_max") reduce_max_kernel_double = LazyKernel("reduce_max") reduce_sum_kernel_float = LazyKernel("reduce_sum") reduce_sum_kernel_double = LazyKernel("reduce_sum") seq2col_kernel_float = LazyKernel("seq2col") seq2col_kernel_double = LazyKernel("seq2col") swish_kernel_float = LazyKernel("swish") swish_kernel_double = LazyKernel("swish") backprop_clipped_linear_kernel_double = LazyKernel("backprop_clipped_linear") backprop_clipped_linear_kernel_float = LazyKernel("backprop_clipped_linear") backprop_dish_kernel_double = LazyKernel("backprop_dish") backprop_dish_kernel_float = LazyKernel("backprop_dish") backprop_gelu_kernel_double = LazyKernel("backprop_gelu") backprop_gelu_kernel_float = LazyKernel("backprop_gelu") backprop_hard_swish_kernel_double = LazyKernel("backprop_hard_swish") backprop_hard_swish_kernel_float = LazyKernel("backprop_hard_swish") backprop_hard_swish_mobilenet_kernel_double = LazyKernel( "backprop_hard_swish_mobilenet" ) backprop_hard_swish_mobilenet_kernel_float = LazyKernel( "backprop_hard_swish_mobilenet" ) backprop_maxout_kernel_double = LazyKernel("backprop_maxout") backprop_maxout_kernel_float = LazyKernel("backprop_maxout") backprop_mish_kernel_double = LazyKernel("backprop_mish") backprop_mish_kernel_float = LazyKernel("backprop_mish") backprop_reduce_max_kernel_double = LazyKernel("backprop_reduce_max") backprop_reduce_max_kernel_float = LazyKernel("backprop_reduce_max") backprop_reduce_mean_kernel_double = LazyKernel("backprop_reduce_mean") backprop_reduce_mean_kernel_float = LazyKernel("backprop_reduce_mean") backprop_reduce_sum_kernel_double = LazyKernel("backprop_reduce_sum") backprop_reduce_sum_kernel_float = LazyKernel("backprop_reduce_sum") backprop_seq2col_kernel_double = LazyKernel("backprop_seq2col") backprop_seq2col_kernel_float = LazyKernel("backprop_seq2col") backprop_swish_kernel_double = LazyKernel("backprop_swish") backprop_swish_kernel_float = LazyKernel("backprop_swish") def _alloc(shape, dtype, *, zeros: bool = True): if zeros: return cupy.zeros(shape, dtype) else: return cupy.empty(shape, dtype) def _alloc_like(array, zeros: bool = True): if zeros: return cupy.zeros_like(array) else: return cupy.empty_like(array) def pad(seqs, round_to=1, *, threads_per_block=128, num_blocks=128): if round_to < 1: raise ValueError(f"Rounding for padding must at least be 1, was: {round_to}") for seq in seqs: _is_float_or_int_array(seq) seq_lens = [len(seq) for seq in seqs] max_seq_len = max(seq_lens) # Round the length to nearest bucket -- helps on GPU, to make similar # array sizes. max_seq_len += -max_seq_len % round_to seq_lens = cupy.array(seq_lens, dtype="int32") final_shape = (len(seqs), max_seq_len) + seqs[0].shape[1:] out = cupy.empty(final_shape, dtype=seqs[0].dtype) # Extract pointers from CuPy arrays, so that we can address # them in the CUDA kernel. ptrs = numpy.empty( ( len( seqs, ) ), "int64", ) for idx, seq in enumerate(seqs): ptrs[idx] = seq.data.ptr ptrs = cupy.array(ptrs) stride = reduce(operator.mul, seqs[0].shape[1:], 1) if out.dtype == "float32": pad_kernel_float( (num_blocks,), (threads_per_block,), (out, ptrs, seq_lens, stride, len(seqs), max_seq_len), ) elif out.dtype == "float64": pad_kernel_double( (num_blocks,), (threads_per_block,), (out, ptrs, seq_lens, stride, len(seqs), max_seq_len), ) elif out.dtype == "int32": pad_kernel_int32( (num_blocks,), (threads_per_block,), (out, ptrs, seq_lens, stride, len(seqs), max_seq_len), ) elif out.dtype == "int64": pad_kernel_int64( (num_blocks,), (threads_per_block,), (out, ptrs, seq_lens, stride, len(seqs), max_seq_len), ) return out def clipped_linear( X, *, inplace=False, slope=1.0, offset=0.0, min_val=0.0, max_val=1.0, threads_per_block=128, num_blocks=128, ): _is_float_array(X) out = X if not inplace: out = _alloc_like(X, zeros=False) if X.dtype == "float32": clipped_linear_kernel_float( (num_blocks,), (threads_per_block,), (out, X, slope, offset, min_val, max_val, X.size), ) else: clipped_linear_kernel_double( (num_blocks,), (threads_per_block,), (out, X, slope, offset, min_val, max_val, X.size), ) return out def gather_add(table, indices, *, threads_per_block=128, num_blocks=128): if table.ndim != 2: raise ValueError( f"gather_add expects table with dimensionality 2, was: {table.ndim}" ) if indices.ndim != 2: raise ValueError( f"gather_add expects indices with dimensionality 2, was: {indices.ndim}" ) _is_float_array(table) indices = indices.astype("int32") _check_indices(indices, table.shape[0]) B = indices.shape[0] K = indices.shape[1] T = table.shape[0] O = table.shape[1] out = _alloc((B, O), dtype=table.dtype, zeros=True) if table.dtype == "float32": gather_add_kernel_float( (num_blocks,), (threads_per_block,), (out, table, indices, T, O, B, K) ) else: gather_add_kernel_double( (num_blocks,), (threads_per_block,), (out, table, indices, T, O, B, K) ) return out def dish(X, *, inplace=False, threads_per_block=128, num_blocks=128): _is_float_array(X) out = X if not inplace: out = _alloc_like(X, zeros=False) if X.dtype == "float32": dish_kernel_float((num_blocks,), (threads_per_block,), (out, X, X.size)) else: dish_kernel_double((num_blocks,), (threads_per_block,), (out, X, X.size)) return out def gelu(X, *, inplace=False, threshold=6.0, threads_per_block=128, num_blocks=128): _is_float_array(X) out = X if not inplace: out = _alloc_like(X, zeros=False) if X.dtype == "float32": gelu_kernel_float( (num_blocks,), (threads_per_block,), (out, X, threshold, X.size) ) else: gelu_kernel_double( (num_blocks,), (threads_per_block,), (out, X, threshold, X.size) ) return out def check_seq2col_lengths(lengths, B): if lengths is None: lengths = cupy.array([B], dtype="int32") else: _check_lengths(lengths, B) return lengths def seq2col(seq, nW, *, lengths=None, threads_per_block=128, num_blocks=128): _is_float_array(seq) B = seq.shape[0] nF = nW * 2 + 1 I = seq.shape[1] lengths = check_seq2col_lengths(lengths, B) nL = lengths.shape[0] out = _alloc((B, I * nF), dtype=seq.dtype, zeros=True) if seq.size != 0 and lengths.size != 0: if seq.dtype == "float32": seq2col_kernel_float( (num_blocks,), (threads_per_block,), (out, seq, lengths, nW, B, I, nL) ) else: seq2col_kernel_double( (num_blocks,), (threads_per_block,), (out, seq, lengths, nW, B, I, nL) ) return out def maxout(X, *, threads_per_block=128, num_blocks=128): _is_float_array(X) B, I, P = X.shape out_shape = (B, I) best = _alloc(out_shape, dtype=X.dtype, zeros=False) which = _alloc(out_shape, dtype="i", zeros=False) if X.dtype == "float32": maxout_kernel_float( (num_blocks,), (threads_per_block,), (best, which, X, B, I, P) ) else: maxout_kernel_double( (num_blocks,), (threads_per_block,), (best, which, X, B, I, P) ) return best, which def mish(X, *, inplace=False, threshold=5, threads_per_block=128, num_blocks=128): _is_float_array(X) out = X if not inplace: out = _alloc_like(X, zeros=False) if X.dtype == "float32": mish_kernel_float( (num_blocks,), (threads_per_block,), (out, X, threshold, X.size) ) else: mish_kernel_double( (num_blocks,), (threads_per_block,), (out, X, threshold, X.size) ) return out def reduce_sum(X, lengths, *, threads_per_block=128, num_blocks=128): _is_float_array(X) B = len(lengths) T = X.shape[0] O = X.shape[1] _check_lengths(lengths, T) out = _alloc((B, O), dtype=X.dtype, zeros=True) if X.dtype == "float32": reduce_sum_kernel_float( (num_blocks,), (threads_per_block,), (out, X, lengths, B, T, O) ) else: reduce_sum_kernel_double( (num_blocks,), (threads_per_block,), (out, X, lengths, B, T, O) ) return out def reduce_mean(X, lengths, *, threads_per_block=128, num_blocks=128): _is_float_array(X) B = len(lengths) T = X.shape[0] O = X.shape[1] _check_lengths(lengths, T) out = _alloc((B, O), dtype=X.dtype, zeros=True) if X.dtype == "float32": reduce_sum_kernel_float( (num_blocks,), (threads_per_block,), (out, X, lengths, B, T, O) ) else: reduce_sum_kernel_double( (num_blocks,), (threads_per_block,), (out, X, lengths, B, T, O) ) # Avoid divide by zero out /= lengths.reshape((-1, 1)) + 1e-10 return out def reduce_max(X, lengths, *, threads_per_block=128, num_blocks=128): _is_float_array(X) B = len(lengths) T = X.shape[0] O = X.shape[1] _check_lengths(lengths, T, min_length=1) out_shape = (B, O) maxes = _alloc(out_shape, dtype=X.dtype, zeros=False) which = _alloc(out_shape, dtype="i", zeros=False) if X.dtype == "float32": reduce_max_kernel_float( (num_blocks,), (threads_per_block,), (maxes, which, X, lengths, B, T, O) ) else: reduce_max_kernel_double( (num_blocks,), (threads_per_block,), (maxes, which, X, lengths, B, T, O) ) return maxes, which def swish(X, *, inplace=False, threshold=17.0, threads_per_block=128, num_blocks=128): _is_float_array(X) out = X if not inplace: out = _alloc_like(X, zeros=False) if X.dtype == "float32": swish_kernel_float( (num_blocks,), (threads_per_block,), (out, X, threshold, X.size) ) else: swish_kernel_double( (num_blocks,), (threads_per_block,), (out, X, threshold, X.size) ) return out def backprop_seq2col(dY, nW, *, lengths=None, threads_per_block=128, num_blocks=128): _is_float_array(dY) B = dY.shape[0] nF = nW * 2 + 1 I = dY.shape[1] // nF lengths = check_seq2col_lengths(lengths, B) nL = lengths.shape[0] out = _alloc((B, I), dtype=dY.dtype, zeros=True) if dY.size != 0 and lengths.size != 0: if dY.dtype == "float32": backprop_seq2col_kernel_float( (num_blocks,), (threads_per_block,), (out, dY, lengths, nW, B, I, nL) ) else: backprop_seq2col_kernel_double( (num_blocks,), (threads_per_block,), (out, dY, lengths, nW, B, I, nL) ) return out def backprop_clipped_linear( dY, X, *, slope: float = 1.0, offset: float = 0.0, min_val: float = 0.0, max_val: float = 1.0, inplace: bool = False, threads_per_block=128, num_blocks=128, ): _is_float_array(dY) _is_float_array(X, shape=dY.shape) out = dY if not inplace: out = _alloc_like(dY, zeros=False) if dY.dtype == "float32": backprop_clipped_linear_kernel_float( (num_blocks,), (threads_per_block,), (out, dY, X, slope, offset, min_val, max_val, out.size), ) else: backprop_clipped_linear_kernel_double( (num_blocks,), (threads_per_block,), (out, dY, X, slope, offset, min_val, max_val, out.size), ) return out def backprop_hard_swish( dY, X, *, inplace: bool = False, threads_per_block=128, num_blocks=128 ): _is_float_array(dY) _is_float_array(X, shape=dY.shape) out = dY if not inplace: out = _alloc_like(dY, zeros=False) if dY.dtype == "float32": backprop_hard_swish_kernel_float( (num_blocks,), (threads_per_block,), (out, dY, X, out.size) ) else: backprop_hard_swish_kernel_double( (num_blocks,), (threads_per_block,), (out, dY, X, out.size) ) return out def backprop_hard_swish_mobilenet( dY, X, *, inplace: bool = False, threads_per_block=128, num_blocks=128 ): _is_float_array(dY) _is_float_array(X, shape=dY.shape) out = dY if not inplace: out = _alloc_like(dY, zeros=False) if dY.dtype == "float32": backprop_hard_swish_mobilenet_kernel_float( (num_blocks,), (threads_per_block,), (out, dY, X, out.size) ) else: backprop_hard_swish_mobilenet_kernel_double( (num_blocks,), (threads_per_block,), (out, dY, X, out.size) ) return out def backprop_dish( dY, X, *, inplace: bool = False, threads_per_block=128, num_blocks=128, ): _is_float_array(dY) _is_float_array(X, shape=dY.shape) out = dY if not inplace: out = _alloc_like(dY, zeros=False) if dY.dtype == "float32": backprop_dish_kernel_float( (num_blocks,), (threads_per_block,), (out, dY, X, out.size) ) else: backprop_dish_kernel_double( (num_blocks,), (threads_per_block,), (out, dY, X, out.size) ) return out def backprop_gelu( dY, X, *, inplace: bool = False, threshold=6.0, threads_per_block=128, num_blocks=128, ): _is_float_array(dY) _is_float_array(X, shape=dY.shape) out = dY if not inplace: out = _alloc_like(dY, zeros=False) if dY.dtype == "float32": backprop_gelu_kernel_float( (num_blocks,), (threads_per_block,), (out, dY, X, threshold, out.size) ) else: backprop_gelu_kernel_double( (num_blocks,), (threads_per_block,), (out, dY, X, threshold, out.size) ) return out def backprop_maxout(dY, which, P, *, threads_per_block=128, num_blocks=128): _is_float_array(dY) B = dY.shape[0] I = dY.shape[1] out = _alloc((B, I, P), dtype=dY.dtype, zeros=True) _check_which_maxout(which, B, I, P) if dY.dtype == "float32": backprop_maxout_kernel_float( (num_blocks,), (threads_per_block,), (out, dY, which, B, I, P) ) else: backprop_maxout_kernel_double( (num_blocks,), (threads_per_block,), (out, dY, which, B, I, P) ) return out def backprop_mish( dY, X, *, inplace: bool = False, threshold=5, threads_per_block=128, num_blocks=128 ): _is_float_array(dY) _is_float_array(X, shape=dY.shape) out = dY if not inplace: out = _alloc_like(dY, zeros=False) if dY.dtype == "float32": backprop_mish_kernel_float( (num_blocks,), (threads_per_block,), (out, dY, X, threshold, dY.size) ) else: backprop_mish_kernel_double( (num_blocks,), (threads_per_block,), (out, dY, X, threshold, dY.size) ) return out def backprop_reduce_sum(d_sums, lengths, *, threads_per_block=128, num_blocks=128): _is_float_array(d_sums) B = len(lengths) T = int(lengths.sum()) O = d_sums.shape[1] _check_lengths(lengths, T) out = _alloc((T, O), dtype=d_sums.dtype, zeros=False) if d_sums.dtype == "float32": backprop_reduce_sum_kernel_float( (num_blocks,), (threads_per_block,), (out, d_sums, lengths, B, T, O) ) else: backprop_reduce_sum_kernel_double( (num_blocks,), (threads_per_block,), (out, d_sums, lengths, B, T, O) ) return out def backprop_reduce_mean(d_means, lengths, *, threads_per_block=128, num_blocks=128): _is_float_array(d_means) B = len(lengths) T = int(lengths.sum()) O = d_means.shape[1] _check_lengths(lengths, T) out = _alloc((T, O), dtype=d_means.dtype, zeros=False) if d_means.dtype == "float32": backprop_reduce_mean_kernel_float( (num_blocks,), (threads_per_block,), (out, d_means, lengths, B, T, O) ) else: backprop_reduce_mean_kernel_double( (num_blocks,), (threads_per_block,), (out, d_means, lengths, B, T, O) ) return out def backprop_reduce_max( d_maxes, which, lengths, *, threads_per_block=128, num_blocks=128 ): _is_float_array(d_maxes) B = len(lengths) T = int(lengths.sum()) O = d_maxes.shape[1] _check_lengths(lengths, T, min_length=1) out = _alloc((T, O), dtype=d_maxes.dtype, zeros=True) _check_which_reduce_max(which, (B, O), lengths) if d_maxes.dtype == "float32": backprop_reduce_max_kernel_float( (num_blocks,), (threads_per_block,), (out, d_maxes, which, lengths, B, T, O) ) else: backprop_reduce_max_kernel_double( (num_blocks,), (threads_per_block,), (out, d_maxes, which, lengths, B, T, O) ) return out def backprop_swish( dY, X, Y, *, inplace=False, threshold=17.0, threads_per_block=128, num_blocks=128 ): _is_float_array(dY) _is_float_array(X, shape=dY.shape) _is_float_array(Y, shape=dY.shape) out = dY if not inplace: out = _alloc_like(dY, zeros=False) if dY.dtype == "float32": backprop_swish_kernel_float( (num_blocks,), (threads_per_block,), (out, dY, X, Y, threshold, out.size) ) else: backprop_swish_kernel_double( (num_blocks,), (threads_per_block,), (out, dY, X, Y, threshold, out.size) ) return out def hash(ids, seed, *, threads_per_block=128, num_blocks=128): out = _alloc((ids.shape[0], 4), dtype="uint32", zeros=True) # sizeof(uint32_t) * 4 out_size = 4 * 4 in_size = 8 # sizeof(uint64_t) # T = ids.shape[0] hash_data_kernel( (num_blocks,), (threads_per_block,), (out, ids, out_size, in_size, ids.shape[0], seed), ) return out def _is_float_array(out, *, shape: Optional[Tuple] = None): assert out.dtype in ( "float32", "float64", ), "CUDA kernel can only handle float32 and float64" if shape is not None and out.shape != shape: msg = f"array has incorrect shape, expected: {shape}, was: {out.shape}" raise ValueError(msg) def _is_float_or_int_array(out, *, shape: Optional[Tuple] = None): assert out.dtype in ( "float32", "float64", "int32", "int64", ), "CUDA kernel can only handle float32, float64, int32 and int64" if shape is not None and out.shape != shape: msg = f"array has incorrect shape, expected: {shape}, was: {out.shape}" raise ValueError(msg) def _check_lengths(lengths, n_elems: int, *, min_length=0): assert lengths.dtype == "int32", "lengths should be encoded as 32-bit integers" if not cupy.all(lengths >= min_length): raise ValueError(f"all sequence lengths must be >= {min_length}") if cupy.sum(lengths) != n_elems: raise IndexError("lengths must sum up to the batch size") def _check_indices(indices, n: int): assert indices.dtype == "int32", "indices should be encoded as 32-bit integers" if not _values_within_range(indices, 0, n): raise IndexError(f"index out of bounds, must be >= 0 && < {n}") def _check_which_maxout(which, B: int, I: int, P: int): shape = (B, I) msg = "maximum index (which) should be encoded as 32-bit integers" assert which.dtype == "int32", msg if which.shape != shape: msg = f"maximum index (which) has incorrect shape, expected: {shape}, was: {which.shape}" raise ValueError(msg) if not _values_within_range(which, 0, P): raise IndexError("maximum index (which) value out of bounds") _values_within_range = ( cupy.ReductionKernel( "T x, T lower, T upper", "bool r", "x >= lower && x < upper", "a & b", "r = a", "true", "within_range", ) if has_cupy_gpu else None ) def _check_which_reduce_max(which, shape: Tuple, lengths): msg = "maximum index (which) should be encoded as 32-bit integers" assert which.dtype == "int32", msg if which.shape != shape: msg = f"maximum index (which) has incorrect shape, expected: {shape}, was: {which.shape}" raise ValueError(msg) if not cupy.all((which >= 0) & (which < cupy.expand_dims(lengths, -1))): raise IndexError("maximum index (which) value out of bounds") thinc-release-v9.1.1/thinc/backends/_murmur3.cu000066400000000000000000000121321467064331700214260ustar00rootroot00000000000000//----------------------------------------------------------------------------- // MurmurHash3 was written by Austin Appleby, and is placed in the public // domain. The author hereby disclaims copyright to this source code. // Note - The x86 and x64 versions do _not_ produce the same results, as the // algorithms are optimized for their respective platforms. You can still // compile and run any of them on any platform, but your performance with the // non-native version will be less than optimal. /* * This version is taken from https://github.com/PeterScott/murmur3 * and modified to work with CUDA. */ // Including stdint.h is a pain in cupy, so just put the declarations in. // Beware that long int is not 64bit on all platforms! // e.g. Windows requires a 'long long' to get to 64 bit. typedef unsigned char uint8_t; typedef unsigned int uint32_t; typedef signed char int8_t; typedef int int32_t; const unsigned long int test_var = 0; const int size = sizeof(test_var); #if size == 64 typedef unsigned long int uint64_t; typedef long int int64_t; #else typedef unsigned long long uint64_t; typedef long long int64_t; #endif //----------------------------------------------------------------------------- // Platform-specific functions and macros #define FORCE_INLINE __device__ static inline FORCE_INLINE uint64_t rotl64 ( uint64_t x, int8_t r ) { return (x << r) | (x >> (64 - r)); } #define ROTL64(x,y) rotl64(x,y) #define BIG_CONSTANT(x) (x##LLU) //----------------------------------------------------------------------------- // Block read - if your platform needs to do endian-swapping or can only // handle aligned reads, do the conversion here #define getblock(p, i) (p[i]) //----------------------------------------------------------------------------- // Finalization mix - force all bits of a hash block to avalanche __device__ static inline FORCE_INLINE uint32_t fmix32 ( uint32_t h ) { h ^= h >> 16; h *= 0x85ebca6b; h ^= h >> 13; h *= 0xc2b2ae35; h ^= h >> 16; return h; } //---------- __device__ static inline FORCE_INLINE uint64_t fmix64 ( uint64_t k ) { k ^= k >> 33; k *= BIG_CONSTANT(0xff51afd7ed558ccd); k ^= k >> 33; k *= BIG_CONSTANT(0xc4ceb9fe1a85ec53); k ^= k >> 33; return k; } //----------------------------------------------------------------------------- __device__ void MurmurHash3_x64_128 ( const void * key, const int len, const uint32_t seed, void * out ) { const uint8_t * data = (const uint8_t*)key; const int nblocks = len / 16; int i; uint64_t h1 = seed; uint64_t h2 = seed; uint64_t c1 = BIG_CONSTANT(0x87c37b91114253d5); uint64_t c2 = BIG_CONSTANT(0x4cf5ad432745937f); //---------- // body const uint64_t * blocks = (const uint64_t *)(data); for(i = 0; i < nblocks; i++) { uint64_t k1 = getblock(blocks,i*2+0); uint64_t k2 = getblock(blocks,i*2+1); k1 *= c1; k1 = ROTL64(k1,31); k1 *= c2; h1 ^= k1; h1 = ROTL64(h1,27); h1 += h2; h1 = h1*5+0x52dce729; k2 *= c2; k2 = ROTL64(k2,33); k2 *= c1; h2 ^= k2; h2 = ROTL64(h2,31); h2 += h1; h2 = h2*5+0x38495ab5; } //---------- // tail const uint8_t * tail = (const uint8_t*)(data + nblocks*16); uint64_t k1 = 0; uint64_t k2 = 0; switch(len & 15) { case 15: k2 ^= (uint64_t)(tail[14]) << 48; case 14: k2 ^= (uint64_t)(tail[13]) << 40; case 13: k2 ^= (uint64_t)(tail[12]) << 32; case 12: k2 ^= (uint64_t)(tail[11]) << 24; case 11: k2 ^= (uint64_t)(tail[10]) << 16; case 10: k2 ^= (uint64_t)(tail[ 9]) << 8; case 9: k2 ^= (uint64_t)(tail[ 8]) << 0; k2 *= c2; k2 = ROTL64(k2,33); k2 *= c1; h2 ^= k2; case 8: k1 ^= (uint64_t)(tail[ 7]) << 56; case 7: k1 ^= (uint64_t)(tail[ 6]) << 48; case 6: k1 ^= (uint64_t)(tail[ 5]) << 40; case 5: k1 ^= (uint64_t)(tail[ 4]) << 32; case 4: k1 ^= (uint64_t)(tail[ 3]) << 24; case 3: k1 ^= (uint64_t)(tail[ 2]) << 16; case 2: k1 ^= (uint64_t)(tail[ 1]) << 8; case 1: k1 ^= (uint64_t)(tail[ 0]) << 0; k1 *= c1; k1 = ROTL64(k1,31); k1 *= c2; h1 ^= k1; }; //---------- // finalization h1 ^= len; h2 ^= len; h1 += h2; h2 += h1; h1 = fmix64(h1); h2 = fmix64(h2); h1 += h2; h2 += h1; ((uint64_t*)out)[0] = h1; ((uint64_t*)out)[1] = h2; } //----------------------------------------------------------------------------- // Write a stream of hash values for an input stream. Each output may have up to 128 bits // of entropy. Input size should be specified in bytes. extern "C" __global__ void hash_data(char* dest, const char* src, size_t out_size, size_t in_size, size_t n_items, uint32_t seed) { char entropy[16]; // 128/8=16 int _loop_start = blockIdx.x * blockDim.x + threadIdx.x; int _loop_stride = blockDim.x * gridDim.x; for (int i = _loop_start; i < n_items; i += _loop_stride) { const char* src_i = &src[i*in_size]; char* dest_i = &dest[i*out_size]; MurmurHash3_x64_128(src_i, in_size, seed, entropy); for (int j=0; j < out_size; ++j) dest_i[j] = entropy[j]; } } thinc-release-v9.1.1/thinc/backends/_param_server.py000066400000000000000000000052641467064331700225330ustar00rootroot00000000000000from typing import Any, Dict, Optional, Tuple from ..types import FloatsXd from ..util import get_array_module KeyT = Tuple[int, str] class ParamServer: """Serve parameters for a single process.""" _params: Dict[KeyT, FloatsXd] = {} _grads: Dict[KeyT, FloatsXd] = {} proxy: Optional[Any] def __init__( self, params: Dict[KeyT, FloatsXd] = {}, grads: Dict[KeyT, FloatsXd] = {}, *, proxy=None ): self._params = dict(params) self._grads = dict(grads) # Allow a 'proxy' to be provided to support remote parameters. This # is experimental, it's the mechanism we use in the Ray integration. self.proxy = proxy @property def param_keys(self) -> Tuple[KeyT, ...]: """Get the names of registered parameter (including unset).""" return tuple(self._params.keys()) @property def grad_keys(self) -> Tuple[KeyT, ...]: return tuple([key for key in self.param_keys if self.has_grad(*key)]) def has_param(self, model_id: int, name: str) -> bool: return (model_id, name) in self._params def has_grad(self, model_id: int, name: str) -> bool: return (model_id, name) in self._grads def get_param(self, model_id: int, name: str) -> FloatsXd: key = (model_id, name) if self.proxy is not None: self._params[key] = self.proxy.get_param(model_id, name) return self._params[key] def get_grad(self, model_id: int, name: str) -> FloatsXd: key = (model_id, name) return self._grads[key] def set_param(self, model_id: int, name: str, value: FloatsXd) -> None: if self.proxy is not None: self.proxy.set_param(model_id, name, value) self._params[(model_id, name)] = value def set_grad(self, model_id: int, name: str, value: FloatsXd) -> None: if self.proxy is not None: self.proxy.set_grad(model_id, name, value) else: self._grads[(model_id, name)] = value def inc_grad(self, model_id: int, name: str, value: FloatsXd) -> None: key = (model_id, name) if self.proxy is not None: self.proxy.inc_grad(model_id, name, value) elif not self.has_grad(model_id, name): # pragma: no cover if hasattr(value, "copy"): # Adjustment for Jax self._grads[key] = value.copy() elif not value.flags["C_CONTIGUOUS"]: xp = get_array_module(value) self._grads[(model_id, name)] = xp.ascontiguousarray(value) else: self._grads[(model_id, name)] = value else: self._grads[(model_id, name)] += value thinc-release-v9.1.1/thinc/backends/apple_ops.pyx000066400000000000000000000017641467064331700220610ustar00rootroot00000000000000from typing import Optional import numpy from ._accelerate import gemm from ._accelerate cimport saxpy, sgemm from .cblas cimport CBlas, set_saxpy, set_sgemm from .. import registry from ..types import Floats2d from .numpy_ops import NumpyOps @registry.ops("AppleOps") class AppleOps(NumpyOps): """Thinc Ops class that calls into Apple's native libraries for some operations. Other operations fall back to numpy.""" name = "apple" xp = numpy def cblas(self) -> CBlas: cdef CBlas cblas = CBlas() set_saxpy(cblas, saxpy) set_sgemm(cblas, sgemm) return cblas def gemm( self, x: Floats2d, y: Floats2d, out: Optional[Floats2d] = None, trans1: bool = False, trans2: bool = False, ) -> Floats2d: """Perform General Matrix Multiplication (GeMM) and optionally store the result in the specified output variable. """ return gemm(x, y, out=out, trans1=trans1, trans2=trans2) thinc-release-v9.1.1/thinc/backends/cblas.pxd000066400000000000000000000037521467064331700211350ustar00rootroot00000000000000from libcpp.memory cimport shared_ptr ctypedef void (*sgemm_ptr)(bint transA, bint transB, int M, int N, int K, float alpha, const float* A, int lda, const float* B, int ldb, float beta, float* C, int ldc) nogil ctypedef void (*dgemm_ptr)(bint transA, bint transB, int M, int N, int K, double alpha, const double* A, int lda, const double* B, int ldb, double beta, double* C, int ldc) nogil ctypedef void (*saxpy_ptr)(int N, float alpha, const float* X, int incX, float *Y, int incY) nogil ctypedef void (*daxpy_ptr)(int N, double alpha, const double* X, int incX, double *Y, int incY) nogil ctypedef void (*sscal_ptr)(int N, float alpha, float* X, int incX) nogil ctypedef void (*dscal_ptr)(int N, double alpha, double* X, int incX) nogil # Forward-declaration of the BlasFuncs struct. This struct must be opaque, so # that consumers of the CBlas class cannot become dependent on its size or # ordering. cdef struct BlasFuncs cdef class CBlas: cdef shared_ptr[BlasFuncs] ptr # Note: the following functions are intentionally standalone. If we make them # methods of CBlas, Cython will generate and use a vtable. This makes it # impossible to add new BLAS functions later without breaking the ABI. # # See https://github.com/explosion/thinc/pull/700 for more information. cdef daxpy_ptr daxpy(CBlas cblas) nogil cdef saxpy_ptr saxpy(CBlas cblas) nogil cdef sgemm_ptr sgemm(CBlas cblas) nogil cdef dgemm_ptr dgemm(CBlas cblas) nogil cdef sscal_ptr sscal(CBlas cblas) nogil cdef dscal_ptr dscal(CBlas cblas) nogil cdef void set_daxpy(CBlas cblas, daxpy_ptr daxpy) nogil cdef void set_saxpy(CBlas cblas, saxpy_ptr saxpy) nogil cdef void set_sgemm(CBlas cblas, sgemm_ptr sgemm) nogil cdef void set_dgemm(CBlas cblas, dgemm_ptr dgemm) nogil cdef void set_sscal(CBlas cblas, sscal_ptr sscal) nogil cdef void set_dscal(CBlas cblas, dscal_ptr dscal) nogil thinc-release-v9.1.1/thinc/backends/cblas.pyx000066400000000000000000000040341467064331700211540ustar00rootroot00000000000000# cython: profile=False cimport blis.cy from cython.operator cimport dereference as deref from libcpp.memory cimport make_shared # Single- and double-precision wrappers for `blis.cy.scalv` cdef void blis_sscal(int N, float alpha, float* X, int incX) nogil: blis.cy.scalv(blis.cy.NO_CONJUGATE, N, alpha, X, incX) cdef void blis_dscal(int N, double alpha, double* X, int incX) nogil: blis.cy.scalv(blis.cy.NO_CONJUGATE, N, alpha, X, incX) cdef struct BlasFuncs: daxpy_ptr daxpy saxpy_ptr saxpy sgemm_ptr sgemm dgemm_ptr dgemm sscal_ptr sscal dscal_ptr dscal cdef class CBlas: __slots__ = [] def __init__(self): """Construct a CBlas instance set to use BLIS implementations of the supported BLAS functions.""" cdef BlasFuncs funcs funcs.daxpy = blis.cy.daxpy funcs.saxpy = blis.cy.saxpy funcs.sgemm = blis.cy.sgemm funcs.dgemm = blis.cy.dgemm funcs.sscal = blis_sscal funcs.dscal = blis_dscal self.ptr = make_shared[BlasFuncs](funcs) cdef daxpy_ptr daxpy(CBlas cblas) nogil: return deref(cblas.ptr).daxpy cdef saxpy_ptr saxpy(CBlas cblas) nogil: return deref(cblas.ptr).saxpy cdef sgemm_ptr sgemm(CBlas cblas) nogil: return deref(cblas.ptr).sgemm cdef dgemm_ptr dgemm(CBlas cblas) nogil: return deref(cblas.ptr).dgemm cdef sscal_ptr sscal(CBlas cblas) nogil: return deref(cblas.ptr).sscal cdef dscal_ptr dscal(CBlas cblas) nogil: return deref(cblas.ptr).dscal cdef void set_daxpy(CBlas cblas, daxpy_ptr daxpy) nogil: deref(cblas.ptr).daxpy = daxpy cdef void set_saxpy(CBlas cblas, saxpy_ptr saxpy) nogil: deref(cblas.ptr).saxpy = saxpy cdef void set_sgemm(CBlas cblas, sgemm_ptr sgemm) nogil: deref(cblas.ptr).sgemm = sgemm cdef void set_dgemm(CBlas cblas, dgemm_ptr dgemm) nogil: deref(cblas.ptr).dgemm = dgemm cdef void set_sscal(CBlas cblas, sscal_ptr sscal) nogil: deref(cblas.ptr).sscal = sscal cdef void set_dscal(CBlas cblas, dscal_ptr dscal) nogil: deref(cblas.ptr).dscal = dscal thinc-release-v9.1.1/thinc/backends/cpu_kernels.hh000066400000000000000000000344111467064331700221630ustar00rootroot00000000000000#ifndef CPU_KERNELS_HH #define CPU_KERNELS_HH #include #include #include #include #include #include // Ideally we'd use an alias declaration for a generic definition of // *axpy. But Cython doesn't support alias declarations yet: // // https://github.com/cython/cython/issues/3272 // // template // using axpy = void (*)(int N, T alpha, const T* X, int incX, // T *Y, int incY); // // So, instead we'll do this the pre-C++11 way: template struct axpy { typedef void (*ptr)(int N, T alpha, const T* X, int incX, T *Y, int incY); }; // All elementwise functions, such as most activations, work in-place. template struct argmax_result { T max; L max_idx; }; template argmax_result argmax(T const *arr, L len) { static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); argmax_result r { arr[0], 0 }; for (L i = 1; i < len; ++i) { if (arr[i] > r.max) { r.max = arr[i]; r.max_idx = i; } } return r; } // The next two templates define argmax for a fixed number of elements. template argmax_result argmax(T a) { static_assert(std::is_floating_point::value, "Argument should be floating point"); argmax_result acc { a, 0 }; return acc; } template argmax_result argmax(T a, Args... args) { static_assert(std::is_floating_point::value, "Arguments should be floating point"); auto acc = argmax(args...); if (acc.max > a) { acc.max_idx += 1; } else { acc.max_idx = 0; acc.max = a; } return acc; } template void vec_add(A* X, const A* Y, A scale, L N) { static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); for (L i = 0; i < N; ++i) X[i] += scale * Y[i]; } template void cpu_maxout(A* best__bo, L* which__bo, const A* cands__bop, L B, L O, L P) { static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); // For small inputs, we use an unrolled argmax. if (P == 2) { for (int i = 0; i < B * O; ++i) { A const *input = cands__bop + i * P; auto r = argmax(input[0], input[1]); which__bo[i] = r.max_idx; best__bo[i] = r.max; } } else if (P == 3) { for (int i = 0; i < B * O; ++i) { A const *input = cands__bop + i * P; auto r = argmax(input[0], input[1], input[2]); which__bo[i] = r.max_idx; best__bo[i] = r.max; } } else { for (int i = 0; i < B * O; ++i) { auto r = argmax(cands__bop + i * P, P); which__bo[i] = r.max_idx; best__bo[i] = r.max; } } } template void cpu_backprop_maxout(A* dX__bop, const A* dX__bo, const L* which__bo, L B, L O, L P) { static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); for (L b = 0; b < B; ++b) { for (L o = 0; o < O; ++o) { if (*which__bo >= P) { throw std::out_of_range(std::string("index ") + std::to_string(*which__bo) + " is out of bounds for maxout with size " + std::to_string(P)); } dX__bop[*which__bo] = *dX__bo; dX__bop += P; dX__bo += 1; which__bo += 1; } } } template void cpu_reduce_max(A* maxes__bo, L* which__bo, const A* X__to, const L* lengths__b, L B, L T, L O) { static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); for (const L* length = lengths__b; length < lengths__b + B; ++length) { if (*length <= 0) throw std::invalid_argument(std::string("all sequence lengths must be > 0, was: ") + std::to_string(*length)); else if (*length > T) { throw std::out_of_range("lengths must sum up to the number of rows"); } T -= *length; std::memcpy(maxes__bo, X__to, O * sizeof(*maxes__bo)); X__to += O; for (L i = 1; i < *length; ++i) { for (L j = 0; j < O; ++j) { if (X__to[j] > maxes__bo[j]) { maxes__bo[j] = X__to[j]; which__bo[j] = i; } } X__to += O; } maxes__bo += O; which__bo += O; } } template void cpu_backprop_reduce_max(A* dX__to, const A* d_maxes__bo, const L* which__bo, const L* lengths__b, L B, L T, L O) { static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); for (const L* length = lengths__b; length < lengths__b + B; ++length) { for (L i = 0; i < O; ++i) { L item = which__bo[i]; if (item >= *length) { throw std::out_of_range(std::string("index ") + std::to_string(item) + " is out of bounds for maxout with length " + std::to_string(*length)); } dX__to[item * O + i] = d_maxes__bo[i]; } dX__to += *length * O; d_maxes__bo += O; which__bo += O; } } template void cpu_reduce_mean(A* means__bo, const A* X__to, const L* lengths__b, L B, L T, L O) { static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); for (const L* length = lengths__b; length < lengths__b + B; ++length) { if (*length < 0) { throw std::invalid_argument(std::string("all sequence lengths must be >= 0, was: ") + std::to_string(*length)); } else if (length == 0) { means__bo += O; continue; } else if (*length > T) { throw std::out_of_range("lengths must sum up to the number of rows"); } T -= *length; A scale = 1. / *length; for (L i = 0; i < *length; ++i) { vec_add(means__bo, X__to, scale, O); X__to += O; } means__bo += O; } } template void cpu_backprop_reduce_mean(A* dX__to, const A* d_means__bo, const L* lengths__b, L B, L T, L O) { static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); for (const L* length = lengths__b; length < lengths__b + B; ++length) { A scale = 1. / *length; for (L i = 0; i < *length; ++i) { vec_add(dX__to, d_means__bo, scale, O); dX__to += O; } d_means__bo += O; } } template void cpu_mish(A* Y, L N, A threshold) { static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); for (L i = 0; i < N; ++i) { if (Y[i] < threshold) { Y[i] *= std::tanh(std::log(1.0 + std::exp(Y[i]))); } } } template void cpu_backprop_mish(A* dX, const A* X, L N, A threshold) { static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); for (L i = 0; i < N; ++i) { A x = X[i]; if (x < threshold) { A exp_x = std::exp(x); A exp_2x = std::exp(2 * x); A exp_3x = std::exp(3 * x); A omega = (4. * (x + 1)) + (4 * exp_2x) + exp_3x + exp_x * (4. * x + 6); A delta = 2. * exp_x + exp_2x + 2.; dX[i] = dX[i] * ((exp_x * omega) / (delta * delta)); } } } template void cpu_reduce_sum(A* sums__bo, const A* X__to, const L* lengths__b, L B, L T, L O) { static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); for (const L* length = lengths__b; length < lengths__b + B; ++length) { if (*length < 0) { throw std::invalid_argument(std::string("all sequence lengths must be >= 0, was: ") + std::to_string(*length)); } else if (length == 0) { sums__bo += O; continue; } else if (*length > T) { throw std::out_of_range("lengths must sum up to the number of rows"); } T -= *length; for (L i = 0; i < *length; ++i) { vec_add(sums__bo, X__to, static_cast(1.0), O); X__to += O; } sums__bo += O; } } template void cpu_backprop_reduce_sum(A* dX__to, const A* d_sums__bo, const L* lengths__b, L B, L T, L O) { static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); for (const L* length = lengths__b; length < lengths__b + B; ++length) { for (L i = 0; i < *length; ++i) { vec_add(dX__to, d_sums__bo, static_cast(1.0), O); dX__to += O; } d_sums__bo += O; } } template void cpu_relu(A* X, L N) { static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); for (L i = 0; i < N; ++i) { if (X[i] <= 0.0) { X[i] = 0.0; } } } template void seq2col(A* output, const A* X, const L* lengths, L nW, L B, L I, L nL) { // Let's say nW is 1 (it usually is). Then we want to take: // 1a 1b 1c // 2a 2b 2c // 3a 3b 3c // And make // __ __ __ 1a 1b 1c 2a 2b 2c // 1a 1b 1c 2a 2b 2c 3a 3b 3c // 2a 2b 2c 3a 3b 3c __ __ __ // Where __ is padding. // Now let's say nW is 2. Then we want to take: // 1a 1b 1c // 2a 2b 2c // 3a 3b 3c // And make // __ __ __ __ __ __ 1a 1b 1c 2a 2b 2c 3a 3b 3c // __ __ __ 1a 1b 1c 2a 2b 2c 3a 3b 3c __ __ __ // 1a 1b 1c 2a 2b 2c 3a 3b 3c __ __ __ __ __ __ // * x_start=-6, x_end=9 : (0-2) * 3, (0+2+1) * 3 // * x_start=-3, x_end=13 : (1-2) * 3, (1+2+1) * 3 // * x_start=0, x_end=16 : (2-2) * 3, (2+2+1) * 3 // If lengths > 1, then the sequence lengths dictate // the boundaries/padding rather than the begin/end // of X. static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); L nF = nW * 2 + 1; L seq_start = 0; for (L i = 0; i < nL; ++i) { // Calculate the bounds of the next sequence. L seq_end = seq_start + lengths[i]; for (L j = seq_start; j < seq_end; ++j) { // Find the unconstrained window around b, which // may be out of the sequence bounds. L window_start = j - nW; L window_end = j + nW + 1; // Find the sequence-constrained window around b. L x_start = std::max(seq_start, window_start); L x_end = std::min(seq_end, window_end); L n_elems = x_end - x_start; L out_offset = x_start - window_start; std::memcpy(output + (j * nF * I) + (out_offset * I), X + (x_start * I), n_elems * I * sizeof(*output)); } seq_start += lengths[i]; } } template void backprop_seq2col(A* d_seqs, const A* d_cols, const L* lengths, L B, L I, L nW, L nL) { // here's what we're doing, if we had 2d indexing. // for i in range(b): // d_seq[i] += d_cols[i-2, 4] // d_seq[i] += d_cols[i-1, 3] // d_seq[i] += d_cols[i, 2] // d_seq[i] += d_cols[i+1, 1] // d_seq[i] += d_cols[i+2, 0] static_assert(std::is_floating_point::value, "Array should be floating point"); static_assert(std::is_integral::value, "Array length should be integral"); L nF = nW * 2 + 1; L seq_start = 0; for (L i = 0; i < nL; ++i) { // Calculate the bounds of the next sequence. L seq_end = seq_start + lengths[i]; for (L j = seq_start; j < seq_end; ++j) { // Find the unconstrained window around b, which // may be out of the sequence bounds. L window_begin = j - nW; L window_end = j + nW + 1; // Find the sequence-constrained window around b. L d_seqs_begin = std::max(seq_start, window_begin); L d_seqs_end = std::min(seq_end, window_end); L n_elems = d_seqs_end - d_seqs_begin; // If the left window is cut short, we want to // start by the same amount in the output. L out_offset = d_seqs_begin - window_begin; vec_add(d_seqs + d_seqs_begin * I, d_cols + (j * nF * I) + (out_offset * I), static_cast(1.), n_elems * I); } seq_start += lengths[i]; } } template void cpu_gather_add(typename axpy::ptr axpy, F* out_bo, const F* table_to, const I* indices_bk, L T, L O, L B, L K) { for (L b = 0; b < B; ++b) { for (L k = 0; k < K; ++k) { I idx = indices_bk[b * K + k]; if (idx > T) { throw std::out_of_range("Embedding index out-of-bounds"); } axpy(O, 1.0, table_to + idx * O, 1, out_bo + b * O, 1); } } } #endif // CPU_KERNELS_HH thinc-release-v9.1.1/thinc/backends/cupy_ops.py000066400000000000000000000312261467064331700215440ustar00rootroot00000000000000import numpy from .. import registry from ..compat import cublas, cupy, cupyx from ..types import DeviceTypes from ..util import ( is_cupy_array, is_mxnet_gpu_array, is_tensorflow_gpu_array, is_torch_cuda_array, mxnet2xp, tensorflow2xp, torch2xp, ) from . import _custom_kernels from .numpy_ops import NumpyOps from .ops import Ops @registry.ops("CupyOps") class CupyOps(Ops): name = "cupy" xp = cupy _xp2 = cupyx def __init__( self, device_type: DeviceTypes = "gpu", device_id: int = 0, **kwargs ) -> None: self.device_type = device_type self.device_id = device_id def to_numpy(self, data, *, byte_order=None): if not isinstance(data, numpy.ndarray): data = data.get() if byte_order: dtype = data.dtype.newbyteorder(byte_order) data = numpy.asarray(data, dtype=dtype) return data def gather_add(self, table, indices): if table.dtype in ("float32", "float64"): return _custom_kernels.gather_add(table, indices) else: return super().gather_add(table, indices) def dish(self, X, inplace=False): if X.dtype in ("float32", "float64"): return _custom_kernels.dish(X, inplace=inplace) else: return super().dish(X, inplace=inplace) def backprop_dish(self, dY, X, inplace=False): if X.dtype == dY.dtype and X.dtype in ("float32", "float64"): return _custom_kernels.backprop_dish(dY, X, inplace=inplace) else: return super().backprop_dish(dY, X, inplace=inplace) def gelu(self, X, inplace=False): if X.dtype in ("float32", "float64"): return _custom_kernels.gelu(X, inplace=inplace, threshold=6.0) else: return super().gelu(X, inplace=inplace) def backprop_gelu(self, dY, X, inplace=False): if X.dtype == dY.dtype and X.dtype in ("float32", "float64"): return _custom_kernels.backprop_gelu(dY, X, inplace=inplace, threshold=6.0) else: return super().backprop_gelu(dY, X, inplace=inplace) def gemm(self, x, y, out=None, trans1=False, trans2=False): if isinstance(x, numpy.ndarray) or isinstance(y, numpy.ndarray): raise ValueError( "Encountered a numpy array when processing with cupy. " "Did you call model.ops.asarray on your data?" ) if trans1: x = x.T if trans2: y = y.T if out is None: return self.xp.dot(x, y) else: self.xp.dot(x, y, out=out) return out def asarray(self, data, dtype=None): # We'll try to perform a zero-copy conversion if possible. if is_cupy_array(data): array = self.xp.asarray(data, dtype=dtype) elif is_torch_cuda_array(data): array = torch2xp(data) elif is_tensorflow_gpu_array(data): array = tensorflow2xp(data) elif is_mxnet_gpu_array(data): array = mxnet2xp(data) else: array = self.xp.array(data, dtype=dtype) if dtype is not None: array = array.astype(dtype=dtype, copy=False) return array def pad(self, seqs, round_to=1): """Perform padding on a list of arrays so that they each have the same length, by taking the maximum dimension across each axis. This only works on non-empty sequences with the same `ndim` and `dtype`. """ # TODO: This should be generalized to handle different ranks if not seqs: raise ValueError("Cannot pad empty sequence") if len(set(seq.ndim for seq in seqs)) != 1: raise ValueError("Cannot pad sequences with different ndims") if len(set(seq.dtype for seq in seqs)) != 1: raise ValueError("Cannot pad sequences with different dtypes") if len(set(seq.shape[1:] for seq in seqs)) != 1: raise ValueError("Cannot pad sequences that differ on other dimensions") # Our CUDA kernel can currently only handle C contiguous arrays. if not all(seq.flags["C_CONTIGUOUS"] for seq in seqs) or seqs[0].dtype not in ( "float32", "float64", "int32", "int64", ): return super().pad(seqs, round_to) return _custom_kernels.pad(seqs, round_to) def maxout(self, X): if X.dtype in ("float32", "float64"): return _custom_kernels.maxout(X) else: return super().maxout(X) def backprop_maxout(self, dY, which, P): if dY.dtype in ("float32", "float64") and which.dtype == "int32": return _custom_kernels.backprop_maxout(dY, which, P) else: return super().backprop_maxout(dY, which, P) def relu(self, X, inplace=False): if not inplace: return X * (X > 0) else: X *= X > 0 return X def backprop_relu(self, dY, Y, inplace=False): if not inplace: return dY * (Y > 0) dY *= Y > 0 return dY def clipped_linear( self, X, slope: float = 1.0, offset: float = 0.0, min_val: float = 0.0, max_val: float = 1.0, inplace: bool = False, ): if X.dtype in ("float32", "float64"): return _custom_kernels.clipped_linear( X, inplace=inplace, slope=slope, offset=offset, min_val=min_val, max_val=max_val, ) else: return super().clipped_linear( X, inplace=inplace, slope=slope, offset=offset, min_val=min_val, max_val=max_val, ) def backprop_clipped_linear( self, dY, X, slope: float = 1.0, offset: float = 0.0, min_val: float = 0.0, max_val: float = 1.0, inplace: bool = False, ): if X.dtype == dY.dtype and X.dtype in ("float32", "float64"): return _custom_kernels.backprop_clipped_linear( dY, X, slope=slope, offset=offset, min_val=min_val, max_val=max_val, inplace=inplace, ) else: return super().backprop_clipped_linear( dY=dY, X=X, slope=slope, offset=offset, min_val=min_val, max_val=max_val, inplace=inplace, ) def backprop_hard_swish(self, dY, X, inplace: bool = False): if X.dtype == dY.dtype and X.dtype in ("float32", "float64"): return _custom_kernels.backprop_hard_swish(dY, X, inplace=inplace) else: return super().backprop_hard_swish(dY, X, inplace=inplace) def backprop_hard_swish_mobilenet(self, dY, X, inplace: bool = False): if X.dtype == dY.dtype and X.dtype in ("float32", "float64"): return _custom_kernels.backprop_hard_swish_mobilenet(dY, X, inplace=inplace) else: return super().backprop_hard_swish_mobilenet(dY, X, inplace=inplace) def mish(self, X, threshold=20.0, inplace=False): if X.dtype in ("float32", "float64"): return _custom_kernels.mish(X, inplace=inplace, threshold=threshold) else: return super().mish(X, threshold, inplace) def backprop_mish(self, dY, X, threshold=20.0, inplace=False): if X.dtype == dY.dtype and X.dtype in ("float32", "float64"): return _custom_kernels.backprop_mish( dY, X, inplace=inplace, threshold=threshold ) else: return super().backprop_mish(dY, X, threshold, inplace) def swish(self, X, inplace=False): if X.dtype in ("float32", "float64"): return _custom_kernels.swish(X, inplace=inplace, threshold=17.0) else: return super().swish(X, inplace=inplace) def backprop_swish(self, dY, X, Y, inplace=False): if X.dtype == dY.dtype == Y.dtype and X.dtype in ("float32", "float64"): return _custom_kernels.backprop_swish( dY, X, Y, inplace=inplace, threshold=17.0 ) else: return super().backprop_swish(dY, X, Y, inplace=inplace) def clip_gradient(self, gradient, threshold): # We do not use CuPy's linalg.norm, since it uses scalar reductions # using one CUDA block. This is a lot slower than the cuBLAS # implementation. def frobenius_norm(X): X_vec = X.reshape(-1) return cublas.nrm2(X_vec) grad_norm = cupy.maximum(frobenius_norm(gradient), 1e-12) gradient *= cupy.minimum(threshold, grad_norm) / grad_norm return gradient def seq2col(self, seq, nW, *, lengths=None): """Given an (M, N) sequence of vectors, return an (M, N*(nW*2+1)) sequence. The new sequence is constructed by concatenating nW preceding and succeeding vectors onto each column in the sequence, to extract a window of features. """ if seq.dtype in ("float32", "float64") and ( lengths is None or lengths.dtype == "int32" ): return _custom_kernels.seq2col(seq, nW, lengths=lengths) else: return super().seq2col(seq, nW, lengths=lengths) def backprop_seq2col(self, dY, nW, *, lengths=None): if dY.dtype in ("float32", "float64") and ( lengths is None or lengths.dtype == "int32" ): return _custom_kernels.backprop_seq2col(dY, nW, lengths=lengths) else: return super().backprop_seq2col(dY, nW, lengths=lengths) def reduce_mean(self, X, lengths): if X.dtype in ("float32", "float64") and lengths.dtype == "int32": return _custom_kernels.reduce_mean(X, lengths=lengths) else: super().reduce_mean(X, lengths) def backprop_reduce_mean(self, d_means, lengths): if d_means.dtype in ("float32", "float64") and lengths.dtype == "int32": return _custom_kernels.backprop_reduce_mean(d_means, lengths) else: super().backprop_reduce_mean(d_means, lengths) def reduce_max(self, X, lengths): if X.dtype in ("float32", "float64") and lengths.dtype == "int32": return _custom_kernels.reduce_max(X, lengths) else: super().reduce_max(X, lengths) def backprop_reduce_max(self, d_maxes, which, lengths): if ( d_maxes.dtype in ("float32", "float64") and which.dtype == "int32" and lengths.dtype == "int32" ): return _custom_kernels.backprop_reduce_max(d_maxes, which, lengths) else: super().backprop_reduce_max(d_maxes, which, lengths) def reduce_sum(self, X, lengths): if X.dtype in ("float32", "float64") and lengths.dtype == "int32": return _custom_kernels.reduce_sum(X, lengths) else: return super().reduce_sum(X, lengths) def backprop_reduce_sum(self, d_sums, lengths): if d_sums.dtype in ("float32", "float64") and lengths.dtype == "int32": return _custom_kernels.backprop_reduce_sum(d_sums, lengths) else: return super().backprop_reduce_sum(d_sums, lengths) def hash(self, ids, seed): return _custom_kernels.hash(ids, seed) def scatter_add(self, table, indices, values): self._xp2.scatter_add(table, indices, values) def adam( self, weights, gradient, mom1, mom2, beta1, beta2, eps, learn_rate, mod_rate=1.0 ): _check_compatible_shape(weights, gradient) _check_compatible_shape(weights, mom1) _check_compatible_shape(weights, mom2) adam_kernel( gradient, learn_rate, 1 - beta1, 1 - beta2, eps, weights, mom1, mom2 ) gradient.fill(0) return weights, gradient, mom1, mom2 def position_encode(self, N, D, period=10000, out=None): positions = NumpyOps().position_encode(N, D, period=period, out=out) return self.asarray(positions) if cupy is not None: adam_kernel = cupy.ElementwiseKernel( "T grad, T lr, T one_minus_beta1, T one_minus_beta2, T eps", "T param, T m, T v", """m += one_minus_beta1 * (grad - m); v += one_minus_beta2 * (grad * grad - v); param -= lr * m / (sqrt(v) + eps);""", "adam", ) else: adam_kernel = None def _check_compatible_shape(u, v): if u.shape != v.shape: msg = f"arrays have incompatible shapes: {u.shape} and {v.shape}" raise ValueError(msg) thinc-release-v9.1.1/thinc/backends/mps_ops.py000066400000000000000000000011741467064331700213620ustar00rootroot00000000000000from typing import TYPE_CHECKING import numpy from .. import registry from ..compat import has_apple_ops from .numpy_ops import NumpyOps from .ops import Ops if TYPE_CHECKING: # Type checking does not work with dynamic base classes, since MyPy cannot # determine against which base class to check. So, always derive from Ops # during type checking. _Ops = Ops else: if has_apple_ops: from .apple_ops import AppleOps _Ops = AppleOps else: _Ops = NumpyOps @registry.ops("MPSOps") class MPSOps(_Ops): """Ops class for Metal Performance shaders.""" name = "mps" xp = numpy thinc-release-v9.1.1/thinc/backends/numpy_ops.pxd000066400000000000000000000037051467064331700221000ustar00rootroot00000000000000from .cblas cimport saxpy_ptr ctypedef double[:, ::1] double2d_t ctypedef double[:, :, ::1] double3d_t ctypedef float[:, ::1] float2d_t ctypedef float[:, :, ::1] float3d_t ctypedef int[:, ::1] int2d_t ctypedef unsigned int[:, ::1] uint2d_t cdef fused ints2d_ft: int2d_t uint2d_t cdef fused reals2d_ft: float2d_t double2d_t cdef fused reals3d_ft: float3d_t double3d_t cdef extern from "cpu_kernels.hh": cdef cppclass axpy[T]: ctypedef void (*ptr)(int N, T alpha, const T* X, int incX, T *Y, int incY); void cpu_maxout[A, L](A* best__bo, L* which__bo, const A* cands_bop, L B, L O, L P) void cpu_backprop_maxout[A, L](A* dX__bop, const A* dX__bo, const L* which__bo, L B, L O, L P) except + void cpu_reduce_max[A, L](A* maxes__bo, L* which_bo, const A* X__to, const L* lengths__b, L B, L T, L O) except + void cpu_backprop_reduce_max[A, L](A* dX__to, const A* d_maxes__bo, const L* which__bo, const L* lengths__b, L B, L T, L O) except + void cpu_reduce_mean[A, L](A* means__bo, const A* X__to, const L* lengths__b, L B, L T, L O) except + void cpu_backprop_reduce_mean[A, L](A* dX__to, const A* d_means__bo, const L* lengths__b, L B, L T, L O) void cpu_mish[A, L](A* Y, L N, A threshold) void cpu_backprop_mish[A, L](A* dX, const A* X, L N, A threshold) void cpu_reduce_sum[A, L](A* sums__bo, const A* X__to, const L* lengths__b, L B, L T, L O) except + void cpu_backprop_reduce_sum[A, L](A* dX__to, const A* d_sums__bo, const L* lengths__b, L B, L T, L O) void cpu_relu[A, L](A* X, L N) void backprop_seq2col[A, L](A* d_seqs, const A* d_cols, const L* lengths, L B, L I, L nW, L nL) void seq2col[A, L](A* output, const A* X, const L* lengths, L nW, L B, L I, L nL) void cpu_gather_add[F, I, L](axpy[F].ptr axpy, F* out_bo, const F* table_to, const I* indices_bk, L T, L O, L B, L K) except + thinc-release-v9.1.1/thinc/backends/numpy_ops.pyx000066400000000000000000001125561467064331700221320ustar00rootroot00000000000000# cython: cdivision=True # cython: infer_types=True from collections.abc import Sized from typing import Optional import numpy cimport cython cimport numpy as np from cymem.cymem cimport Pool from libc.math cimport isnan from libc.stdint cimport uint32_t, uint64_t from libc.stdlib cimport calloc, free, malloc from libc.string cimport memcpy, memset from murmurhash.mrmr cimport hash64 from preshed.maps cimport PreshMap from .. import registry from ..types import ArrayXd, DeviceTypes, DTypes, Shape from ..util import copy_array, get_array_module from .cblas cimport CBlas, daxpy, dgemm, saxpy, sgemm, sscal from ..compat import has_blis from .ops import Ops, _split_weights, _transpose_weights, _untranspose_unsplit_weights cdef extern from "math.h": float logf(float x) nogil float sqrtf(float x) nogil float expf(float x) nogil float tanhf(float x) nogil float sinf(float x) nogil float cosf(float x) nogil @registry.ops("NumpyOps") class NumpyOps(Ops): name = "numpy" xp = numpy def __init__( self, device_type: DeviceTypes = "cpu", device_id: int = -1, *, use_blis: bool = True ) -> None: self.device_type = device_type self.device_id = device_id self.use_blis = use_blis if self.use_blis and not has_blis: raise ValueError("BLIS support requires blis: pip install blis") def asarray(self, data, dtype=None): if isinstance(data, self.xp.ndarray): array = data elif hasattr(data, 'numpy'): # Handles PyTorch Tensor array = data.numpy() elif hasattr(data, "get"): array = data.get() else: array = self.xp.array(data, dtype=dtype) if dtype is not None: array = array.astype(dtype=dtype, copy=False) return array def alloc(self, shape: Shape, *, dtype: Optional[DTypes] = "float32", zeros: bool = True) -> ArrayXd: if zeros: return self.xp.zeros(shape, dtype=dtype) else: return self.xp.empty(shape, dtype=dtype) def cblas(self) -> CBlas: return CBlas() def gemm(self, np.ndarray x, np.ndarray y, *, np.ndarray out=None, trans1=False, trans2=False): if x.ndim != 2: raise ValueError(f"Provided 'x' array should be 2-dimensional, but found {x.ndim} dimension(s).") if y.ndim != 2: raise ValueError(f"Provided 'y' array should be 2-dimensional, but found {y.ndim} dimension(s).") if not self.use_blis: # delegate to base Ops return super().gemm(x, y, out=out, trans1=trans1, trans2=trans2) x = self.as_contig(x) y = self.as_contig(y) cdef int nM = x.shape[0] if not trans1 else x.shape[1] cdef int nK = x.shape[1] if not trans1 else x.shape[0] cdef int nK_b = y.shape[0] if not trans2 else y.shape[1] cdef int nN = y.shape[1] if not trans2 else y.shape[0] if nK != nK_b: msg = "Shape mismatch for blis.gemm: (%d, %d), (%d, %d)" raise ValueError(msg % (nM, nK, nK_b, nN)) if out is not None: out = self.as_contig(out) else: # Can be uninitialized as 'beta' is zero. out = numpy.empty((nM, nN), dtype=x.dtype) cblas = self.cblas() if x.dtype == "float32" and y.dtype == "float32" and out.dtype == "float32": sgemm(cblas)(trans1, trans2, nM, nN, nK, 1.0, (x.data), x.shape[1], (y.data), y.shape[1], 0.0, (out.data), out.shape[1]) elif x.dtype == "float64" and y.dtype == "float64" and out.dtype == "float64": dgemm(cblas)(trans1, trans2, nM, nN, nK, 1.0, (x.data), x.shape[1], (y.data), y.shape[1], 0.0, (out.data), out.shape[1]) else: raise ValueError(f"unsupported or mismatching array data types; got '{x.dtype}', '{y.dtype}', '{out.dtype}'") return out def relu(self, np.ndarray X, inplace=False): cdef np.ndarray Y if X.dtype == "float32": Y = _inplace_or_copy(X, inplace) cpu_relu(Y.data, Y.size) return Y elif X.dtype == "float64": Y = _inplace_or_copy(X, inplace) cpu_relu(Y.data, Y.size) return Y else: return super().relu(X, inplace=inplace) def backprop_relu(self, np.ndarray dY, np.ndarray Y, inplace=False): _check_compatible_shape(dY, Y) cdef size_t size = Y.size cdef float* dX_ptr cdef const float* Y_ptr = Y.data cdef np.ndarray dX if dY.dtype == "float32" and Y.dtype == "float32": dX = _inplace_or_copy(dY, inplace) dX_ptr = dX.data for i in range(size): if Y_ptr[i] <= 0: dX_ptr[i] = 0. return dX else: return super().backprop_relu(dY, Y, inplace) def lstm_forward_training( self, np.ndarray params, np.ndarray H0, np.ndarray C0, np.ndarray X, np.ndarray size_at_t ): assert H0.shape[0] == C0.shape[0] assert H0.shape[1] == C0.shape[1] Y, fwd_state = lstm_forward_training(self.cblas(), params, H0, C0, X, size_at_t) return Y, fwd_state def lstm_forward_inference( self, np.ndarray params, np.ndarray H0, np.ndarray C0, np.ndarray X, np.ndarray size_at_t ): Y, _ = lstm_forward_training(self.cblas(), params, H0, C0, X, size_at_t) return Y def backprop_lstm( self, np.ndarray dY, np.ndarray lengths, np.ndarray params, fwd_state ): dX, d_params = backprop_lstm(self.cblas(), dY, lengths, params, fwd_state) return dX, d_params def maxout(self, reals3d_ft X): cdef int B = X.shape[0] cdef int O = X.shape[1] cdef int P = X.shape[2] cdef np.ndarray best cdef np.ndarray which = self.alloc(shape=(B, O), dtype='int32', zeros=False) if reals3d_ft is float3d_t: best = self.alloc(shape=(B, O), dtype="float32", zeros=False) if len(X) > 0: cpu_maxout(best.data, which.data, &X[0, 0, 0], B, O, P) else: best = self.alloc(shape=(B, O), dtype="float64", zeros=False) if len(X) > 0: cpu_maxout(best.data, which.data, &X[0, 0, 0], B, O, P) return best, which def backprop_maxout(self, reals2d_ft dY, int[:, ::1] which, int P): cdef int B = dY.shape[0] cdef int O = dY.shape[1] cdef np.ndarray dX if reals2d_ft == float2d_t: dX = numpy.zeros((B, O, P), dtype='float32') cpu_backprop_maxout(dX.data, &dY[0, 0], &which[0, 0], B, O, P) else: dX = numpy.zeros((B, O, P), dtype='float64') cpu_backprop_maxout(dX.data, &dY[0, 0], &which[0, 0], B, O, P) return dX def mish(self, np.ndarray X, threshold=20.0, inplace: bool = False): cdef np.ndarray Y if X.dtype == "float32": Y = _inplace_or_copy(X, inplace) cpu_mish(Y.data, Y.size, threshold) return Y elif X.dtype == "float64": Y = _inplace_or_copy(X, inplace) cpu_mish(Y.data, Y.size, threshold) return Y else: return super().mish(X, inplace=inplace) def backprop_mish(self, np.ndarray dY, np.ndarray X, threshold=20.0, inplace=False): _check_compatible_shape(dY, X) cdef np.ndarray dX if dY.dtype == "float32" and X.dtype == "float32": dX = _inplace_or_copy(dY, inplace) cpu_backprop_mish(dX.data, X.data, X.size, threshold) return dX elif dY.dtype == "float64" and X.dtype == "float64": dX = _inplace_or_copy(dY, inplace) cpu_backprop_mish(dX.data, X.data, X.size, threshold) return dX else: return super().backprop_mish(dY, X, threshold, inplace) def seq2col(self, np.ndarray seq, int nW, *, int[::1] lengths=None): """Given an (M, N) sequence of vectors, return an (M, N*(nW*2+1)) sequence. The new sequence is constructed by concatenating nW preceding and succeeding vectors onto each column in the sequence, to extract a window of features. """ # Note: the type of seq should be changed to reals2d_ft once # cython/cython#4697 is fixed. The following checks can then be # removed, because they are guaranteed by the reals2d_ft # type. if seq.ndim != 2: msg = f"seq2col requires sequence array of dimensionality 2, was {seq.ndim}" raise ValueError(msg) if not seq.flags.c_contiguous: msg = f"seq2col requires sequence array that is in C order and contiguous" raise ValueError(msg) cdef int B = seq.shape[0] cdef int I = seq.shape[1] lengths = check_seq2col_lengths(self, lengths, B) cdef int nL = lengths.shape[0] cdef np.ndarray cols if seq.dtype == "float32": cols = self.alloc((B, (2*nW + 1) * I), dtype="float32") if seq.size != 0 and lengths.size != 0: seq2col(cols.data, seq.data, &lengths[0], nW, B, I, nL) return cols elif seq.dtype == "float64": cols = self.alloc((B, (2*nW + 1) * I), dtype="float64") if seq.size != 0 and lengths.size != 0: seq2col(cols.data, seq.data, &lengths[0], nW, B, I, nL) return cols else: return super().seq2col(seq, nW, lengths=lengths) def backprop_seq2col(self, np.ndarray dY, int nW, *, int[::1] lengths=None): # Note: the type of dY should be changed to reals2d_ft once # cython/cython#4697 is fixed. The following checks can then be # removed, because they are guaranteed by the reals2d_ft # type. if dY.ndim != 2: msg = f"backprop_seq2col requires gradient array of dimensionality 2, was {dY.ndim}" raise ValueError(msg) if not dY.flags.c_contiguous: msg = f"backprop_seq2col requires gradient array that is in C order and contiguous" raise ValueError(msg) cdef int B = dY.shape[0] cdef int nF = nW*2+1 cdef int I = dY.shape[1] / nF lengths = check_seq2col_lengths(self, lengths, B) cdef int nL = lengths.shape[0] cdef np.ndarray dX if dY.dtype == "float32": dX = self.alloc((B, I), dtype='float32') if dY.size != 0 and lengths.size != 0: backprop_seq2col(dX.data, dY.data, &lengths[0], B, I, nW, nL) return dX elif dY.dtype == "float64": dX = self.alloc((B, I), dtype='float64') if dY.size != 0 and lengths.size != 0: backprop_seq2col(dX.data, dY.data, &lengths[0], B, I, nW, nL) return dX else: return super().backprop_seq2col(dY, nW, lengths=lengths) @cython.boundscheck(False) @cython.wraparound(False) def hash(self, const uint64_t[::1] ids, uint32_t seed): """Hash a sequence of 64-bit keys into a table with 4 32-bit keys.""" # Written to mirror the GPU implementation cdef np.ndarray[uint32_t, ndim=2] keys = self.alloc((ids.shape[0], 4), dtype='uint32') cdef int i cdef uint32_t* dest = keys.data for i in range(len(ids)): MurmurHash3_x86_128_uint64(ids[i], seed, &dest[i*4]) return keys def reduce_mean(self, reals2d_ft X, int[::1] lengths): cdef int B = lengths.shape[0] cdef int O = X.shape[1] cdef int T = X.shape[0] if B == 0 or O == 0: if reals2d_ft is float2d_t: return numpy.zeros(shape=(B, O), dtype="float32") else: return numpy.zeros(shape=(B, O), dtype="float64") cdef np.ndarray means if reals2d_ft is float2d_t: means = numpy.zeros(shape=(B, O), dtype="float32") cpu_reduce_mean(means.data, &X[0, 0], &lengths[0], B, T, O) else: means = numpy.zeros(shape=(B, O), dtype="float64") cpu_reduce_mean(means.data, &X[0, 0], &lengths[0], B, T, O) return means def backprop_reduce_mean(self, reals2d_ft d_means, int[::1] lengths): cdef int B = lengths.shape[0] cdef int O = d_means.shape[1] cdef int T = 0 for length in lengths[:B]: if length < 0: raise ValueError(f"all sequence lengths must be >= 0, got {length}") T += length if T == 0 or O == 0: if reals2d_ft is float2d_t: return numpy.zeros(shape=(T, O), dtype="float32") else: return numpy.zeros(shape=(T, O), dtype="float64") cdef np.ndarray dX if reals2d_ft is float2d_t: dX = numpy.zeros((T, O), dtype="float32") cpu_backprop_reduce_mean(dX.data, &d_means[0,0], &lengths[0], B, T, O) else: dX = numpy.zeros((T, O), dtype="float64") cpu_backprop_reduce_mean(dX.data, &d_means[0,0], &lengths[0], B, T, O) return dX def reduce_sum(self, reals2d_ft X, int[::1] lengths): cdef int B = lengths.shape[0] cdef int O = X.shape[1] cdef int T = X.shape[0] if B == 0 or O == 0: if reals2d_ft is float2d_t: return numpy.zeros(shape=(B, O), dtype="float32") else: return numpy.zeros(shape=(B, O), dtype="float64") cdef np.ndarray sums if reals2d_ft is float2d_t: sums = numpy.zeros(shape=(B, O), dtype="float32") cpu_reduce_sum(sums.data, &X[0, 0], &lengths[0], B, T, O) else: sums = numpy.zeros(shape=(B, O), dtype="float64") cpu_reduce_sum(sums.data, &X[0, 0], &lengths[0], B, T, O) return sums def backprop_reduce_sum(self, reals2d_ft d_sums, int[::1] lengths): cdef int B = lengths.shape[0] cdef int O = d_sums.shape[1] cdef int T = 0 for length in lengths[:B]: if length < 0: raise ValueError(f"all sequence lengths must be >= 0, got {length}") T += length if T == 0 or O == 0: if reals2d_ft is float2d_t: return numpy.zeros(shape=(T, O), dtype="float32") else: return numpy.zeros(shape=(T, O), dtype="float64") cdef np.ndarray dX if reals2d_ft is float2d_t: dX = numpy.zeros((T, O), dtype="float32") cpu_backprop_reduce_sum(dX.data, &d_sums[0,0], &lengths[0], B, T, O) else: dX = numpy.zeros((T, O), dtype="float64") cpu_backprop_reduce_sum(dX.data, &d_sums[0,0], &lengths[0], B, T, O) return dX def reduce_max(self, reals2d_ft X, int[::1] lengths): cdef int B = lengths.shape[0] cdef int O = X.shape[1] cdef int T = X.shape[0] # Needs to be zero-initialized as we start by assuming that the first element is the max value. cdef np.ndarray which = self.alloc(shape=(B, O), dtype="i", zeros=True) if B == 0 or O == 0: if reals2d_ft is float2d_t: return numpy.zeros(shape=(B, O), dtype="float32"), which else: return numpy.zeros(shape=(B, O), dtype="float64"), which cdef np.ndarray maxes if reals2d_ft is float2d_t: maxes = self.alloc(shape=(B, O), dtype="float32", zeros=False) cpu_reduce_max(maxes.data, which.data, &X[0, 0], &lengths[0], B, T, O) else: maxes = self.alloc(shape=(B, O), dtype="float64", zeros=False) cpu_reduce_max(maxes.data, which.data, &X[0, 0], &lengths[0], B, T, O) return maxes, which def backprop_reduce_max(self, reals2d_ft d_maxes, int[:, ::1] which, int[::1] lengths): cdef int B = lengths.shape[0] cdef int O = d_maxes.shape[1] cdef int T = 0 for length in lengths[:B]: if length <= 0: raise ValueError(f"all sequence lengths must be > 0, got {length}") T += length if T == 0 or O == 0: if reals2d_ft is float2d_t: return numpy.zeros(shape=(T, O), dtype="float32") else: return numpy.zeros(shape=(T, O), dtype="float64") cdef np.ndarray dX if reals2d_ft is float2d_t: dX = numpy.zeros((T, O), dtype="float32") cpu_backprop_reduce_max(dX.data, &d_maxes[0,0], &which[0, 0], &lengths[0], B, T, O) else: dX = numpy.zeros((T, O), dtype="float64") cpu_backprop_reduce_max(dX.data, &d_maxes[0,0], &which[0, 0], &lengths[0], B, T, O) return dX def gather_add(self, reals2d_ft table, ints2d_ft indices): cdef CBlas cblas = self.cblas() rows = indices.shape[0] dims = table.shape[1] cdef np.ndarray output if reals2d_ft is float2d_t: output = self.xp.zeros((rows, dims), dtype="float32") cpu_gather_add(saxpy(cblas), output.data, &table[0, 0], &indices[0, 0], table.shape[0], dims, rows, indices.shape[1]) else: output = self.xp.zeros((rows, dims), dtype="float64") cpu_gather_add(daxpy(cblas), output.data, &table[0, 0], &indices[0, 0], table.shape[0], dims, rows, indices.shape[1]) return output def scatter_add(self, np.ndarray table, np.ndarray indices, np.ndarray values): if table.dtype == 'float32' \ and indices.dtype == 'int32' \ and values.dtype == 'float32' \ and table.flags.c_contiguous \ and indices.flags.c_contiguous \ and values.flags.c_contiguous \ and indices.ndim == 1 \ and table.ndim == 2 \ and values.ndim == 2 \ and values.shape[0] == indices.shape[0] \ and values.shape[1] == table.shape[1]: cpu_scatter_add(self.cblas(), table.data, indices.data, values.data, indices.shape[0], table.shape[1]) else: self.xp.add.at(table, indices, values) @cython.boundscheck(False) @cython.wraparound(False) def adam(self, np.ndarray[np.float32_t] weights, np.ndarray[np.float32_t] gradient, np.ndarray[np.float32_t] mom1, np.ndarray[np.float32_t] mom2, const float beta1, const float beta2, float eps, float learn_rate, float mod_rate=1.): _check_compatible_shape(weights, gradient) _check_compatible_shape(weights, mom1) _check_compatible_shape(weights, mom2) cdef CBlas cblas = self.cblas() _adam_momentum(cblas, gradient.data, mom1.data, mom2.data, weights.shape[0], beta1, beta2, eps, learn_rate) saxpy(cblas)(weights.shape[0], -learn_rate, gradient.data, 1, weights.data, 1) memset(gradient.data, 0, gradient.size * sizeof(float)) return weights, gradient, mom1, mom2 def ngrams(self, int n, const uint64_t[::1] keys): if n < 1: return self.alloc((0,), dtype="uint64") keys_ = &keys[0] length = max(0, keys.shape[0]-(n-1)) cdef np.ndarray output_ = self.alloc((length,), dtype="uint64") output = output_.data for i in range(keys.shape[0]-(n-1)): output[i] = hash64(&keys_[i], n*sizeof(keys_[0]), 0) return output_ def position_encode(self, int N, int D, int period=10000, out=None): cdef np.ndarray out_ if out is None: out_ = self.alloc((N, D), zeros=False) else: out_ = out assert out_.shape[0] == N assert out_.shape[1] == D cpu_position_encode(out_.data, period, N, D) return out_ def check_seq2col_lengths(ops, lengths, B): if lengths is None: lengths = ops.asarray1i([B]) else: assert ops.xp.all(ops.xp.array(lengths) >= 0), "All sequence lengths must be >= 0" assert ops.xp.sum(lengths) == B, "The lengths must sum up to the batch length" return lengths cdef void cpu_position_encode(float* output, float period, int N, int D) nogil: cdef float pos, d cdef int j cdef float dimensions = D for i in range(N): pos = i j = 0 d = 0 while (j+1) < D: d = j output[j] = sinf(pos / period ** (2 * d / dimensions)) output[j+1] = cosf(pos / period ** (2 * d / dimensions)) j += 2 if j < D: output[j] = sinf(pos / period ** (2 * d / dimensions)) output += D cdef void cpu_scatter_add(CBlas cblas, float* dest, const int* indices, const float* src, int nr_id, int nr_col) nogil: cdef int i for i in range(nr_id): id_ = indices[i] if id_ >= 0: saxpy(cblas)(nr_col, 1., &src[i*nr_col], 1, &dest[id_*nr_col], 1) @cython.cdivision(True) cdef void _adam_momentum(CBlas cblas, float* gradient, float* mom1, float* mom2, int nr_weight, float beta1, float beta2, float eps, float learn_rate) nogil: # Calculate Adam on CPU, fused. # Assumes the learning rate adjustment is calculated by the caller; # a_t = learn_rate * sqrt(1-beta2**timestep) / (1-beta1**timestep) cdef float one_minus_beta1 = 1-beta1 cdef float one_minus_beta2 = 1-beta2 cdef float m1, m2, g cdef int i # Blockwise implementation is a bit faster. Adam is slooow :( cdef float[64] buff cdef int steps = nr_weight // 64 if steps * 64 < nr_weight: steps += 1 idx = 0 for i in range(steps): step_size = min(64, nr_weight-idx) sscal(cblas)(step_size, beta1, mom1, 1) saxpy(cblas)(step_size, one_minus_beta1, gradient, 1, mom1, 1) sscal(cblas)(step_size, beta2, mom2, 1) for j in range(step_size): mom2[j] += one_minus_beta2 * gradient[j] ** 2 for j in range(step_size): buff[j] = sqrtf(mom2[j]) for j in range(step_size): buff[j] += eps for j in range(step_size): buff[j] = mom1[j] / buff[j] for j in range(step_size): gradient[j] = buff[j] mom1 += step_size mom2 += step_size gradient += step_size idx += step_size def lstm_forward_training(CBlas cblas, np.ndarray params, np.ndarray c_init, np.ndarray h_init, np.ndarray X, np.ndarray lengths ): xp = numpy depth = c_init.shape[0] dirs = c_init.shape[1] nO = c_init.shape[2] N = X.shape[0] nI = X.shape[1] nT = lengths.shape[0] cdef int batch_size = lengths[0] # Preallocate these so we can pass them through for loop. cdef np.ndarray G = xp.zeros((depth, dirs, X.shape[0], nO * 4), dtype="f") cdef np.ndarray Y = xp.zeros((depth, dirs, X.shape[0], nO), dtype="f") cdef np.ndarray C = xp.zeros((depth, dirs, X.shape[0], nO), dtype="f") cdef np.ndarray Yt2 = numpy.zeros((batch_size, nO), dtype="f") cdef np.ndarray Ct2 = numpy.zeros((batch_size, nO), dtype="f") cdef int params_i = 0 cdef int seq_i = 0 orig_X = X cdef int i cdef np.ndarray Yid cdef np.ndarray Cid cdef np.ndarray Gid cdef np.ndarray Wx cdef np.ndarray Wh cdef np.ndarray bias for i in range(depth): nI = X.shape[1] for d in range(dirs): # The inits are shaped (depth, dirs, nO). We add the internal dimension # to make them set correctly. Yt2[:] = h_init[i, d].reshape((1, nO)) Ct2[:] = c_init[i, d].reshape((1, nO)) layer_params, params_i = _split_weights(params, i, nO, nI, params_i) Wx, Wh, bias = _transpose_weights(layer_params) Yid = Y[i, d] Cid = C[i, d] Gid = G[i, d] _lstm_forward_training( cblas, d, N, nO, nI, nT, Gid, Yid.data, Cid.data, X.data, Wx.data, Wh.data, bias, lengths.data, Yt2.data, Ct2.data ) H = Y[i].transpose((1, 0, 2)).reshape((N, -1)) if dirs == 2: H = xp.ascontiguousarray(H) X = H return H, (Y, G, C, orig_X) cdef int _lstm_forward_training( CBlas cblas, int d, int N, int nO, int nI, int nT, np.ndarray G, float* Y, float* C, float* X, float* Wx, float* Wh, np.ndarray bias, int* lengths, float* Yt2, float* Ct2, ) except -1: cdef double one = 1.0 sgemm(cblas)(False, True, N, nO*4, nI, one, X, nI, Wx, nI, one, G.data, nO*4 ) cdef int t, batch_size cdef int seq_i = 0 if d == 0 else N cdef int i, j cdef np.ndarray Gt3_ for t in range(nT): if d == 0: batch_size = lengths[t] else: batch_size = lengths[nT-(t+1)] seq_i -= batch_size # Prepare the inputs Yt3 = &Y[seq_i*nO] Ct3 = &C[seq_i*nO] Gt3_ = G[seq_i : seq_i+batch_size] Gt3 = Gt3_.data # Now do the actual calculation sgemm(cblas)(False, True, batch_size, nO*4, nO, one, Yt2, nO, Wh, nO, one, Gt3, nO*4 ) # This is super weird: if we remove this add, it gets slower? I guess # it does cache prefetching or something? # It's annoying though --- it means I can't really refactor further, # because speed goes down if I remove this. Gt3_ += bias #for i in range(batch_size): # for j in range(nO*4): # Gt3[i*nO*4+j] += bias[j] cpu_lstm_activate_fwd(Gt3, batch_size, nO) cpu_lstm_gates_fwd(Yt3, Ct3, Gt3, Ct2, batch_size, nO) if d == 0: seq_i += batch_size # We need to keep a full-sized array here, padded with the sequence-start # values. This isn't necessary for the l2r part, but for the r2l part # it's necessary, as we otherwise would have the previous step smaller # than the current. memcpy(Yt2, Yt3, sizeof(Yt3[0]) * batch_size * nO) memcpy(Ct2, Ct3, sizeof(Ct3[0]) * batch_size * nO) def backprop_lstm(CBlas cblas, np.ndarray dY, np.ndarray lengths, np.ndarray params, fwd_state): xp = numpy cdef np.ndarray Y cdef np.ndarray G cdef np.ndarray C cdef np.ndarray X cdef np.ndarray Yid cdef np.ndarray Cid cdef np.ndarray Gid cdef np.ndarray Wx, Wh, bias cdef np.ndarray dWx, dWh, d_bias cdef np.ndarray dYid Y, G, C, X = fwd_state cdef int depth = C.shape[0] cdef int dirs = C.shape[1] cdef int N = C.shape[2] cdef int nO = C.shape[3] cdef int nI = X.shape[1] cdef int batch_size = lengths[0] cdef int nT = lengths.shape[0] # We don't need to store all the cells for all the layers. cdef np.ndarray dC = xp.zeros((N, nO), dtype=C.dtype) cdef np.ndarray dG = xp.zeros((N, nO*4), dtype=C.dtype) cdef np.ndarray d_params = xp.zeros((params.shape[0],), dtype=params.dtype) # Collect the params and slices. It makes it a bit easier to get the indexing # right, when we're iterating backwards. params_i = 0 all_layer_params = [] for i in range(depth): all_layer_params.append([]) n_inputs = nI if i == 0 else (nO * dirs) for d in range(dirs): layer_params, params_i = _split_weights(params, i, nO, n_inputs, params_i) layer_params = _transpose_weights(layer_params) all_layer_params[-1].append((layer_params, params_i)) params_i = 0 all_layer_grads = [] for i in range(depth): all_layer_grads.append([]) n_inputs = nI if i == 0 else (nO * dirs) for d in range(dirs): layer_grads, params_i = _split_weights(params, i, nO, n_inputs, params_i) layer_grads = _transpose_weights(layer_grads) all_layer_grads[-1].append((layer_grads, params_i)) # Similarly, we want to compute the indices first indices = [] seq_i = 0 for batch_size in lengths: indices.append((seq_i, batch_size)) seq_i += batch_size cdef np.ndarray dX Xs = [X] + [Y[i].transpose(1, 0, 2).reshape((N, -1)) for i in range(depth-1)] dXs = [xp.zeros((X.shape[0], X.shape[1]), dtype=X.dtype) for X in Xs] # Okay, now do the actual looping for i in reversed(range(depth)): dY = dY.reshape((N, dirs, nO)).transpose((1, 0, 2)) dX = dXs[i] X = Xs[i] if dirs >= 2: dY = numpy.ascontiguousarray(dY) for d in range(dirs): Wx, Wh, bias = all_layer_params[i][d][0] dWx, dWh, d_bias = all_layer_grads[i][d][0] assert Wx.shape[1] == dWx.shape[1] == X.shape[1] == dX.shape[1], (Wx.shape[1], dWx.shape[1], X.shape[1], dX.shape[1]) dYid = dY[d] dC.fill(0.) dG.fill(0.) Cid = C[i, d] Gid = G[i, d] Yid = Y[i, d] assert (Cid.shape[0], Cid.shape[1]) == (N, nO) assert (Yid.shape[0], Yid.shape[1]) == (N, nO) assert (Gid.shape[0], Gid.shape[1]) == (N, nO*4) assert (dYid.shape[0], dYid.shape[1]) == (N, nO) assert (dC.shape[0], dC.shape[1]) == (N, nO) assert (dG.shape[0], dG.shape[1]) == (N, nO*4) _lstm_backward_training(cblas, d, N, nO, dX.shape[1], nT, dX.data, dYid.data, dC.data, dG.data, dWx.data, dWh.data, d_bias.data, Cid.data, Gid.data, Yid.data, X.data, Wx.data, Wh.data, list(indices) ) dY = dX assert dX.shape[1] == X.shape[1] grad_parts = [] for layer_grads in all_layer_grads: for dir_grads, _ in layer_grads: grad_parts.append(_untranspose_unsplit_weights(dir_grads)) return dX, numpy.concatenate(grad_parts) cdef int _lstm_backward_training( CBlas cblas, int d, int N, int nO, int nI, int nT, float* dX, float* dY, float* dC, float* dG, float* dWx, float* dWh, float* d_bias, const float* C, const float* G, const float* Y, const float* X, const float* Wx, const float* Wh, indices, ) except -1: cdef int seq_t2 cdef int seq_t3 cdef double one = 1.0 if d == 0: seq_t3, size_t3 = indices[-1] indices = indices[:-1] indices.reverse() else: seq_t3, size_t3 = indices[0] indices = indices[1:] cdef int batch_size for seq_t2, size_t2 in indices: dGt3 = &dG[seq_t3*nO*4] dXt3 = &dX[seq_t3*nI] dYt3 = &dY[seq_t3*nO] dCt3 = &dC[seq_t3*nO] dYt2 = &dY[seq_t2*nO] dCt2 = &dC[seq_t2*nO] Ct3 = &C[seq_t3*nO] Gt3 = &G[seq_t3*nO*4] Ct2 = &C[seq_t2*nO] batch_size = min(size_t2, size_t3) cpu_lstm_gates_bwd(dGt3, dCt2, dYt3, dCt3, Gt3, Ct3, Ct2, batch_size * nO ) # Backprop hidden-to-hidden w.r.t. hidden. # dYt2 += dGt3 @ Wh sgemm(cblas)(False, False, batch_size, nO, nO*4, one, dGt3, nO*4, Wh, nO, one, dYt2, nO ) seq_t3 = seq_t2 size_t3 = size_t2 # Backprop input-to-hidden w.r.t. weights. # dWx += dG @ X sgemm(cblas)(True, False, nO*4, nI, N, one, dG, nO*4, X, nI, one, dWx, nI ) # Backprop hidden-to-hidden w.r.t weights. # dWh += dG @ Y sgemm(cblas)(True, False, nO*4, nO, N, one, dG, nO*4, Y, nO, one, dWh, nO ) # Backprop bias for i in range(N): for j in range(nO*4): d_bias[j] += dG[i*nO*4+j] # Backprop input-to-hidden w.r.t. input sgemm(cblas)(False, False, N, nI, nO*4, one, dG, nO*4, Wx, nI, one, dX, nI ) cdef inline float dsigmoid(float y) nogil: return y*(1-y) cdef inline float dtanh(float y) nogil: return 1-y**2 cdef void cpu_lstm_activate_fwd(float* gates, int B, int N) nogil: """Apply sigmoid activation in-place to columns 0, 1, 2 and tanh to column 3. The data is assumed to have the gates in the last dimension. """ # This just does the following, but unrolled slightly to give # a better chance at simd. # # gates[g+i+0] = sigmoid(gates[g+i+0]) # gates[g+i+1] = sigmoid(gates[g+i+1]) # gates[g+i+2] = sigmoid(gates[g+i+2]) # gates[g+i+3] = tanh(gates[g+i+3]) # # I would've hoped the compiler would find this itself? It seems to make # it like, 10% faster. It feels like a dumb thing to do but it's not much # code. The problem with this sort of thing is it needs to be rebenchmarked # later...It's fine to revert this at a later date to the simpler loop. # Shrug. The weird thing is, why should the batch entries be a good loop # stride here? Surely something to do with cache lines would make more sense? cdef int i, b, g g = 0 for b in range(B): g = b * N * 4 end = g + N*4 while g < end: gates[g+0] = expf(-gates[g+0]) gates[g+1] = expf(-gates[g+1]) gates[g+2] = expf(-gates[g+2]) g += 4 g = b * N * 4 while g < end: gates[g+0] += 1 gates[g+1] += 1 gates[g+2] += 1 g += 4 g = b * N * 4 while g < end: gates[g+0] = 1.0 / gates[g+0] gates[g+1] = 1.0 / gates[g+1] gates[g+2] = 1.0 / gates[g+2] g += 4 g = b * N * 4 while g < end: gates[g+3] = tanhf(gates[g+3]) g += 4 cdef void cpu_lstm_gates_fwd(float* hiddens, float* cells, const float* gates, const float* prevcells, int B, int N) nogil: cdef float hf, hi, ho, hc, ct2, ct3 cdef int i, b, g, c, h g = 0 c = 0 h = 0 while g < B*N*4: hf = gates[g+0] hi = gates[g+1] ho = gates[g+2] hc = gates[g+3] ct2 = prevcells[c] ct3 = hf * ct2 + hi * hc hiddens[h] = tanhf(ct3) * ho cells[c] = ct3 g += 4 c += 1 h += 1 cdef void cpu_lstm_gates_bwd( float* dGt3, float* dCt2, const float* dYt3, const float* dCt3, const float* Gt3, const float* Ct3, const float* Ct2, int N ) nogil: cdef int i cdef float ct2, ct3, hf, hi, ho, hc, tanh_ct3 cdef float d_ho, d_tanh_ct3, dct3, d_hi, d_hc, d_hf for i in range(N): ct2 = Ct2[i] ct3 = Ct3[i] dct3 = dCt3[i] dyt3 = dYt3[i] hf = Gt3[i*4+0] hi = Gt3[i*4+1] ho = Gt3[i*4+2] hc = Gt3[i*4+3] tanh_ct3 = tanhf(ct3) # 3b: Yt3 = tanhCt3 * ho d_ho = dyt3 * tanh_ct3 d_tanh_ct3 = dyt3 * ho # 3a: tanhCt3 = tanh(Ct3) dct3 += d_tanh_ct3 * dtanh(tanh_ct3) # 2b: Ct3 += hi * hc d_hi = dct3 * hc d_hc = dct3 * hi # 2a: Ct3 = hf * Ct2 d_hf = dct3 * ct2 dCt2[i] = dct3 * hf dGt3[i*4+0] = d_hf * dsigmoid(hf) # 1a dGt3[i*4+1] = d_hi * dsigmoid(hi) # 1b dGt3[i*4+2] = d_ho * dsigmoid(ho) # 1c dGt3[i*4+3] = d_hc * dtanh(hc) # 1d cdef void MurmurHash3_x86_128_uint64( const uint64_t val, const uint32_t seed, uint32_t *out ) nogil: cdef uint64_t h1, h2 h1 = val h1 *= 0x87c37b91114253d5ull h1 = (h1 << 31) | (h1 >> 33) h1 *= 0x4cf5ad432745937full h1 ^= seed h1 ^= 8 h2 = seed h2 ^= 8 h1 += h2 h2 += h1 h1 ^= h1 >> 33 h1 *= 0xff51afd7ed558ccdull h1 ^= h1 >> 33 h1 *= 0xc4ceb9fe1a85ec53ull h1 ^= h1 >> 33 h2 ^= h2 >> 33 h2 *= 0xff51afd7ed558ccdull h2 ^= h2 >> 33 h2 *= 0xc4ceb9fe1a85ec53ull h2 ^= h2 >> 33 h1 += h2 h2 += h1 out[0] = h1 & 0xffffffffu out[1] = h1 >> 32 out[2] = h2 & 0xffffffffu out[3] = h2 >> 32 def _check_compatible_shape(u: np.ndarray, v: np.ndarray): if u.shape != v.shape: msg = f"arrays have incompatible shapes: {u.shape} and {v.shape}" raise ValueError(msg) cdef inline np.ndarray _inplace_or_copy(np.ndarray X, inplace): if inplace: return X else: return numpy.array(X) thinc-release-v9.1.1/thinc/backends/ops.py000066400000000000000000001625161467064331700205130ustar00rootroot00000000000000import itertools import math from typing import ( Any, Iterator, List, Optional, Sequence, Tuple, Type, TypeVar, Union, cast, overload, ) import numpy from ..types import ( Array1d, Array2d, Array3d, Array4d, ArrayXd, Batchable, DeviceTypes, DTypes, DTypesFloat, DTypesInt, Floats1d, Floats2d, Floats3d, Floats4d, FloatsXd, FloatsXdT, Generator, Ints1d, Ints2d, Ints3d, Ints4d, IntsXd, List2d, ListXd, Padded, Shape, SizedGenerator, Xp, _Floats, ) from ..util import get_array_module, is_xp_array, to_numpy from .cblas import CBlas ArrayT = TypeVar("ArrayT", bound=ArrayXd) FloatsT = TypeVar("FloatsT", bound=_Floats) SQRT2PI = math.sqrt(2.0 / math.pi) INV_SQRT2 = 1.0 / math.sqrt(2.0) INV_SQRT_2PI = 1.0 / math.sqrt(2.0 * math.pi) class Ops: name: str = "base" xp: Xp = numpy def __init__( self, device_type: DeviceTypes = "cpu", device_id: int = -1, **kwargs ) -> None: self.device_type = device_type self.device_id = device_id def cblas(self) -> CBlas: """Return C BLAS function table.""" err = f"{type(self).__name__} does not provide C BLAS functions" raise NotImplementedError(err) def to_numpy(self, data, *, byte_order=None): # pragma: no cover if isinstance(data, numpy.ndarray): if byte_order: dtype = data.dtype.newbyteorder(byte_order) data = numpy.asarray(data, dtype=dtype) return data else: raise ValueError("Cannot convert non-numpy from base Ops class") def minibatch( self, size: Union[int, Generator], sequence: Batchable, *, shuffle: bool = False, buffer: int = 1, ) -> SizedGenerator: """Iterate slices from a sequence, optionally shuffled. Slices may be either views or copies of the underlying data. The `size` argument may be either an integer, or a sequence of integers. If a sequence, a new size is drawn before every output. If shuffle is True, shuffled batches are produced by first generating an index array, shuffling it, and then using it to slice into the sequence. An internal queue of `buffer` items is accumulated before being each output. Buffering is useful for some devices, to allow the network to run asynchronously without blocking on every batch. """ if not hasattr(sequence, "__len__"): err = f"Can't minibatch data. Expected sequence, got {type(sequence)}" raise ValueError(err) sizes = self._get_batch_sizes( len(sequence), itertools.repeat(size) if isinstance(size, int) else size ) indices = numpy.arange(len(sequence)) # This is a bit convoluted, but it's a time where convenience makes # trickery worthwhile: instead of being an actual generator, we # return our SizedGenerator object, which provides a __len__. def _iter_items(): if shuffle: numpy.random.shuffle(indices) queue = [] i = 0 for size in sizes: size = int(size) queue.append(self._get_batch(sequence, indices[i : i + size])) if len(queue) >= buffer: yield from queue queue = [] i += size yield from queue return SizedGenerator(_iter_items, len(sizes)) def multibatch( self, size: Union[int, Generator], sequence: Batchable, *others: Batchable, shuffle: bool = False, buffer: int = 1, ) -> SizedGenerator: """Minibatch one or more sequences of data, and yield lists with one batch per sequence. See ops.minibatch. """ # You'd think we could just do this by calling into minibatch and zip... # But the shuffling makes it really hard. sequences = (sequence,) + tuple(others) if not all(hasattr(seq, "__len__") for seq in sequences): values = ", ".join([f"{type(seq)}" for seq in sequences]) err = f"Can't multibatch data. Expected sequences, got {values}" raise ValueError(err) sizes = self._get_batch_sizes( len(sequence), itertools.repeat(size) if isinstance(size, int) else size ) indices = numpy.arange(len(sequence)) def _iter_items(): if shuffle: numpy.random.shuffle(indices) queue = [] i = 0 for size in sizes: size = int(size) idx_batch = indices[i : i + size] queue.append([]) for sequence in sequences: queue[-1].append(self._get_batch(sequence, idx_batch)) if len(queue) >= buffer: yield from queue queue = [] i += size yield from queue return SizedGenerator(_iter_items, len(sizes)) def _get_batch(self, sequence, indices): if isinstance(sequence, list): subseq = [sequence[i] for i in indices] elif isinstance(sequence, tuple): subseq = tuple(sequence[i] for i in indices) else: subseq = sequence[indices] if is_xp_array(subseq): subseq = self.as_contig(self.xp.asarray(subseq)) return subseq def _get_batch_sizes(self, length: int, sizes: Iterator[int]): output = [] i = 0 while i < length: output.append(next(sizes)) i += output[-1] return output def seq2col( self, seq: Floats2d, nW: int, *, lengths: Optional[Ints1d] = None ) -> Floats2d: """Given an (M, N) sequence of vectors, return an (M, N*(nW*2+1)) sequence. The new sequence is constructed by concatenating nW preceding and succeeding vectors onto each column in the sequence, to extract a window of features. """ # This is a test implementation that only supports nW=1 and lengths=None assert nW == 1 assert lengths == None B = seq.shape[0] I = seq.shape[1] cols = self.alloc3f(B, (nW * 2 + 1), I) # Copy left contexts. The last words aren't the left-context for anything. cols[nW:, :nW] = self.reshape3f(seq[:-nW], -1, nW, I) cols[:, nW] = seq cols[:-nW, nW + 1 :] = self.reshape3f(seq[nW:], -1, nW, I) return self.reshape2f(cols, B, I * (2 * nW + 1)) def backprop_seq2col( self, dY: Floats2d, nW: int, *, lengths: Optional[Ints1d] = None ) -> Floats2d: """The reverse/backward operation of the `seq2col` function: calculate the gradient of the original `(M, N)` sequence, as a function of the gradient of the output `(M, N*(nW*2+1))` sequence. """ # This is a test implementation that only supports nW=1 and lengths=None assert nW == 1 assert lengths == None nF = nW * 2 + 1 B = dY.shape[0] I = dY.shape[1] // nF # Having trouble getting the kernel to work... dX = self.alloc2f(B, I) dY3d = self.reshape3f(dY, B, nF, I) dX[:-nW] += self.reshape2f(dY3d[nW:, :nW], -1, I) dX += dY3d[:, nW] dX[nW:] += self.reshape2f(dY3d[:-nW, nW + 1 :], -1, I) return dX def gemm( self, x: Floats2d, y: Floats2d, out: Optional[Floats2d] = None, trans1: bool = False, trans2: bool = False, ) -> Floats2d: """Perform General Matrix Multiplication (GeMM) and optionally store the result in the specified output variable. """ if trans1: x = x.T if trans2: y = y.T if out is None: return self.xp.dot(x, y) else: self.xp.dot(x, y, out=out) return out def tile(self, X: Floats2d, reps: int) -> Floats2d: return self.xp.tile(X, reps) def affine(self, X: Floats2d, W: Floats2d, b: Floats1d) -> Floats2d: """Apply a weights layer and a bias to some inputs, i.e. Y = X @ W.T + b """ Y = self.gemm(X, W, trans2=True) Y += b return Y @overload def flatten( self, X: List[Floats2d], dtype: Optional[DTypes] = None, pad: int = 0, ndim_if_empty: int = 2, ) -> Floats2d: ... @overload def flatten( self, X: List[Ints1d], dtype: Optional[DTypes] = None, pad: int = 0, ndim_if_empty: int = 2, ) -> Ints1d: ... @overload def flatten( self, X: List2d, dtype: Optional[DTypes] = None, pad: int = 0, ndim_if_empty: int = 2, ) -> Array2d: ... # further specific typed signatures can be added as necessary @overload def flatten( self, X: ListXd, dtype: Optional[DTypes] = None, pad: int = 0, ndim_if_empty: int = 2, ) -> ArrayXd: ... @overload def flatten( self, X: Sequence[ArrayXd], dtype: Optional[DTypes] = None, pad: int = 0, ndim_if_empty: int = 2, ) -> ArrayXd: ... def flatten( self, X: Sequence[ArrayXd], dtype: Optional[DTypes] = None, pad: int = 0, ndim_if_empty: int = 2, ) -> ArrayXd: """Flatten a list of arrays into one large array.""" if X is None or len(X) == 0: return self.alloc((0,) * ndim_if_empty, dtype=dtype or "f") xp = get_array_module(X[0]) shape_if_empty = X[0].shape X = [x for x in X if x.size != 0] if len(X) == 0: return self.alloc(shape_if_empty, dtype=dtype or "f") if int(pad) >= 1: padded = [] for x in X: padded.append(xp.zeros((pad,) + x.shape[1:], dtype=x.dtype)) padded.append(x) padded.append(xp.zeros((pad,) + x.shape[1:], dtype=x.dtype)) X = padded result = xp.concatenate(X) if dtype is not None: result = xp.asarray(result, dtype=dtype) return result @overload def unflatten(self, X: Floats2d, lengths: Ints1d, pad: int = 0) -> List[Floats2d]: ... @overload def unflatten(self, X: Ints1d, lengths: Ints1d, pad: int = 0) -> List[Ints1d]: ... @overload def unflatten(self, X: Array2d, lengths: Ints1d, pad: int = 0) -> List2d: ... # further specific typed signatures can be added as necessary @overload def unflatten(self, X: ArrayXd, lengths: Ints1d, pad: int = 0) -> ListXd: ... def unflatten(self, X: ArrayXd, lengths: Ints1d, pad: int = 0) -> ListXd: """The reverse/backward operation of the `flatten` function: unflatten a large array into a list of arrays according to the given lengths. """ # cupy.split requires lengths to be in CPU memory. lengths = to_numpy(lengths) if pad > 0: lengths = numpy.where(lengths > 0, lengths + pad, 0) # type: ignore unflat = self.xp.split(X, numpy.cumsum(lengths))[:-1] # type: ignore if pad > 0: unflat = [a[pad:] for a in unflat] assert len(unflat) == len(lengths) return unflat @overload def pad(self, seqs: List[Ints2d], round_to=1) -> Ints3d: ... @overload # noqa: F811 def pad(self, seqs: List[Floats2d], round_to=1) -> Floats3d: ... def pad( # noqa: F811 self, seqs: Union[List[Ints2d], List[Floats2d]], round_to=1 ) -> Array3d: """Perform padding on a list of arrays so that they each have the same length, by taking the maximum dimension across each axis. This only works on non-empty sequences with the same `ndim` and `dtype`. """ if round_to < 1: raise ValueError( f"Rounding for padding must at least be 1, was: {round_to}" ) # TODO: This should be generalized to handle different ranks if not seqs: raise ValueError("Cannot pad empty sequence") if len(set(seq.ndim for seq in seqs)) != 1: raise ValueError("Cannot pad sequences with different ndims") if len(set(seq.dtype for seq in seqs)) != 1: raise ValueError("Cannot pad sequences with different dtypes") if len(set(seq.shape[1:] for seq in seqs)) != 1: raise ValueError("Cannot pad sequences that differ on other dimensions") # Find the maximum dimension along each axis. That's what we'll pad to. max_seq_len = max(len(seq) for seq in seqs) # Round the length to nearest bucket -- helps on GPU, to make similar # array sizes. max_seq_len += -max_seq_len % round_to final_shape = (len(seqs), max_seq_len) + seqs[0].shape[1:] output: Array3d = cast(Array3d, self.alloc(final_shape, dtype=seqs[0].dtype)) for i, arr in enumerate(seqs): # It's difficult to convince this that the dtypes will match. output[i, : arr.shape[0]] = arr # type: ignore[assignment, call-overload] return output def unpad(self, padded: Array3d, lengths: List[int]) -> List2d: """The reverse/backward operation of the `pad` function: transform an array back into a list of arrays, each with their original length. """ output = [] for i, length in enumerate(lengths): output.append(padded[i, :length]) return cast(List2d, output) def list2padded(self, seqs: List2d) -> Padded: """Pack a sequence of 2d arrays into a Padded datatype.""" if not seqs: return Padded( self.alloc3f(0, 0, 0), self.alloc1i(0), self.alloc1i(0), self.alloc1i(0) ) elif len(seqs) == 1: data = self.reshape3(seqs[0], seqs[0].shape[0], 1, seqs[0].shape[1]) size_at_t = self.asarray1i([1] * data.shape[0]) lengths = self.asarray1i([data.shape[0]]) indices = self.asarray1i([0]) return Padded(data, size_at_t, lengths, indices) lengths_indices = [(len(seq), i) for i, seq in enumerate(seqs)] lengths_indices.sort(reverse=True) indices_ = [i for length, i in lengths_indices] lengths_ = [length for length, i in lengths_indices] nS = max([seq.shape[0] for seq in seqs]) nB = len(seqs) nO = seqs[0].shape[1] # Reorder the sequences, by length. This looks the same in either # direction: you're swapping elements between their original and sorted # position. seqs = cast(List2d, [seqs[i] for i in indices_]) arr: Array3d = self.pad(seqs) assert arr.shape == (nB, nS, nO), (nB, nS, nO) arr = self.as_contig(arr.transpose((1, 0, 2))) assert arr.shape == (nS, nB, nO) # Build a lookup table so we can find how big the batch is at point t. batch_size_at_t_ = [0 for _ in range(nS)] current_size = len(lengths_) for t in range(nS): while current_size and t >= lengths_[current_size - 1]: current_size -= 1 batch_size_at_t_[t] = current_size assert sum(lengths_) == sum(batch_size_at_t_) return Padded( arr, self.asarray1i(batch_size_at_t_), self.asarray1i(lengths_), self.asarray1i(indices_), ) def padded2list(self, padded: Padded) -> List2d: """Unpack a Padded datatype to a list of 2-dimensional arrays.""" data = padded.data indices = to_numpy(padded.indices) lengths = to_numpy(padded.lengths) unpadded: List[Optional[Array2d]] = [None] * len(lengths) # Transpose from (length, batch, data) to (batch, length, data) data = self.as_contig(data.transpose((1, 0, 2))) for i in range(data.shape[0]): unpadded[indices[i]] = data[i, : int(lengths[i])] return cast(List2d, unpadded) def get_dropout_mask(self, shape: Shape, drop: Optional[float]) -> FloatsXd: """Create a random mask for applying dropout, with a certain percent of the mask (defined by `drop`) will contain zeros. The neurons at those positions will be deactivated during training, resulting in a more robust network and less overfitting. """ if drop is None or drop <= 0: return self.xp.ones(shape, dtype="f") elif drop >= 1.0: return self.alloc_f(shape) coinflips = self.xp.random.uniform(0.0, 1.0, shape) mask = (coinflips >= drop) / (1.0 - drop) return cast(FloatsXd, self.asarray(mask, dtype="float32")) def alloc1f( self, d0: int, *, dtype: Optional[DTypesFloat] = "float32", zeros: bool = True, ) -> Floats1d: return cast(Floats1d, self.alloc((d0,), dtype=dtype, zeros=zeros)) def alloc2f( self, d0: int, d1: int, *, dtype: Optional[DTypesFloat] = "float32", zeros: bool = True, ) -> Floats2d: return cast(Floats2d, self.alloc((d0, d1), dtype=dtype, zeros=zeros)) def alloc3f( self, d0: int, d1: int, d2: int, *, dtype: Optional[DTypesFloat] = "float32", zeros: bool = True, ) -> Floats3d: return cast(Floats3d, self.alloc((d0, d1, d2), dtype=dtype, zeros=zeros)) def alloc4f( self, d0: int, d1: int, d2: int, d3: int, *, dtype: Optional[DTypesFloat] = "float32", zeros: bool = True, ) -> Floats4d: return cast(Floats4d, self.alloc((d0, d1, d2, d3), dtype=dtype, zeros=zeros)) def alloc_f( self, shape: Shape, *, dtype: Optional[DTypesFloat] = "float32", zeros: bool = True, ) -> FloatsXd: return cast(FloatsXd, self.alloc(shape, dtype=dtype, zeros=zeros)) def alloc1i( self, d0: int, *, dtype: Optional[DTypesInt] = "int32", zeros: bool = True, ) -> Ints1d: return cast(Ints1d, self.alloc((d0,), dtype=dtype, zeros=zeros)) def alloc2i( self, d0: int, d1: int, *, dtype: Optional[DTypesInt] = "int32", zeros: bool = True, ) -> Ints2d: return cast(Ints2d, self.alloc((d0, d1), dtype=dtype, zeros=zeros)) def alloc3i( self, d0: int, d1: int, d2: int, *, dtype: Optional[DTypesInt] = "int32", zeros: bool = True, ) -> Ints3d: return cast(Ints3d, self.alloc((d0, d1, d2), dtype=dtype, zeros=zeros)) def alloc4i( self, d0: int, d1: int, d2: int, d3: int, *, dtype: Optional[DTypesInt] = "int32", zeros: bool = True, ) -> Ints4d: return cast(Ints4d, self.alloc((d0, d1, d2, d3), dtype=dtype, zeros=zeros)) def alloc_i( self, shape: Shape, *, dtype: Optional[DTypesInt] = "int32", zeros: bool = True, ) -> IntsXd: return cast(IntsXd, self.alloc(shape, dtype=dtype, zeros=zeros)) def alloc( self, shape: Shape, *, dtype: Optional[DTypes] = "float32", zeros: bool = True, ) -> Any: """Allocate an array of a certain shape.""" if isinstance(shape, int): shape = (shape,) if zeros: return self.xp.zeros(shape, dtype=dtype) else: return self.xp.empty(shape, dtype=dtype) def reshape1(self, array: ArrayXd, d0: int) -> Array1d: return cast(Array1d, self.reshape(array, (d0,))) def reshape2(self, array: ArrayXd, d0: int, d1: int) -> Array2d: return cast(Array2d, self.reshape(array, (d0, d1))) def reshape3(self, array: ArrayXd, d0: int, d1: int, d2: int) -> Array3d: return cast(Array3d, self.reshape(array, (d0, d1, d2))) def reshape4(self, array: ArrayXd, d0: int, d1: int, d2: int, d3: int) -> Array4d: return cast(Array4d, self.reshape(array, (d0, d1, d2, d3))) def reshape1f(self, array: FloatsXd, d0: int) -> Floats1d: return cast(Floats1d, self.reshape(array, (d0,))) def reshape2f(self, array: FloatsXd, d0: int, d1: int) -> Floats2d: return cast(Floats2d, self.reshape(array, (d0, d1))) def reshape3f(self, array: FloatsXd, d0: int, d1: int, d2: int) -> Floats3d: return cast(Floats3d, self.reshape(array, (d0, d1, d2))) def reshape4f( self, array: FloatsXd, d0: int, d1: int, d2: int, d3: int ) -> Floats4d: return cast(Floats4d, self.reshape(array, (d0, d1, d2, d3))) def reshape_f(self, array: FloatsXd, shape: Shape) -> FloatsXd: return self.reshape(array, shape) def reshape1i(self, array: IntsXd, d0: int) -> Ints1d: return cast(Ints1d, self.reshape(array, (d0,))) def reshape2i(self, array: IntsXd, d0: int, d1: int) -> Ints2d: return cast(Ints2d, self.reshape(array, (d0, d1))) def reshape3i(self, array: IntsXd, d0: int, d1: int, d2: int) -> Ints3d: return cast(Ints3d, self.reshape(array, (d0, d1, d2))) def reshape4i(self, array: IntsXd, d0: int, d1: int, d2: int, d3: int) -> Ints4d: return cast(Ints4d, self.reshape(array, (d0, d1, d2, d3))) def reshape_i(self, array: IntsXd, shape: Shape) -> IntsXd: return self.reshape(array, shape) def reshape(self, array: ArrayT, shape: Shape) -> ArrayT: """Reshape an array.""" if isinstance(shape, int): shape = (shape,) return cast(ArrayT, array.reshape(shape)) def asarray4f( self, data: Union[Floats4d, Sequence[Sequence[Sequence[Sequence[float]]]]], *, dtype: Optional[DTypes] = "float32", ) -> Floats4d: return cast(Floats4d, self.asarray(data, dtype=dtype)) def asarray3f( self, data: Union[Floats3d, Sequence[Sequence[Sequence[float]]]], *, dtype: Optional[DTypes] = "float32", ) -> Floats3d: return cast(Floats3d, self.asarray(data, dtype=dtype)) def asarray2f( self, data: Union[Floats2d, Sequence[Sequence[float]]], *, dtype: Optional[DTypes] = "float32", ) -> Floats2d: return cast(Floats2d, self.asarray(data, dtype=dtype)) def asarray1f( self, data: Union[Floats1d, Sequence[float]], *, dtype: Optional[DTypes] = "float32", ) -> Floats1d: return cast(Floats1d, self.asarray(data, dtype=dtype)) def asarray_f( self, data: Union[FloatsXd, Sequence[Any]], *, dtype: Optional[DTypes] = "float32", ) -> FloatsXd: return cast(FloatsXd, self.asarray(data, dtype=dtype)) def asarray1i( self, data: Union[Ints1d, Sequence[int]], *, dtype: Optional[DTypes] = "int32" ) -> Ints1d: return cast(Ints1d, self.asarray(data, dtype=dtype)) def asarray2i( self, data: Union[Ints2d, Sequence[Sequence[int]]], *, dtype: Optional[DTypes] = "int32", ) -> Ints2d: return cast(Ints2d, self.asarray(data, dtype=dtype)) def asarray3i( self, data: Union[Ints3d, Sequence[Sequence[Sequence[int]]]], *, dtype: Optional[DTypes] = "int32", ) -> Ints3d: return cast(Ints3d, self.asarray(data, dtype=dtype)) def asarray4i( self, data: Union[Ints4d, Sequence[Sequence[Sequence[Sequence[int]]]]], *, dtype: Optional[DTypes] = "int32", ) -> Ints4d: return cast(Ints4d, self.asarray(data, dtype=dtype)) def asarray_i( self, data: Union[IntsXd, Sequence[Any]], *, dtype: Optional[DTypes] = "int32" ) -> IntsXd: return cast(IntsXd, self.asarray(data, dtype=dtype)) def asarray( self, data: Union[ArrayXd, Sequence[ArrayXd], Sequence[Any]], *, dtype: Optional[DTypes] = None, ) -> ArrayXd: """Ensure a given array is of the correct type.""" if isinstance(data, self.xp.ndarray): if dtype is None: return data elif data.dtype == dtype: return data else: return self.xp.asarray(data, dtype=dtype) elif hasattr(data, "numpy"): # Handles PyTorch Tensor return data.numpy() # type: ignore[union-attr] elif dtype is not None: return self.xp.array(data, dtype=dtype) else: return self.xp.array(data) def as_contig(self, data: ArrayT, dtype: Optional[DTypes] = None) -> ArrayT: """Allow the backend to make a contiguous copy of an array. Implementations of `Ops` do not have to make a copy or make it contiguous if that would not improve efficiency for the execution engine. """ if data.flags["C_CONTIGUOUS"] and dtype in (None, data.dtype): return data kwargs = {"dtype": dtype} if dtype is not None else {} return self.xp.ascontiguousarray(data, **kwargs) def sigmoid(self, X: FloatsXdT, *, inplace: bool = False) -> FloatsXdT: if inplace: # To prevent overflows and help with regularization/numerical stability X = self.xp.clip(X, -20.0, 20.0, out=X) self.xp.exp(-X, out=X) X += 1.0 X **= -1.0 return X else: X = self.xp.clip(X, -20.0, 20.0) return 1.0 / (1.0 + self.xp.exp(-X)) def backprop_sigmoid( self, dY: FloatsXdT, Y: FloatsXdT, *, inplace: bool = False ) -> FloatsXdT: if inplace: self.dsigmoid(Y, inplace=True) Y *= dY return Y else: return dY * self.dsigmoid(Y, inplace=inplace) def dsigmoid(self, Y: FloatsXdT, *, inplace: bool = False) -> FloatsXdT: if inplace: Y *= 1 - Y return Y else: return Y * (1.0 - Y) def dtanh(self, Y: FloatsT, *, inplace: bool = False) -> FloatsT: if inplace: Y **= 2 Y *= -1.0 Y += 1.0 return Y else: return 1 - Y**2 def softmax( self, x: FloatsT, *, inplace: bool = False, axis: int = -1, temperature: float = 1.0, ) -> FloatsT: if temperature != 1.0: x = x / temperature maxes = self.xp.max(x, axis=axis, keepdims=True) shifted = x - maxes new_x = self.xp.exp(shifted) new_x /= new_x.sum(axis=axis, keepdims=True) return new_x def softmax_sequences( self, Xs: Floats2d, lengths: Ints1d, *, inplace: bool = False, axis: int = -1 ) -> Floats2d: if Xs.ndim >= 3: err = f"Softmax currently only supports 2d. Got: {Xs.ndim}" raise NotImplementedError(err) # This loses almost no fidelity, and helps the numerical stability. Xs = self.xp.clip(Xs, -20.0, 20.0) new_x = self.xp.exp(Xs) summed = self.backprop_reduce_sum(self.reduce_sum(new_x, lengths), lengths) new_x /= summed return new_x def backprop_softmax( self, Y: FloatsT, dY: FloatsT, *, axis: int = -1, temperature: float = 1.0 ) -> FloatsT: if temperature != 1.0: dY = dY / temperature dX = Y * dY dX -= Y * dX.sum(axis=axis, keepdims=True) return dX def backprop_softmax_sequences( self, dY: Floats2d, Y: Floats2d, lengths: Ints1d ) -> Floats2d: dX = Y * dY sum_dX = self.backprop_reduce_sum(self.reduce_sum(dX, lengths), lengths) dX -= Y * sum_dX return dX def lstm_forward_training( self, params: Floats1d, H0: Floats3d, C0: Floats3d, X: Floats2d, size_at_t: Ints1d, ) -> Tuple[Floats2d, Tuple]: assert H0.shape == C0.shape assert H0.shape[1] == C0.shape[1] Y, fwd_state = lstm_forward_training(params, H0, C0, X, size_at_t) return Y, fwd_state def lstm_forward_inference( self, params: Floats1d, H0: Floats3d, C0: Floats3d, X: Floats2d, size_at_t: Ints1d, ) -> Floats2d: Y, _ = lstm_forward_training(params, H0, C0, X, size_at_t) return Y def backprop_lstm( self, dY: Floats2d, lengths: Ints1d, params: Floats1d, fwd_state: Tuple ) -> Tuple[Floats2d, Floats1d]: dX, d_params = backprop_lstm(dY, lengths, params, fwd_state) return dX, d_params def maxout(self, X: Floats3d) -> Tuple[Floats2d, Ints2d]: which = X.argmax(axis=-1) return X.max(axis=-1), which def backprop_maxout(self, dY: Floats2d, which: Ints2d, P: int) -> Floats3d: dX = self.alloc3f(dY.shape[0], dY.shape[1], P, dtype=dY.dtype) for b in range(dY.shape[0]): for o in range(dY.shape[1]): dX[b, o, which[b, o]] = dY[b, o] return dX def relu(self, X: Floats2d, inplace: bool = False) -> Floats2d: if not inplace: return X * (X > 0) else: X *= X > 0 return X def backprop_relu( self, dY: Floats2d, Y: Floats2d, inplace: bool = False ) -> Floats2d: if not inplace: return dY * (Y > 0) dY *= Y > 0 return dY def clipped_linear( self, X: FloatsXdT, slope: float = 1.0, offset: float = 0.0, min_val: float = 0.0, max_val: float = 1.0, inplace: bool = False, ) -> FloatsXdT: if inplace: X *= slope X += offset return self.xp.clip(X, min_val, max_val, out=X) out = X * slope + offset return self.xp.clip(out, min_val, max_val) def backprop_clipped_linear( self, dY: FloatsXdT, X: FloatsXdT, slope: float = 1.0, offset: float = 0.0, min_val: float = 0.0, max_val: float = 1.0, inplace: bool = False, ) -> FloatsXdT: low = (min_val - offset) / slope high = (max_val - offset) / slope slope = self.xp.float64(slope).astype(X.dtype) zero = self.xp.float64(0.0).astype(X.dtype) dX = self.xp.where((low < X) & (X < high), slope, zero) if inplace: dY *= dX return dY return dY * dX def relu_k(self, X: FloatsXdT, n: float = 6.0, inplace: bool = False) -> FloatsXdT: return self.clipped_linear(X, max_val=n, inplace=inplace) def backprop_relu_k( self, dY: FloatsXdT, X: FloatsXdT, n: float = 6.0, inplace: bool = False ) -> FloatsXdT: return self.backprop_clipped_linear(dY, X, max_val=n, inplace=inplace) def hard_sigmoid(self, X: FloatsXdT, inplace: bool = False) -> FloatsXdT: return self.clipped_linear(X, slope=0.2, offset=0.5, inplace=inplace) def backprop_hard_sigmoid( self, dY: FloatsXdT, X: FloatsXdT, inplace: bool = False ) -> FloatsXdT: return self.backprop_clipped_linear(dY, X, slope=0.2, offset=0.5) def hard_tanh(self, X: FloatsXdT, inplace: bool = False) -> FloatsXdT: return self.clipped_linear(X, min_val=-1.0, max_val=1.0, inplace=inplace) def backprop_hard_tanh( self, dY: FloatsXdT, X: FloatsXdT, inplace: bool = False ) -> FloatsXdT: return self.backprop_clipped_linear(dY, X, min_val=-1.0, max_val=1.0) def swish(self, X: FloatsXdT, inplace: bool = False) -> FloatsXdT: if inplace: X *= self.sigmoid(X) return X out = X * self.sigmoid(X) return out def backprop_swish( self, dY: FloatsXdT, X: FloatsXdT, Y: FloatsXdT, inplace: bool = False ) -> FloatsXdT: Y = Y + self.sigmoid(X) * (1 - Y) if inplace: dY *= Y return dY out = dY * Y return out # Following https://www.scitepress.org/Papers/2019/74696/74696.pdf def hard_swish(self, X: FloatsXdT, inplace: bool = False) -> FloatsXdT: if inplace: X *= self.hard_sigmoid(X) return X out = X * self.hard_sigmoid(X) return out def backprop_hard_swish( self, dY: FloatsXdT, X: FloatsXdT, inplace: bool = False ) -> FloatsXdT: dX = X * 0.4 + 0.5 dX[X > 2.5] = 1.0 dX[X < -2.5] = 0 if inplace: dY *= dX return dY return dY * dX # From https://arxiv.org/pdf/1905.02244v5.pdf def hard_swish_mobilenet(self, X: FloatsXdT, inplace: bool = False) -> FloatsXdT: if inplace: X *= self.relu_k(X + 3) / 6 return X return X * (self.relu_k(X + 3) / 6) def backprop_hard_swish_mobilenet( self, dY: FloatsXdT, X: FloatsXdT, inplace: bool = False ) -> FloatsXdT: dX = (1 / 6) * (X * 2.0 + 3.0) dX[X > 3.0] = 1.0 dX[X < -3.0] = 0 if inplace: dY *= dX return dY return dX * dY def dish(self, X: FloatsXdT, inplace: bool = False) -> FloatsXdT: tmp = self.xp.square(X) tmp += 1.0 self.xp.sqrt(tmp, out=tmp) tmp = X / tmp tmp += 1 tmp *= 0.5 if inplace: X *= tmp return X else: return X * tmp def backprop_dish( self, dY: FloatsXdT, X: FloatsXdT, inplace: bool = False ) -> FloatsXdT: x_sq = self.xp.square(X) x_sq_plus_one = x_sq + 1.0 deriv = X / self.xp.sqrt(x_sq_plus_one) second = 0.5 * X * x_sq second /= x_sq_plus_one**1.5 deriv -= second deriv += 0.5 if inplace: dY *= deriv return dY else: return dY * deriv # Code snippet taken from: # https://www.johndcook.com/blog/2009/01/19/stand-alone-error-function-erf/ def erf(self, X: FloatsXdT) -> FloatsXdT: # save the sign of x sign = self.xp.sign(X) X = self.xp.abs(X) a1 = 0.254829592 a2 = -0.284496736 a3 = 1.421413741 a4 = -1.453152027 a5 = 1.061405429 p = 0.3275911 t = 1.0 / (1.0 + p * X) y = 1.0 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * self.xp.exp( -X * X ) out = sign * y out = out.astype(X.dtype) return out def sechsq(self, X: FloatsXdT) -> FloatsXdT: # Avoid overflow in cosh. Clipping at |20| has an error of 1.7e-17. X = self.xp.clip(X, -20.0, 20.0) return (1 / self.xp.cosh(X)) ** 2 def gelu_approx(self, X: FloatsXdT, inplace: bool = False) -> FloatsXdT: tmp = 1.0 + self.xp.tanh(SQRT2PI * (X + 0.044715 * self.xp.power(X, 3))) tmp *= 0.5 tmp = tmp.astype(X.dtype) if inplace: X *= tmp return X else: Y = self.xp.array(X) Y *= tmp return Y def backprop_gelu_approx( self, dY: FloatsXdT, X: FloatsXdT, inplace: bool = False ) -> FloatsXdT: dX = cast(FloatsXdT, self.alloc_f(X.shape)) Xp3 = self.xp.power(X, 3) tmp = 0.5 * self.xp.tanh(0.0356774 * Xp3 + 0.797885 * X) tmp += (0.0535161 * Xp3 + 0.398942 * X) * self.sechsq( 0.0356774 * Xp3 + 0.797885 * X ) tmp += 0.5 dX += tmp if inplace: dY *= dX return dY return dY * dX def gelu(self, X: FloatsXdT, inplace: bool = False) -> FloatsXdT: # GELU(x) = x · Φ(x) cdf = gaussian_cdf(self, X) if inplace: X *= cdf return X return X * cdf def backprop_gelu( self, dY: FloatsXdT, X: FloatsXdT, inplace: bool = False ) -> FloatsXdT: # GELU'(x) = Φ(x) + x · PDF(x) dX = gaussian_cdf(self, X) + X * gaussian_pdf(self, X) if inplace: dY *= dX return dY return dY * dX def mish( self, X: FloatsXdT, threshold: float = 20.0, inplace: bool = False ) -> FloatsXdT: tmp = X * self.xp.tanh(self.xp.log(1.0 + self.xp.exp(X))) Y = self.xp.where(X >= threshold, X, tmp) if inplace: X[:] = Y return X else: return Y def backprop_mish( self, dY: FloatsXdT, X: Floats2d, threshold: float = 20.0, inplace: bool = False, ) -> FloatsXdT: if dY.shape != X.shape: msg = f"arrays have incompatible shapes: {dY.shape} and {X.shape}" raise ValueError(msg) xp = get_array_module(X) indices = X < threshold Xsub = X[indices] dYsub = dY[indices] omega = 4.0 * (Xsub + 1.0) omega += 4.0 * xp.exp(2.0 * Xsub) omega += xp.exp(3.0 * Xsub) omega += xp.exp(Xsub) * ((4.0 * Xsub) + 6.0) delta = xp.exp(Xsub) + 1.0 delta *= delta delta += 1.0 dXsub = dYsub * ((xp.exp(Xsub) * omega) / (delta**2)) # Gradient when above threshold will ignore softplus. if inplace: out = dY else: out = xp.copy(dY) out[indices] = dXsub return out def update_averages( self, ema: FloatsT, weights: FloatsT, t: int, max_decay: float = 0.9999 ) -> None: # Internals for optimizer decay = (1.0 + t) / (10.0 + t) if decay > max_decay: decay = max_decay ema -= (1 - decay) * (ema - weights) def adam( self, weights: Floats1d, gradient: Floats1d, mom1: Floats1d, mom2: Floats1d, beta1: float, beta2: float, eps: float, learn_rate: float, mod_rate: float = 1.0, ) -> Tuple[Floats1d, Floats1d, Floats1d, Floats1d]: _check_compatible_shape(weights, gradient) _check_compatible_shape(weights, mom1) _check_compatible_shape(weights, mom2) # Internals for optimizer mom1 *= beta1 mom2 *= beta2 mom1 += gradient * (1.0 - beta1) mom2 += gradient * gradient * (1.0 - beta2) # Here we assume learn rate is calculated by the caller. # cdef weight_t a_t = learn_rate * sqrt(1-beta2**hp.t) / (1-beta1**hp.t); weights -= learn_rate * (mom1 / (mod_rate * self.xp.sqrt(mom2) + eps)) return weights, gradient, mom1, mom2 def clip_gradient(self, gradient: FloatsT, threshold: float) -> FloatsT: # Internals for optimizer xp = get_array_module(gradient) grad_norm = xp.linalg.norm(gradient) if grad_norm >= threshold: gradient *= threshold / grad_norm return gradient def logloss(self, y_true: FloatsT, y_pred: FloatsT) -> float: # Currently not used log_yp = self.xp.log(y_pred + 1e-8) loss = (y_true * log_yp) + (1 - y_true) * self.xp.log((1 - y_pred) + 1e-8) return -loss def reduce_sum(self, X: Floats2d, lengths: Ints1d) -> Floats2d: Y = self.alloc2f(lengths.shape[0], X.shape[1], zeros=False) start = 0 for i, length in enumerate(lengths): if length < 0: raise ValueError(f"all sequence lengths must be >= 0, got {length}") elif start + length > X.shape[0]: raise IndexError("lengths must sum up to the number of rows") elif length: Y[i] = X[start : start + length].sum(axis=0) start += length else: Y[i] = 0.0 return Y def reduce_first(self, X: Floats2d, lengths: Ints1d) -> Tuple[Floats2d, Ints1d]: if lengths.size == 0: return self.alloc2f(0, X.shape[1]), lengths if not self.xp.all(lengths > 0): raise ValueError(f"all sequence lengths must be > 0") starts_ends = self.alloc1i(lengths.shape[0] + 1, zeros=False) starts_ends[0] = 0 starts_ends[1:] = lengths.cumsum() if starts_ends[-1] != X.shape[0]: raise IndexError("lengths must sum up to the number of rows") return X[starts_ends[:-1]], starts_ends def reduce_last(self, X: Floats2d, lengths: Ints1d) -> Tuple[Floats2d, Ints1d]: if lengths.size == 0: return self.alloc2f(0, X.shape[1]), lengths if not self.xp.all(lengths > 0): raise ValueError(f"all sequence lengths must be > 0") lasts = lengths.cumsum() - 1 if lasts[-1] + 1 != X.shape[0]: raise IndexError("lengths must sum up to the number of rows") return X[lasts], lasts def reduce_mean(self, X: Floats2d, lengths: Ints1d) -> Floats2d: Y = self.alloc2f(lengths.shape[0], X.shape[1], zeros=False) start = 0 for i, length in enumerate(lengths): if length < 0: raise ValueError(f"all sequence lengths must be >= 0, got {length}") elif start + length > X.shape[0]: raise IndexError("lengths must sum up to the number of rows") elif length: Y[i] = X[start : start + length].mean(axis=0) else: Y[i] = 0.0 start += length return Y def reduce_max(self, X: Floats2d, lengths: Ints1d) -> Tuple[Floats2d, Ints2d]: Y = self.alloc2f(lengths.shape[0], X.shape[1], dtype=X.dtype, zeros=False) which = self.alloc2i(lengths.shape[0], X.shape[1], zeros=False) start = 0 for i, length in enumerate(lengths): if length <= 0: raise ValueError(f"all sequence lengths must be > 0, got {length}") elif start + length > X.shape[0]: raise IndexError("lengths must sum up to the number of rows") elif length: which[i] = X[start : start + length].argmax(axis=0) Y[i] = X[start : start + length].max(axis=0) start += length return Y, which def backprop_reduce_first( self, d_firsts: Floats2d, starts_ends: Ints1d ) -> Floats2d: if starts_ends.size == 0: return self.alloc2f(0, d_firsts.shape[1], dtype=d_firsts.dtype, zeros=True) elif starts_ends.size == 1: raise ValueError(f"starts_ends must not have size 1") dX = self.alloc2f( int(starts_ends[-1]), d_firsts.shape[1], dtype=d_firsts.dtype, zeros=True ) dX[starts_ends[:-1]] = d_firsts return dX def backprop_reduce_last(self, d_lasts: Floats2d, lasts: Ints1d) -> Floats2d: if lasts.size == 0: return self.alloc2f(0, d_lasts.shape[1], dtype=d_lasts.dtype, zeros=True) dX = self.alloc2f( int(lasts[-1]) + 1, d_lasts.shape[1], dtype=d_lasts.dtype, zeros=True ) dX[lasts] = d_lasts return dX def backprop_reduce_sum(self, d_sums: Floats2d, lengths: Ints1d) -> Floats2d: dX = self.alloc2f( lengths.sum(), d_sums.shape[1], dtype=d_sums.dtype, zeros=False ) start = 0 for i, length in enumerate(lengths): if length < 0: raise ValueError(f"all sequence lengths must be >= 0, got {length}") dX[start : start + length] = d_sums[i] start += length return dX def backprop_reduce_mean(self, d_means: Floats2d, lengths: Ints1d) -> Floats2d: dX = self.alloc2f( lengths.sum(), d_means.shape[1], dtype=d_means.dtype, zeros=False ) start = 0 for i, length in enumerate(lengths): if length < 0: raise ValueError(f"all sequence lengths must be >= 0, got {length}") dX[start : start + length] = d_means[i] / length start += length return dX def backprop_reduce_max( self, d_maxes: Floats2d, which: Ints2d, lengths: Ints1d ) -> Floats2d: dX = self.alloc2f(lengths.sum(), d_maxes.shape[1], dtype=d_maxes.dtype) start = 0 for i, length in enumerate(lengths): if length <= 0: raise ValueError(f"all sequence lengths must be > 0, got {length}") self.xp.put_along_axis( dX[start : start + length], which[i].reshape((1, -1)), d_maxes[i], 0 ) start += length return dX def hash(self, ids: Ints1d, seed: int) -> Ints2d: """Hash a sequence of 64-bit keys into a table with 4 32-bit keys, using murmurhash3. """ from .numpy_ops import NumpyOps numpy_ops = NumpyOps() return self.asarray2i( numpy_ops.hash(numpy_ops.asarray(ids, dtype="uint64"), seed) ) def ngrams(self, n: int, keys: Ints1d) -> Ints1d: from .numpy_ops import NumpyOps numpy_ops = NumpyOps() return self.asarray1i( numpy_ops.ngrams(n, numpy_ops.asarray(keys, dtype="uint64")) ) def position_encode( self, N: int, D: int, period: int = 10000, out: Optional[Floats2d] = None ) -> Floats2d: # Currently internals only from .numpy_ops import NumpyOps numpy_ops = NumpyOps() return self.asarray2f(numpy_ops.position_encode(N, D, period, out)) def gather_add(self, table: Floats2d, indices: Ints2d) -> Floats2d: return table[indices].sum(axis=1) # type: ignore[return-value] def scatter_add( self, table: FloatsXd, indices: IntsXd, values: FloatsXd ) -> FloatsXd: return self.xp.add.at(table, indices, values) def insert_into(self, shape, Xs): """Maybe don't need this? Just a quicky to get Jax working.""" output = self.alloc(shape, dtype=Xs[0].dtype) for i, x in enumerate(Xs): output[i, : x.shape[0]] = x return output """ LSTM Notation (kind of involved, but made it a lot easier to write) X: Inputs Y: Outputs (aka hiddens) C: Cells G: Gates (Output of non-linearity, i.e. lstm_gates(X @ W.T) A: Activations (X @ W.T, before non-linearity) Imagine we have the input: batch = [ ["apple", "banana", "cantaloupe", "date", "elderberry"], ["aardvark", "bat", "capybara", "dingo", "elephant"] ] The input variable X will have one vector per word, so X[0, 1] will be banana's vector, X[0, 1, 0] will be a float, the first element of that vector. We're computing an output variable Y of shape (nL, nB, nO), so that Y[0, 1] is the output variable of banana. A problem with variables for RNNs is keeping the timesteps straight. It's hard to distinguish the current, previous, and next timesteps. To solve this problem, we follow the convention that **we are at timestep 3**. Additionally, the variables for Y and C are offset by one, as the 0th elements have the initial hiddens and initial cells. So: t=3 Xt3: The input vectors for 'dingo' and 'date', i.e. X[t] Yt3: The output vectors for 'dingo' and 'date', i.e. Y[t+1] (Y is offset.) Ct2: The cells calculated at 'c...', that are the input for 'd...' Ct3: The cells calculated at 'd...', that are the input for 'e...' At3: The activations at 'd...' Gt3: The gates at 'd...' """ def lstm_forward_training( params: Floats1d, c_init: Floats3d, h_init: Floats3d, X: Floats2d, lengths: Ints1d ) -> Tuple[Floats2d, Tuple]: xp = get_array_module(params) depth, dirs, nO = c_init.shape N, nI = X.shape batch_size = lengths[0] # Preallocate these so we can pass them through for loop. G = cast(Floats4d, xp.zeros((depth, dirs, X.shape[0], nO * 4), dtype="f")) Y = cast(Floats4d, xp.zeros((depth, dirs, X.shape[0], nO), dtype="f")) C = cast(Floats4d, xp.zeros((depth, dirs, X.shape[0], nO), dtype="f")) Yt2 = cast(Floats2d, xp.zeros((batch_size, nO), dtype="f")) Ct2 = cast(Floats2d, xp.zeros((batch_size, nO), dtype="f")) # Compute the start and end indices first. indices = [] start = 0 for batch_size in lengths: indices.append((start, start + batch_size)) start += batch_size params_i = 0 orig_X = X for i in range(depth): nI = X.shape[1] for d in range(dirs): # The inits are shaped (depth, dirs, nO). We add the internal dimension # to make them set correctly. Yt2 = h_init[i, d].reshape((1, nO)) # type: ignore[assignment] Ct2 = c_init[i, d].reshape((1, nO)) # type: ignore[assignment] layer_params, params_i = _split_weights(params, i, nO, nI, params_i) Wx, Wh, bias = _transpose_weights(layer_params) G[i, d] += xp.dot(X, Wx.T) G[i, d] += bias for start, end in indices if d == 0 else reversed(indices): # When we iterate left-to-right, t2 might be longer than t3. Yt2 = Yt2[: end - start] Ct2 = Ct2[: end - start] # But in right-to-left, it's the opposite: t3 can be longer. Gt3 = G[i, d, start:end] Gt3 = Gt3[: Yt2.shape[0]] Gt3 += xp.dot(Yt2, Wh.T) Gt3_ = cast(Floats3d, Gt3.reshape((-1, nO, 4))) hf = sigmoid(Gt3_[:, :, 0]) hi = sigmoid(Gt3_[:, :, 1]) ho = sigmoid(Gt3_[:, :, 2]) hc = xp.tanh(Gt3_[:, :, 3]) Ct3 = hf * Ct2 Ct3 += hi * hc # Store results Gt3 = ( xp.hstack((hf, hi, ho, hc)) .reshape((-1, 4, nO)) .transpose((0, 2, 1)) .reshape((-1, nO * 4)) ) # Fix the endpoint to account for shorter slices when iterating # reversed. Not 100% sure this is right. If there's a bug, look # here? end = min(end, start + ho.shape[0]) Y[i, d, start:end] = xp.tanh(Ct3) * ho G[i, d, start:end] = Gt3 C[i, d, start:end] = Ct3 # Set the t2 variables to the current t3 variables. Ct2 = Ct3 Yt2 = Y[i, d, start:end] H = cast(Floats2d, Y[i].transpose((1, 0, 2)).reshape((N, -1))) if dirs == 2: H = xp.ascontiguousarray(H) X = H return H, (Y, G, C, orig_X) def backprop_lstm(dY: Floats2d, lengths: Ints1d, params: Floats1d, fwd_state: Tuple): xp = get_array_module(params) Y: Floats4d G: Floats4d C: Floats4d X: Floats2d Wx: Floats2d Wh: Floats2d bias: Floats1d dWx: Floats2d dWh: Floats2d d_bias: Floats1d Y, G, C, X = fwd_state depth, dirs, N, nO = C.shape nI = X.shape[1] batch_size = lengths[0] # We don't need to store all the cells for all the layers. dC = cast(Floats2d, xp.zeros((N, nO), dtype=C.dtype)) dG = cast(Floats2d, xp.zeros((N, nO * 4), dtype=C.dtype)) d_params = cast(Floats1d, xp.zeros((params.shape[0],), dtype=params.dtype)) # Collect the params and slices. It makes it a bit easier to get the indexing # right, when we're iterating backwards. params_i = 0 all_layer_params: List[List[Tuple[Tuple[Floats2d, Floats2d, Floats1d], int]]] = [] for i in range(depth): all_layer_params.append([]) n_inputs = nI if i == 0 else (nO * dirs) for d in range(dirs): layer_params, params_i = _split_weights(params, i, nO, n_inputs, params_i) layer_params = _transpose_weights(layer_params) all_layer_params[-1].append((layer_params, params_i)) params_i = 0 all_layer_grads: List[List[Tuple[Tuple[Floats2d, Floats2d, Floats1d], int]]] = [] for i in range(depth): all_layer_grads.append([]) n_inputs = nI if i == 0 else (nO * dirs) for d in range(dirs): layer_grads, params_i = _split_weights(d_params, i, nO, n_inputs, params_i) layer_grads = _transpose_weights(layer_grads) all_layer_grads[-1].append((layer_grads, params_i)) # Similarly, we want to compute the indices first indices = [] start = 0 for batch_size in lengths: indices.append((start, start + batch_size)) start += batch_size Xs = [X] + [ cast(Floats2d, Y[i].transpose((1, 0, 2)).reshape((N, -1))) for i in range(depth - 1) ] dXs = [xp.zeros((X.shape[0], X.shape[1]), dtype=X.dtype) for X in Xs] # Okay, now do the actual looping for i in reversed(range(depth)): dY3d = cast(Floats3d, dY.reshape((N, dirs, nO)).transpose((1, 0, 2))) dX = dXs[i] X = Xs[i] if dirs >= 2: dY3d = xp.ascontiguousarray(dY3d) for d in range(dirs): Wx, Wh, bias = all_layer_params[i][d][0] dWx, dWh, d_bias = all_layer_grads[i][d][0] if d == 0: start_t3, end_t3 = indices[-1] layer_indices = indices[:-1] layer_indices.reverse() else: start_t3, end_t3 = indices[0] layer_indices = indices[1:] for start_t2, end_t2 in layer_indices: size = min(end_t2 - start_t2, end_t3 - start_t3) dGt3, dCt2 = backprop_lstm_gates( dY3d[d, start_t3 : start_t3 + size], dC[start_t3 : start_t3 + size], G[i, d, start_t3 : start_t3 + size], C[i, d, start_t3 : start_t3 + size], C[i, d, start_t2 : start_t2 + size], ) # Backprop hidden-to-hidden w.r.t. hidden. dY3d[d, start_t2 : start_t2 + size] += dGt3 @ Wh # Update iteration variables dC[start_t2 : start_t2 + size] = dCt2 start_t3 = start_t2 end_t3 = end_t2 # Backprop input-to-hidden w.r.t. weights. dWx += dG.T @ X # Backprop hidden-to-hidden w.r.t. weights. dWh += dG.T @ Y[i, d] # Backprop bias d_bias += dG.sum(axis=0) # Backprop input-to-hidden w.r.t. input dX += dG @ Wx dY = dX assert dX.shape[1] == X.shape[1] grad_parts = [] for layer_grads in all_layer_grads: for dir_grads, _ in layer_grads: grad_parts.append(_untranspose_unsplit_weights(dir_grads)) return dX, xp.concatenate(grad_parts) def _split_weights(params: Floats1d, i: int, nO: int, nI: int, params_i: int): Wx_size = 4 * nO * nI bx_size = 4 * nO Wh_size = 4 * nO * nO bh_size = 4 * nO Wx = params[params_i : params_i + Wx_size].reshape((4 * nO, nI)) params_i += Wx_size bx = params[params_i : params_i + bx_size].reshape((4 * nO,)) params_i += bx_size Wh = params[params_i : params_i + Wh_size].reshape((4 * nO, nO)) params_i += Wh_size bh = params[params_i : params_i + bh_size].reshape((4 * nO,)) params_i += bh_size return ((Wx, bx), (Wh, bh)), params_i def _transpose_weights(params): # Transpose the parameters so that the gates are the last dimension. This # makes it easier to fuse. (Wx, bx), (Wh, bh) = params xp = get_array_module(Wx) Wx = Wx.reshape((4, -1, Wx.shape[-1])) Wx = Wx.transpose((1, 0, 2)).reshape((-1, Wx.shape[-1])) bx = bx.reshape((4, -1)).transpose((1, 0)).reshape((-1,)) Wh = Wh.reshape((4, -1, Wh.shape[-1])) Wh = Wh.transpose((1, 0, 2)).reshape((-1, Wh.shape[-1])) bh = bh.reshape((4, -1)).transpose((1, 0)).reshape((-1,)) ascontig = xp.ascontiguousarray Wx = ascontig(Wx) Wh = ascontig(Wh) bias = ascontig(bx) + bh return Wx, Wh, bias def _untranspose_unsplit_weights(params): Wx, Wh, bias = params xp = get_array_module(Wx) nO = Wh.shape[1] nI = Wx.shape[1] Wx = Wx.reshape((-1, 4, nI)).transpose((1, 0, 2)).reshape((-1, nI)) Wh = Wh.reshape((-1, 4, nO)).transpose((1, 0, 2)).reshape((-1, nO)) bias = bias.reshape((-1, 4)).transpose((1, 0)).reshape((-1,)) zeros = xp.zeros(bias.shape, dtype="f") return xp.concatenate((Wx.ravel(), bias, Wh.ravel(), zeros)) def backprop_lstm_gates( dYt3: Floats2d, dCt3: Floats2d, Gt3: Floats2d, Ct3: Floats2d, Ct2: Floats2d ) -> Tuple[Floats2d, Floats2d]: # See above for notation. Step numbering refers to forward_lstm_gates xp = get_array_module(dYt3) hf, hi, ho, hc = xp.split(Gt3, 4, axis=-1) assert hf.shape[0] == hi.shape[0] == ho.shape[0] == hc.shape[0] assert hf.shape[0] == dYt3.shape[0] == dCt3.shape[0] == Ct3.shape[0] == Ct2.shape[0] tanhCt3 = xp.tanh(Ct3) # 3b: Yt3 = tanhCt3 * ho d_ho = dYt3 * tanhCt3 d_tanhCt3 = dYt3 * ho # 3a: tanhCt3 = tanh(Ct3) dCt3 += d_tanhCt3 * dtanh(tanhCt3) # 2b: Ct3 += hi * hc d_hi = dCt3 * hc d_hc = dCt3 * hi # 2a: Ct3 = hf * Ct2 d_hf = dCt3 * Ct2 dCt2 = dCt3 * hf d_At3_hc = d_hc * dtanh(hc) # 1d d_At3_ho = d_ho * dsigmoid(ho) # 1c d_At3_hi = d_hi * dsigmoid(hi) # 1b d_At3_hf = d_hf * dsigmoid(hf) # 1a dAt3 = xp.concatenate((d_At3_hf, d_At3_hi, d_At3_ho, d_At3_hc), axis=-1) return dAt3, dCt2 def sigmoid(X, out=None): xp = get_array_module(X) # To prevent overflows and help with regularization/numerical stability X = xp.clip(X, -20.0, 20.0) return 1.0 / (1.0 + xp.exp(-X)) def dsigmoid(Y: ArrayT) -> ArrayT: return Y * (1.0 - Y) def dtanh(Y: ArrayT) -> ArrayT: return 1 - Y**2 def gaussian_cdf(ops: Ops, X: FloatsXdT) -> FloatsXdT: """Gaussian CDF for distribution with mean 0 and stdev 1.""" return 0.5 * (1.0 + ops.erf(INV_SQRT2 * X)) def gaussian_pdf(ops: Ops, X: FloatsXdT) -> FloatsXdT: """Gaussian PDF for distribution with mean 0 and stdev 1.""" return INV_SQRT_2PI * ops.xp.exp(-0.5 * X * X) def _check_compatible_shape(u: FloatsXd, v: FloatsXd): if u.shape != v.shape: msg = f"arrays have incompatible shapes: {u.shape} and {v.shape}" raise ValueError(msg) thinc-release-v9.1.1/thinc/compat.py000066400000000000000000000063071467064331700174160ustar00rootroot00000000000000import platform import warnings from packaging.version import Version try: # pragma: no cover import cupy import cupy.cublas import cupyx has_cupy = True cublas = cupy.cublas cupy_version = Version(cupy.__version__) try: cupy.cuda.runtime.getDeviceCount() has_cupy_gpu = True except cupy.cuda.runtime.CUDARuntimeError: has_cupy_gpu = False if cupy_version.major >= 10: # fromDlpack was deprecated in v10.0.0. cupy_from_dlpack = cupy.from_dlpack else: cupy_from_dlpack = cupy.fromDlpack except (ImportError, AttributeError): cublas = None cupy = None cupyx = None cupy_version = Version("0.0.0") has_cupy = False cupy_from_dlpack = None has_cupy_gpu = False try: # pragma: no cover import torch import torch.utils.dlpack has_torch = True has_torch_cuda_gpu = torch.cuda.device_count() != 0 has_torch_mps = hasattr(torch.backends, "mps") and torch.backends.mps.is_built() has_torch_mps_gpu = has_torch_mps and torch.backends.mps.is_available() has_torch_gpu = has_torch_cuda_gpu torch_version = Version(str(torch.__version__)) has_torch_amp = ( torch_version >= Version("1.9.0") and not torch.cuda.amp.common.amp_definitely_not_available() ) except ImportError: # pragma: no cover torch = None # type: ignore has_torch = False has_torch_cuda_gpu = False has_torch_gpu = False has_torch_mps = False has_torch_mps_gpu = False has_torch_amp = False torch_version = Version("0.0.0") def enable_tensorflow(): warn_msg = ( "Built-in TensorFlow support will be removed in Thinc v9. If you need " "TensorFlow support in the future, you can transition to using a " "custom copy of the current TensorFlowWrapper in your package or " "project." ) warnings.warn(warn_msg, DeprecationWarning) global tensorflow, has_tensorflow, has_tensorflow_gpu import tensorflow import tensorflow.experimental.dlpack has_tensorflow = True has_tensorflow_gpu = len(tensorflow.config.get_visible_devices("GPU")) > 0 tensorflow = None has_tensorflow = False has_tensorflow_gpu = False def enable_mxnet(): warn_msg = ( "Built-in MXNet support will be removed in Thinc v9. If you need " "MXNet support in the future, you can transition to using a " "custom copy of the current MXNetWrapper in your package or " "project." ) warnings.warn(warn_msg, DeprecationWarning) global mxnet, has_mxnet import mxnet has_mxnet = True mxnet = None has_mxnet = False try: import h5py except ImportError: # pragma: no cover h5py = None try: # pragma: no cover import os_signpost has_os_signpost = True except ImportError: os_signpost = None has_os_signpost = False try: # pragma: no cover import blis has_blis = True except ImportError: blis = None has_blis = False # AppleOps is available unconditionally on macOS. has_apple_ops = platform.system() == "Darwin" has_gpu = has_cupy_gpu or has_torch_mps_gpu __all__ = [ "cupy", "cupyx", "torch", "tensorflow", "mxnet", "h5py", "os_signpost", ] thinc-release-v9.1.1/thinc/config.py000066400000000000000000000024011467064331700173670ustar00rootroot00000000000000import catalogue import confection from confection import VARIABLE_RE, Config, ConfigValidationError, Promise from .types import Decorator class registry(confection.registry): # fmt: off optimizers: Decorator = catalogue.create("thinc", "optimizers", entry_points=True) schedules: Decorator = catalogue.create("thinc", "schedules", entry_points=True) layers: Decorator = catalogue.create("thinc", "layers", entry_points=True) losses: Decorator = catalogue.create("thinc", "losses", entry_points=True) initializers: Decorator = catalogue.create("thinc", "initializers", entry_points=True) datasets: Decorator = catalogue.create("thinc", "datasets", entry_points=True) ops: Decorator = catalogue.create("thinc", "ops", entry_points=True) # fmt: on @classmethod def create(cls, registry_name: str, entry_points: bool = False) -> None: """Create a new custom registry.""" if hasattr(cls, registry_name): raise ValueError(f"Registry '{registry_name}' already exists") reg: Decorator = catalogue.create( "thinc", registry_name, entry_points=entry_points ) setattr(cls, registry_name, reg) __all__ = ["Config", "registry", "ConfigValidationError", "Promise", "VARIABLE_RE"] thinc-release-v9.1.1/thinc/initializers.py000066400000000000000000000073721467064331700206440ustar00rootroot00000000000000from typing import Callable, cast import numpy from .backends import Ops from .config import registry from .types import FloatsXd, Shape from .util import partial # TODO: Harmonize naming with Keras, and fill in missing entries # https://keras.io/initializers/ We should also have He normal/uniform # and probably lecun normal/uniform. # Initialize via numpy, before copying to ops. This makes it easier to work with # the different backends, because the backend won't affect the randomization. def lecun_normal_init(ops: Ops, shape: Shape) -> FloatsXd: scale = numpy.sqrt(1.0 / shape[1]) return ops.asarray_f(cast(FloatsXd, numpy.random.normal(0, scale, shape))) @registry.initializers("lecun_normal_init.v1") def configure_lecun_normal_init() -> Callable[[Shape], FloatsXd]: return partial(lecun_normal_init) def he_normal_init(ops: Ops, shape: Shape) -> FloatsXd: scale = numpy.sqrt(2.0 / shape[1]) return ops.asarray_f(cast(FloatsXd, numpy.random.normal(0, scale, shape))) @registry.initializers("he_normal_init.v1") def configure_he_normal_init() -> Callable[[Shape], FloatsXd]: return partial(he_normal_init) def glorot_normal_init(ops: Ops, shape: Shape) -> FloatsXd: scale = numpy.sqrt(2.0 / (shape[1] + shape[0])) return ops.asarray_f(cast(FloatsXd, numpy.random.normal(0, scale, shape))) @registry.initializers("glorot_normal_init.v1") def configure_glorot_normal_init() -> Callable[[Shape], FloatsXd]: return partial(glorot_normal_init) def he_uniform_init(ops: Ops, shape: Shape) -> FloatsXd: scale = numpy.sqrt(6.0 / shape[1]) return ops.asarray_f(cast(FloatsXd, numpy.random.uniform(-scale, scale, shape))) @registry.initializers("he_uniform_init.v1") def configure_he_uniform_init() -> Callable[[Shape], FloatsXd]: return partial(he_uniform_init) def lecun_uniform_init(ops: Ops, shape: Shape) -> FloatsXd: scale = numpy.sqrt(3.0 / shape[1]) return ops.asarray_f(cast(FloatsXd, numpy.random.uniform(-scale, scale, shape))) @registry.initializers("lecun_uniform_init.v1") def configure_lecun_uniform_init() -> Callable[[Shape], FloatsXd]: return partial(lecun_uniform_init) def glorot_uniform_init(ops: Ops, shape: Shape) -> FloatsXd: scale = numpy.sqrt(6.0 / (shape[0] + shape[1])) return ops.asarray_f(cast(FloatsXd, numpy.random.uniform(-scale, scale, shape))) @registry.initializers("glorot_uniform_init.v1") def configure_glorot_uniform_init() -> Callable[[Shape], FloatsXd]: return partial(glorot_uniform_init) def zero_init(ops: Ops, shape: Shape) -> FloatsXd: return ops.alloc_f(shape) @registry.initializers("zero_init.v1") def configure_zero_init() -> Callable[[FloatsXd], FloatsXd]: return partial(zero_init) def uniform_init( ops: Ops, shape: Shape, *, lo: float = -0.1, hi: float = 0.1 ) -> FloatsXd: values = numpy.random.uniform(lo, hi, shape) return ops.asarray_f(cast(FloatsXd, values.astype("float32"))) @registry.initializers("uniform_init.v1") def configure_uniform_init( *, lo: float = -0.1, hi: float = 0.1 ) -> Callable[[FloatsXd], FloatsXd]: return partial(uniform_init, lo=lo, hi=hi) def normal_init(ops: Ops, shape: Shape, *, mean: float = 0) -> FloatsXd: size = int(ops.xp.prod(ops.xp.asarray(shape))) inits = cast(FloatsXd, numpy.random.normal(scale=mean, size=size).astype("float32")) inits = ops.reshape_f(inits, shape) return ops.asarray_f(inits) @registry.initializers("normal_init.v1") def configure_normal_init(*, mean: float = 0) -> Callable[[FloatsXd], FloatsXd]: return partial(normal_init, mean=mean) __all__ = [ "normal_init", "uniform_init", "glorot_uniform_init", "zero_init", "lecun_uniform_init", "he_uniform_init", "glorot_normal_init", "he_normal_init", "lecun_normal_init", ] thinc-release-v9.1.1/thinc/layers/000077500000000000000000000000001467064331700170525ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/layers/__init__.py000066400000000000000000000104541467064331700211670ustar00rootroot00000000000000# Weights layers # Combinators from .add import add # Array manipulation from .array_getitem import array_getitem from .bidirectional import bidirectional from .cauchysimilarity import CauchySimilarity from .chain import chain from .clipped_linear import ClippedLinear, HardSigmoid, HardTanh, ReluK from .clone import clone from .concatenate import concatenate from .dish import Dish from .dropout import Dropout from .embed import Embed from .expand_window import expand_window from .gelu import Gelu from .hard_swish import HardSwish from .hard_swish_mobilenet import HardSwishMobilenet from .hashembed import HashEmbed from .layernorm import LayerNorm from .linear import Linear # Data-type transfers from .list2array import list2array from .list2padded import list2padded from .list2ragged import list2ragged from .logistic import Logistic from .lstm import LSTM, PyTorchLSTM from .map_list import map_list from .maxout import Maxout from .mish import Mish from .multisoftmax import MultiSoftmax from .mxnetwrapper import MXNetWrapper from .noop import noop from .padded2list import padded2list from .parametricattention import ParametricAttention from .parametricattention_v2 import ParametricAttention_v2 from .premap_ids import premap_ids from .pytorchwrapper import ( PyTorchRNNWrapper, PyTorchWrapper, PyTorchWrapper_v2, PyTorchWrapper_v3, ) from .ragged2list import ragged2list # Pooling from .reduce_first import reduce_first from .reduce_last import reduce_last from .reduce_max import reduce_max from .reduce_mean import reduce_mean from .reduce_sum import reduce_sum from .relu import Relu from .remap_ids import remap_ids, remap_ids_v2 from .residual import residual from .resizable import resizable from .siamese import siamese from .sigmoid import Sigmoid from .sigmoid_activation import sigmoid_activation from .softmax import Softmax, Softmax_v2 from .softmax_activation import softmax_activation from .sparselinear import SparseLinear, SparseLinear_v2 from .strings2arrays import strings2arrays from .swish import Swish from .tensorflowwrapper import TensorFlowWrapper, keras_subclass from .torchscriptwrapper import TorchScriptWrapper_v1, pytorch_to_torchscript_wrapper from .tuplify import tuplify from .uniqued import uniqued from .with_array import with_array from .with_array2d import with_array2d from .with_cpu import with_cpu from .with_debug import with_debug from .with_flatten import with_flatten from .with_flatten_v2 import with_flatten_v2 from .with_getitem import with_getitem from .with_list import with_list from .with_nvtx_range import with_nvtx_range from .with_padded import with_padded from .with_ragged import with_ragged from .with_reshape import with_reshape from .with_signpost_interval import with_signpost_interval # fmt: off __all__ = [ "CauchySimilarity", "Linear", "Dropout", "Embed", "expand_window", "HashEmbed", "LayerNorm", "LSTM", "Maxout", "Mish", "MultiSoftmax", "ParametricAttention", "ParametricAttention_v2", "PyTorchLSTM", "PyTorchWrapper", "PyTorchWrapper_v2", "PyTorchWrapper_v3", "PyTorchRNNWrapper", "Relu", "sigmoid_activation", "Sigmoid", "softmax_activation", "Softmax", "Softmax_v2", "SparseLinear", "SparseLinear_v2", "TensorFlowWrapper", "TorchScriptWrapper_v1", "add", "bidirectional", "chain", "clone", "concatenate", "noop", "residual", "uniqued", "siamese", "reduce_first", "reduce_last", "reduce_max", "reduce_mean", "reduce_sum", "resizable", "list2array", "list2ragged", "list2padded", "ragged2list", "padded2list", "with_reshape", "with_getitem", "with_array", "with_array2d", "with_cpu", "with_list", "with_ragged", "with_padded", "with_flatten", "with_flatten_v2", "with_debug", "with_nvtx_range", "with_signpost_interval", "remap_ids", "remap_ids_v2", "premap_ids", "softmax_activation", "Logistic", "Sigmoid", "ClippedLinear", "ReluK", "HardTanh", "HardSigmoid", "Dish", "HardSwish", "HardSwishMobilenet", "Swish", "Gelu", "keras_subclass", "MXNetWrapper", "map_list", "strings2arrays", "array_getitem", "tuplify", "pytorch_to_torchscript_wrapper", ] # fmt: on thinc-release-v9.1.1/thinc/layers/add.py000066400000000000000000000043051467064331700201560ustar00rootroot00000000000000from typing import Any, Callable, Dict, Optional, Tuple, TypeVar from ..config import registry from ..model import Model from ..types import ArrayXd, XY_XY_OutT from ..util import get_width InT = TypeVar("InT", bound=Any) OutT = TypeVar("OutT", bound=ArrayXd) @registry.layers("add.v1") def add( layer1: Model[InT, OutT], layer2: Model[InT, OutT], *layers: Model ) -> Model[InT, XY_XY_OutT]: """Compose two or more models `f`, `g`, etc, such that their outputs are added, i.e. `add(f, g)(x)` computes `f(x) + g(x)`. """ layers = (layer1, layer2) + layers if layers[0].name == "add": layers[0].layers.extend(layers[1:]) return layers[0] # only add an nI dimension if each sub-layer has one dims: Dict[str, Optional[int]] = {"nO": None} if all(node.has_dim("nI") in [True, None] for node in layers): dims = {"nO": None, "nI": None} return Model("add", forward, init=init, dims=dims, layers=layers) def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: if not model.layers: return X, lambda dY: dY Y, first_callback = model.layers[0](X, is_train=is_train) callbacks = [] for layer in model.layers[1:]: layer_Y, layer_callback = layer(X, is_train=is_train) Y += layer_Y callbacks.append(layer_callback) def backprop(dY: InT) -> OutT: dX = first_callback(dY) for callback in callbacks: dX += callback(dY) return dX return Y, backprop def init( model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None ) -> None: if X is not None: if model.has_dim("nI") is not False: model.set_dim("nI", get_width(X)) for layer in model.layers: if layer.has_dim("nI") is not False: layer.set_dim("nI", get_width(X)) if Y is not None: if model.has_dim("nO") is not False: model.set_dim("nO", get_width(Y)) for layer in model.layers: if layer.has_dim("nO") is not False: layer.set_dim("nO", get_width(Y)) for layer in model.layers: layer.initialize(X=X, Y=Y) model.set_dim("nO", model.layers[0].get_dim("nO")) thinc-release-v9.1.1/thinc/layers/array_getitem.py000066400000000000000000000030631467064331700222620ustar00rootroot00000000000000from typing import Sequence, Tuple, TypeVar, Union from ..model import Model from ..types import ArrayXd, FloatsXd, IntsXd AxisIndex = Union[int, slice, Sequence[int]] Index = Union[AxisIndex, Tuple[AxisIndex, ...]] ArrayTXd = TypeVar("ArrayTXd", bound=ArrayXd) def array_getitem(index: Index) -> Model[ArrayTXd, ArrayTXd]: """Index into input arrays, and return the subarrays. index: A valid numpy-style index. Multi-dimensional indexing can be performed by passing in a tuple, and slicing can be performed using the slice object. For instance, X[:, :-1] would be (slice(None, None), slice(None, -1)). """ return Model("array-getitem", forward, attrs={"index": index}) def floats_getitem(index: Index) -> Model[FloatsXd, FloatsXd]: """Index into input arrays, and return the subarrays. This delegates to `array_getitem`, but allows type declarations. """ return Model("floats-getitem", forward, attrs={"index": index}) def ints_getitem(index: Index) -> Model[IntsXd, IntsXd]: """Index into input arrays, and return the subarrays. This delegates to `array_getitem`, but allows type declarations. """ return Model("ints-getitem", forward, attrs={"index": index}) def forward(model, X, is_train): index = model.attrs["index"] shape = X.shape dtype = X.dtype def backprop_get_column(dY): dX = model.ops.alloc(shape, dtype=dtype) dX[index] = dY return dX if len(X) == 0: return X, backprop_get_column Y = X[index] return Y, backprop_get_column thinc-release-v9.1.1/thinc/layers/bidirectional.py000066400000000000000000000042171467064331700222400ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..backends import Ops from ..config import registry from ..model import Model from ..types import Padded InT = Padded OutT = Padded @registry.layers("bidirectional.v1") def bidirectional( l2r: Model[InT, OutT], r2l: Optional[Model[InT, OutT]] = None ) -> Model[InT, OutT]: """Stitch two RNN models into a bidirectional layer. Expects squared sequences.""" if r2l is None: r2l = l2r.copy() return Model(f"bi{l2r.name}", forward, layers=[l2r, r2l], init=init) def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: l2r, r2l = model.layers X_rev = _reverse(model.ops, X) l2r_Z, bp_l2r_Z = l2r(X, is_train) r2l_Z, bp_r2l_Z = r2l(X_rev, is_train) Z = _concatenate(model.ops, l2r_Z, r2l_Z) def backprop(dZ: OutT) -> InT: d_l2r_Z, d_r2l_Z = _split(model.ops, dZ) dX_l2r = bp_l2r_Z(d_l2r_Z) dX_r2l = bp_r2l_Z(d_r2l_Z) return _sum(dX_l2r, dX_r2l) return Z, backprop def init( model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None ) -> None: (Y1, Y2) = _split(model.ops, Y) if Y is not None else (None, None) model.layers[0].initialize(X=X, Y=Y1) model.layers[1].initialize(X=X, Y=Y2) def _reverse(ops: Ops, Xp: Padded) -> Padded: return Padded(Xp.data[::1], Xp.size_at_t, Xp.lengths, Xp.indices) def _concatenate(ops: Ops, l2r: Padded, r2l: Padded) -> Padded: return Padded( ops.xp.concatenate((l2r.data, r2l.data), axis=-1), l2r.size_at_t, l2r.lengths, l2r.indices, ) def _split(ops: Ops, Xp: Padded) -> Tuple[Padded, Padded]: half = Xp.data.shape[-1] // 2 # I don't know how to write these ellipsis in the overloads :( X_l2r = Xp.data[cast(Tuple[slice, slice], (..., slice(None, half)))] X_r2l = Xp.data[cast(Tuple[slice, slice], (..., slice(half)))] return ( Padded(X_l2r, Xp.size_at_t, Xp.lengths, Xp.indices), Padded(X_r2l, Xp.size_at_t, Xp.lengths, Xp.indices), ) def _sum(Xp: Padded, Yp: Padded) -> Padded: return Padded(Xp.data + Yp.data, Xp.size_at_t, Xp.lengths, Xp.indices) thinc-release-v9.1.1/thinc/layers/cauchysimilarity.py000066400000000000000000000033141467064331700230100ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..model import Model from ..types import Floats1d, Floats2d from ..util import get_width InT = Tuple[Floats2d, Floats2d] OutT = Floats1d @registry.layers("CauchySimilarity.v1") def CauchySimilarity(nI: Optional[int] = None) -> Model[InT, OutT]: """Compare input vectors according to the Cauchy similarity function proposed by Chen (2013). Primarily used within Siamese neural networks. """ return Model( "cauchy_similarity", forward, init=init, dims={"nI": nI, "nO": 1}, params={"W": None}, ) def forward( model: Model[InT, OutT], X1_X2: InT, is_train: bool ) -> Tuple[OutT, Callable]: X1, X2 = X1_X2 W = cast(Floats2d, model.get_param("W")) diff = X1 - X2 square_diff = diff**2 total = (W * square_diff).sum(axis=1) sim, bp_sim = inverse(total) def backprop(d_sim: OutT) -> InT: d_total = bp_sim(d_sim) d_total = model.ops.reshape2f(d_total, -1, 1) model.inc_grad("W", (d_total * square_diff).sum(axis=0)) d_square_diff = W * d_total d_diff = 2 * d_square_diff * diff return (d_diff, -d_diff) return sim, backprop def init( model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None ) -> None: if X is not None: model.set_dim("nI", get_width(X[0])) # Initialize weights to 1 W = model.ops.alloc1f(model.get_dim("nI")) W += 1 model.set_param("W", W) def inverse(total: OutT) -> Tuple[OutT, Callable]: inv = 1.0 / (1 + total) def backward(d_inverse: OutT) -> OutT: return d_inverse * (-1 / (total + 1) ** 2) return inv, backward thinc-release-v9.1.1/thinc/layers/chain.py000066400000000000000000000065641467064331700205210ustar00rootroot00000000000000from typing import Any, Callable, Dict, List, Optional, Tuple, TypeVar, cast from ..config import registry from ..model import Model from ..types import XY_YZ_OutT from ..util import get_width InT = TypeVar("InT") MidT = TypeVar("MidT") OutT = TypeVar("OutT") # Keep this function so we can provide variable arguments via the config @registry.layers("chain.v1") def chain_no_types(*layer: Model) -> Model: return chain(*layer) def chain( layer1: Model[InT, MidT], layer2: Model[MidT, Any], *layers: Model[Any, Any] ) -> Model[InT, XY_YZ_OutT]: """Compose two models `f` and `g` such that they become layers of a single feed-forward model that computes `g(f(x))`. Also supports chaining more than 2 layers. Note that the type checking for additional layers is carried out by the Thinc Mypy plugin. """ all_layers: List[Model[Any, Any]] = [layer1, layer2] all_layers.extend(layers) dims: Dict[str, Optional[int]] = {"nO": None} # set input dimension only if first layer has one - should be "False" otherwise if all_layers[0].has_dim("nI") is True: dims["nI"] = all_layers[0].get_dim("nI") if all_layers[0].has_dim("nI") is None: dims["nI"] = None # set output dimension according to last layer if all_layers[-1].has_dim("nO") is True: dims["nO"] = all_layers[-1].get_dim("nO") model: Model[InT, XY_YZ_OutT] = Model( ">>".join(layer.name for layer in all_layers), forward, init=init, dims=dims, layers=all_layers, ) return model def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: """Apply the layers of `model` in sequence, feeding the output from one layer into the next. """ callbacks = [] for layer in model.layers: Y, inc_layer_grad = layer(X, is_train=is_train) callbacks.append(inc_layer_grad) X = Y def backprop(dY: OutT) -> InT: for callback in reversed(callbacks): dX = callback(dY) dY = dX return dX return Y, backprop def init( model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None, ) -> None: if X is None and Y is None: for layer in model.layers: layer.initialize() if model.layers[0].has_dim("nI"): model.set_dim("nI", model.layers[0].get_dim("nI")) if model.layers[-1].has_dim("nO"): model.set_dim("nO", model.layers[-1].get_dim("nO")) # Try to set nO on each layer, where available. # Shape inference is tricky, especially for the output. The policy is: # if a layer has an unset nO, we use the final Y (if provided). For other # layers, Y=None. curr_input = X for layer in model.layers: if layer.has_dim("nO") is None: layer.initialize(X=curr_input, Y=Y) else: layer.initialize(X=curr_input) if curr_input is not None: curr_input = layer.predict(curr_input) if model.layers[0].has_dim("nI"): model.set_dim("nI", model.layers[0].get_dim("nI")) if model.has_dim("nO") is None: try: nO = get_width(curr_input) # type: ignore[arg-type] model.set_dim("nO", nO) except ValueError: if model.layers[-1].has_dim("nO"): nO = model.layers[-1].get_dim("nO") model.set_dim("nO", nO) thinc-release-v9.1.1/thinc/layers/clipped_linear.py000066400000000000000000000105371467064331700224040ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..initializers import glorot_uniform_init, zero_init from ..model import Model from ..types import Floats1d, Floats2d from ..util import get_width, partial from .chain import chain from .dropout import Dropout from .layernorm import LayerNorm @registry.layers("ClippedLinear.v1") def ClippedLinear( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, dropout: Optional[float] = None, normalize: bool = False, slope: float = 1.0, offset: float = 0.0, min_val: float = 0.0, max_val: float = 1.0, ) -> Model[Floats2d, Floats2d]: if init_W is None: init_W = glorot_uniform_init if init_b is None: init_b = zero_init model_attrs = { "slope": slope, "offset": offset, "min_val": min_val, "max_val": max_val, } model: Model[Floats2d, Floats2d] = Model( "clipped_linear", forward=forward, init=partial(init, init_W, init_b), dims={"nO": nO, "nI": nI}, params={"W": None, "b": None}, attrs=model_attrs, ) if normalize: model = chain(model, LayerNorm(nI=nO)) if dropout is not None: model = chain(model, cast(Model[Floats2d, Floats2d], Dropout(dropout))) return model def forward( model: Model[Floats2d, Floats2d], X: Floats2d, is_train: bool, ) -> Tuple[Floats2d, Callable]: slope = model.attrs["slope"] offset = model.attrs["offset"] min_val = model.attrs["min_val"] max_val = model.attrs["max_val"] W = cast(Floats2d, model.get_param("W")) b = cast(Floats1d, model.get_param("b")) Y_preact = model.ops.affine(X, W, b) Y = model.ops.clipped_linear(Y_preact, slope, offset, min_val, max_val) def backprop(dY: Floats2d) -> Floats2d: dY = model.ops.backprop_clipped_linear( dY, Y_preact, slope, offset, min_val, max_val, inplace=False ) model.inc_grad("b", dY.sum(axis=0)) model.inc_grad("W", model.ops.gemm(dY, X, trans1=True)) return model.ops.gemm(dY, W) return Y, backprop def init( init_W: Callable, init_b: Callable, model: Model[Floats2d, Floats2d], X: Optional[Floats2d] = None, Y: Optional[Floats2d] = None, ) -> None: if X is not None: model.set_dim("nI", get_width(X)) if Y is not None: model.set_dim("nO", get_width(Y)) model.set_param("W", init_W(model.ops, (model.get_dim("nO"), model.get_dim("nI")))) model.set_param("b", init_b(model.ops, (model.get_dim("nO"),))) @registry.layers("HardSigmoid.v1") def HardSigmoid( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, dropout: Optional[float] = None, normalize: bool = False, ) -> Model[Floats2d, Floats2d]: if init_W is None: init_W = glorot_uniform_init if init_b is None: init_b = zero_init return ClippedLinear( nO=nO, nI=nI, init_W=init_W, dropout=dropout, normalize=normalize, slope=0.2, offset=0.5, ) @registry.layers("HardTanh.v1") def HardTanh( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, dropout: Optional[float] = None, normalize: bool = False, ) -> Model[Floats2d, Floats2d]: if init_W is None: init_W = glorot_uniform_init if init_b is None: init_b = zero_init return ClippedLinear( nO=nO, nI=nI, init_W=init_W, dropout=dropout, normalize=normalize, min_val=-1.0, max_val=1.0, ) @registry.layers("ReluK.v1") def ReluK( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, dropout: Optional[float] = None, normalize: bool = False, k: float = 6.0, ) -> Model[Floats2d, Floats2d]: if init_W is None: init_W = glorot_uniform_init if init_b is None: init_b = zero_init return ClippedLinear( nO=nO, nI=nI, init_W=init_W, dropout=dropout, normalize=normalize, min_val=0.0, max_val=k, ) thinc-release-v9.1.1/thinc/layers/clone.py000066400000000000000000000012101467064331700205160ustar00rootroot00000000000000from typing import List, TypeVar, cast from ..config import registry from ..model import Model from .chain import chain from .noop import noop InT = TypeVar("InT") OutT = TypeVar("OutT") @registry.layers("clone.v1") def clone(orig: Model[InT, OutT], n: int) -> Model[InT, OutT]: """Construct `n` copies of a layer, with distinct weights. i.e. `clone(f, 3)(x)` computes f(f'(f''(x))). """ if n == 0: return cast(Model[InT, OutT], noop()) elif n == 1: return orig layers: List[Model] = [orig] for i in range(n - 1): layers.append(orig.copy()) return cast(Model[InT, OutT], chain(*layers)) thinc-release-v9.1.1/thinc/layers/concatenate.py000066400000000000000000000121041467064331700217060ustar00rootroot00000000000000from typing import ( Any, Callable, Dict, List, Optional, Sequence, Tuple, TypeVar, Union, cast, ) from ..backends import NumpyOps from ..config import registry from ..model import Model from ..types import Array2d, Ragged, XY_XY_OutT from ..util import get_width from .noop import noop NUMPY_OPS = NumpyOps() InT = TypeVar("InT", bound=Any) OutT = TypeVar("OutT", bound=Union[Array2d, Sequence[Array2d], Ragged]) @registry.layers("concatenate.v1") def concatenate(*layers: Model) -> Model[InT, XY_XY_OutT]: """Compose two or more models `f`, `g`, etc, such that their outputs are concatenated, i.e. `concatenate(f, g)(x)` computes `hstack(f(x), g(x))`. Also supports chaining more than 2 layers. """ if not layers: return cast(Model[InT, XY_XY_OutT], noop()) elif len(layers) == 1: return layers[0] elif layers[0]._func is forward: layers[0].layers.extend(layers[1:]) return layers[0] # only add an nI dimension if each sub-layer has one dims: Dict[str, Optional[int]] = {"nO": None} if all(node.has_dim("nI") in [True, None] for node in layers): dims = {"nO": None, "nI": None} return Model( "|".join(layer.name for layer in layers), forward, init=init, dims=dims, layers=layers, ) def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: Ys, callbacks = zip(*[layer(X, is_train=is_train) for layer in model.layers]) if isinstance(Ys[0], list): data_l, backprop = _list_forward(model, X, Ys, callbacks, is_train) return cast(OutT, data_l), backprop elif isinstance(Ys[0], Ragged): data_r, backprop = _ragged_forward(model, X, Ys, callbacks, is_train) return cast(OutT, data_r), backprop else: data_a, backprop = _array_forward(model, X, Ys, callbacks, is_train) return cast(OutT, data_a), backprop def _array_forward( model: Model[InT, OutT], X, Ys: List, callbacks, is_train: bool ) -> Tuple[Array2d, Callable]: widths = [Y.shape[1] for Y in Ys] output = model.ops.xp.hstack(Ys) def backprop(d_output: Array2d) -> InT: dY = model.ops.as_contig(d_output[:, : widths[0]]) dX = callbacks[0](dY) start = widths[0] add_gradients = hasattr(dX, "__add__") or hasattr(dX, "__iadd__") add_gradients_data = hasattr(dX, "data") and ( hasattr(dX.data, "__add__") or hasattr(dX.data, "__iadd__") ) for bwd, width in zip(callbacks[1:], widths[1:]): dY = model.ops.as_contig(d_output[:, start : start + width]) gradient = bwd(dY) if add_gradients: dX += gradient elif add_gradients_data: dX.data += gradient.data start += width return dX return output, backprop def _ragged_forward( model: Model[InT, OutT], X, Ys: List, callbacks, is_train: bool ) -> Tuple[Ragged, Callable]: widths = [Y.dataXd.shape[1] for Y in Ys] output = Ragged(model.ops.xp.hstack([y.data for y in Ys]), Ys[0].lengths) def backprop(d_output: Ragged) -> InT: d_array = d_output.data dY = Ragged(model.ops.as_contig(d_array[:, : widths[0]]), d_output.lengths) dX = callbacks[0](dY) start = widths[0] for bwd, width in zip(callbacks[1:], widths[1:]): dY = Ragged( model.ops.as_contig(d_array[:, start : start + width]), d_output.lengths ) dX += bwd(dY) start += width return dX return output, backprop def _list_forward( model: Model[InT, OutT], X, Ys: List, callbacks, is_train: bool ) -> Tuple[Sequence[Array2d], Callable]: def backprop(d_output: Sequence[Array2d]) -> InT: d_out_array = model.ops.xp.concatenate(d_output, axis=0) dY = model.ops.as_contig(d_out_array[:, : widths[0]]) # We want to generalize unflatten later. dY = model.ops.unflatten(dY, lengths) dX = callbacks[0](dY) start = widths[0] for bwd, width in zip(callbacks[1:], widths[1:]): dY = model.ops.as_contig(d_out_array[:, start : start + width]) dY = model.ops.unflatten(dY, lengths) dX += bwd(dY) start += width return dX lengths = NUMPY_OPS.asarray1i([len(x) for x in X]) Ys = [model.ops.xp.concatenate(Y, axis=0) for Y in Ys] widths = [Y.shape[1] for Y in Ys] out_array = model.ops.xp.hstack(Ys) return model.ops.unflatten(out_array, lengths), backprop def init( model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None ) -> None: if X is not None: if model.has_dim("nI") is not False: model.set_dim("nI", get_width(X)) for layer in model.layers: if layer.has_dim("nI") is not False: layer.set_dim("nI", get_width(X)) for layer in model.layers: layer.initialize(X=X, Y=Y) if all([layer.has_dim("nO") for layer in model.layers]): model.set_dim("nO", sum(layer.get_dim("nO") for layer in model.layers)) thinc-release-v9.1.1/thinc/layers/dish.py000066400000000000000000000041011467064331700203470ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..initializers import he_normal_init, zero_init from ..model import Model from ..types import Floats1d, Floats2d from ..util import get_width, partial from .chain import chain from .dropout import Dropout from .layernorm import LayerNorm @registry.layers("Dish.v1") def Dish( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, dropout: Optional[float] = None, normalize: bool = False, ) -> Model[Floats2d, Floats2d]: if init_W is None: init_W = he_normal_init if init_b is None: init_b = zero_init model: Model[Floats2d, Floats2d] = Model( "dish", forward, init=partial(init, init_W, init_b), dims={"nO": nO, "nI": nI}, params={"W": None, "b": None}, ) if normalize: model = chain(model, LayerNorm(nI=nO)) if dropout is not None: model = chain(model, cast(Model[Floats2d, Floats2d], Dropout(dropout))) return model def forward( model: Model[Floats2d, Floats2d], X: Floats2d, is_train: bool ) -> Tuple[Floats2d, Callable]: W = cast(Floats2d, model.get_param("W")) b = cast(Floats1d, model.get_param("b")) Y_preact = model.ops.affine(X, W, b) Y = model.ops.dish(Y_preact) def backprop(dY: Floats2d) -> Floats2d: dY = model.ops.backprop_dish(dY, X, inplace=False) model.inc_grad("b", dY.sum(axis=0)) model.inc_grad("W", model.ops.gemm(dY, X, trans1=True)) return model.ops.gemm(dY, W) return Y, backprop def init( init_W: Callable, init_b: Callable, model: Model[Floats2d, Floats2d], X: Optional[Floats2d] = None, Y: Optional[Floats2d] = None, ) -> None: if X is not None: model.set_dim("nI", get_width(X)) if Y is not None: model.set_dim("nO", get_width(Y)) model.set_param("W", init_W(model.ops, (model.get_dim("nO"), model.get_dim("nI")))) model.set_param("b", init_b(model.ops, (model.get_dim("nO"),))) thinc-release-v9.1.1/thinc/layers/dropout.py000066400000000000000000000056131467064331700211250ustar00rootroot00000000000000from typing import Callable, List, Sequence, Tuple, TypeVar, Union, cast from ..config import registry from ..model import Model from ..types import ArrayXd, Padded, Ragged InT = TypeVar("InT", bound=Union[ArrayXd, Sequence[ArrayXd], Ragged, Padded]) @registry.layers("Dropout.v1") def Dropout(rate: float = 0.0) -> Model[InT, InT]: """Help prevent overfitting by adding a random distortion to the input data during training. Specifically, cells of the input are zeroed with probability determined by the `rate` argument. """ return Model("dropout", forward, attrs={"dropout_rate": rate, "is_enabled": True}) def forward(model: Model[InT, InT], X: InT, is_train: bool) -> Tuple[InT, Callable]: rate = model.attrs["dropout_rate"] is_enabled = model.attrs["is_enabled"] and is_train if rate == 0 or not is_enabled: return X, lambda dY: dY elif isinstance(X, Ragged): data_r, backprop = _dropout_ragged(model, X, is_train) return cast(InT, data_r), backprop elif isinstance(X, Padded): data_p, backprop = _dropout_padded(model, X, is_train) return cast(InT, data_p), backprop elif isinstance(X, Sequence): data_l, backprop = _dropout_lists(model, X, is_train) return cast(InT, data_l), backprop else: data_a, backprop = _dropout_array(model, cast(ArrayXd, X), is_train) return cast(InT, data_a), backprop def _dropout_array( model: Model[InT, InT], X: ArrayXd, is_train: bool ) -> Tuple[ArrayXd, Callable]: rate = model.attrs["dropout_rate"] mask = model.ops.get_dropout_mask(X.shape, rate) def backprop(dY: ArrayXd) -> ArrayXd: return dY * mask return cast(ArrayXd, X * mask), backprop def _dropout_padded( model: Model[InT, InT], Xp: Padded, is_train: bool ) -> Tuple[Padded, Callable]: X = Xp.data mask = model.ops.get_dropout_mask(X.shape, model.attrs["dropout_rate"]) Y = X * mask def backprop(dYp: Padded) -> Padded: return Padded(dYp.data * mask, dYp.size_at_t, dYp.lengths, dYp.indices) return Padded(Y, Xp.size_at_t, Xp.lengths, Xp.indices), backprop def _dropout_ragged( model: Model[InT, InT], Xr: Ragged, is_train: bool ) -> Tuple[Ragged, Callable]: X = Xr.data lengths = Xr.lengths mask = model.ops.get_dropout_mask(X.shape, model.attrs["dropout_rate"]) Y = X * mask def backprop(dYr: Ragged) -> Ragged: return Ragged(dYr.data * mask, dYr.lengths) return Ragged(Y, lengths), backprop def _dropout_lists( model: Model[InT, InT], Xs: Sequence[ArrayXd], is_train: bool ) -> Tuple[Sequence[ArrayXd], Callable]: rate = model.attrs["dropout_rate"] masks = [model.ops.get_dropout_mask(X.shape, rate) for X in Xs] Ys = [X * mask for X, mask in zip(Xs, masks)] def backprop(dYs: List[ArrayXd]) -> List[ArrayXd]: return [dY * mask for dY, mask in zip(dYs, masks)] return Ys, backprop thinc-release-v9.1.1/thinc/layers/embed.py000066400000000000000000000052021467064331700204770ustar00rootroot00000000000000from typing import Callable, Dict, Optional, Tuple, TypeVar, Union, cast from ..config import registry from ..initializers import uniform_init from ..model import Model from ..types import Floats1d, Floats2d, Ints1d, Ints2d from ..util import get_width, partial from .array_getitem import ints_getitem from .chain import chain InT = TypeVar("InT", bound=Union[Ints1d, Ints2d]) OutT = Floats2d @registry.layers("Embed.v1") def Embed( nO: Optional[int] = None, nV: Optional[int] = None, *, column: Optional[int] = None, initializer: Optional[Callable] = None, dropout: Optional[float] = None ) -> Model[InT, OutT]: """Map integers to vectors, using a fixed-size lookup table.""" attrs: Dict[str, Union[None, int, float]] = {} if initializer is None: initializer = uniform_init if dropout is not None: attrs["dropout_rate"] = dropout model: Model = Model( "embed", forward, init=partial(init, initializer), attrs=attrs, dims={"nO": nO, "nV": nV}, params={"E": None}, ) if column is not None: # This is equivalent to array[:, column]. What you're actually doing # there is passing in a tuple: array[(:, column)], except in the context # of array indexing, the ":" creates an object slice(0, None). # So array[:, column] is array.__getitem__(slice(0), column). model = chain(ints_getitem((slice(0, None), column)), model) model.attrs["column"] = column return cast(Model[InT, OutT], model) def forward( model: Model[Ints1d, OutT], ids: Ints1d, is_train: bool ) -> Tuple[OutT, Callable]: vectors = cast(Floats2d, model.get_param("E")) nO = vectors.shape[1] nN = ids.shape[0] dropout: Optional[float] = model.attrs.get("dropout_rate") output = vectors[ids] drop_mask = None if is_train: drop_mask = cast(Floats1d, model.ops.get_dropout_mask((nO,), dropout)) if drop_mask is not None: output *= drop_mask def backprop(d_output: OutT) -> Ints1d: if drop_mask is not None: d_output *= drop_mask d_vectors = model.ops.alloc2f(*vectors.shape) model.ops.scatter_add(d_vectors, ids, d_output) model.inc_grad("E", d_vectors) dX = model.ops.alloc1i(nN) return dX return output, backprop def init( initializer: Callable, model: Model[Ints1d, OutT], X: Optional[Ints1d] = None, Y: Optional[OutT] = None, ) -> None: if Y is not None: model.set_dim("nO", get_width(Y)) shape = (model.get_dim("nV"), model.get_dim("nO")) model.set_param("E", initializer(model.ops, shape)) thinc-release-v9.1.1/thinc/layers/expand_window.py000066400000000000000000000031501467064331700222710ustar00rootroot00000000000000from typing import Callable, Tuple, TypeVar, Union, cast from ..config import registry from ..model import Model from ..types import Floats2d, Ragged InT = TypeVar("InT", Floats2d, Ragged) @registry.layers("expand_window.v1") def expand_window(window_size: int = 1) -> Model[InT, InT]: """For each vector in an input, construct an output vector that contains the input and a window of surrounding vectors. This is one step in a convolution. """ return Model("expand_window", forward, attrs={"window_size": window_size}) def forward(model: Model[InT, InT], X: InT, is_train: bool) -> Tuple[InT, Callable]: if isinstance(X, Ragged): return _expand_window_ragged(model, X) else: return _expand_window_floats(model, X) def _expand_window_floats( model: Model[InT, InT], X: Floats2d ) -> Tuple[Floats2d, Callable]: nW = model.attrs["window_size"] if len(X) > 0: Y = model.ops.seq2col(X, nW) else: assert len(X) == 0 Y = model.ops.tile(X, (nW * 2) + 1) def backprop(dY: Floats2d) -> Floats2d: return model.ops.backprop_seq2col(dY, nW) return Y, backprop def _expand_window_ragged( model: Model[InT, InT], Xr: Ragged ) -> Tuple[Ragged, Callable]: nW = model.attrs["window_size"] Y = Ragged( model.ops.seq2col(cast(Floats2d, Xr.data), nW, lengths=Xr.lengths), Xr.lengths ) def backprop(dYr: Ragged) -> Ragged: return Ragged( model.ops.backprop_seq2col( cast(Floats2d, dYr.data), nW, lengths=Xr.lengths ), Xr.lengths, ) return Y, backprop thinc-release-v9.1.1/thinc/layers/gelu.py000066400000000000000000000041101467064331700203540ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..initializers import he_normal_init, zero_init from ..model import Model from ..types import Floats1d, Floats2d from ..util import get_width, partial from .chain import chain from .dropout import Dropout from .layernorm import LayerNorm @registry.layers("Gelu.v1") def Gelu( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, dropout: Optional[float] = None, normalize: bool = False, ) -> Model[Floats2d, Floats2d]: if init_W is None: init_W = he_normal_init if init_b is None: init_b = zero_init model: Model[Floats2d, Floats2d] = Model( "gelu", forward, init=partial(init, init_W, init_b), dims={"nO": nO, "nI": nI}, params={"W": None, "b": None}, ) if normalize: model = chain(model, LayerNorm(nI=nO)) if dropout is not None: model = chain(model, cast(Model[Floats2d, Floats2d], Dropout(dropout))) return model def forward( model: Model[Floats2d, Floats2d], X: Floats2d, is_train: bool ) -> Tuple[Floats2d, Callable]: W = cast(Floats2d, model.get_param("W")) b = cast(Floats1d, model.get_param("b")) Y_preact = model.ops.affine(X, W, b) Y = model.ops.gelu(Y_preact) def backprop(dY: Floats2d) -> Floats2d: dY = model.ops.backprop_gelu(dY, Y_preact, inplace=False) model.inc_grad("b", dY.sum(axis=0)) model.inc_grad("W", model.ops.gemm(dY, X, trans1=True)) return model.ops.gemm(dY, W) return Y, backprop def init( init_W: Callable, init_b: Callable, model: Model[Floats2d, Floats2d], X: Optional[Floats2d] = None, Y: Optional[Floats2d] = None, ) -> None: if X is not None: model.set_dim("nI", get_width(X)) if Y is not None: model.set_dim("nO", get_width(Y)) model.set_param("W", init_W(model.ops, (model.get_dim("nO"), model.get_dim("nI")))) model.set_param("b", init_b(model.ops, (model.get_dim("nO"),))) thinc-release-v9.1.1/thinc/layers/hard_swish.py000066400000000000000000000041431467064331700215610ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..initializers import he_normal_init, zero_init from ..model import Model from ..types import Floats1d, Floats2d from ..util import get_width, partial from .chain import chain from .dropout import Dropout from .layernorm import LayerNorm @registry.layers("HardSwish.v1") def HardSwish( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, dropout: Optional[float] = None, normalize: bool = False, ) -> Model[Floats2d, Floats2d]: if init_W is None: init_W = he_normal_init if init_b is None: init_b = zero_init model: Model[Floats2d, Floats2d] = Model( "hardswish", forward, init=partial(init, init_W, init_b), dims={"nO": nO, "nI": nI}, params={"W": None, "b": None}, ) if normalize: model = chain(model, LayerNorm(nI=nO)) if dropout is not None: model = chain(model, cast(Model[Floats2d, Floats2d], Dropout(dropout))) return model def forward( model: Model[Floats2d, Floats2d], X: Floats2d, is_train: bool ) -> Tuple[Floats2d, Callable]: W = cast(Floats2d, model.get_param("W")) b = cast(Floats1d, model.get_param("b")) Y_preact = model.ops.affine(X, W, b) Y = model.ops.hard_swish(Y_preact) def backprop(dY: Floats2d) -> Floats2d: dY = model.ops.backprop_hard_swish(dY, Y_preact, inplace=False) model.inc_grad("b", dY.sum(axis=0)) model.inc_grad("W", model.ops.gemm(dY, X, trans1=True)) return model.ops.gemm(dY, W) return Y, backprop def init( init_W: Callable, init_b: Callable, model: Model[Floats2d, Floats2d], X: Optional[Floats2d] = None, Y: Optional[Floats2d] = None, ) -> None: if X is not None: model.set_dim("nI", get_width(X)) if Y is not None: model.set_dim("nO", get_width(Y)) model.set_param("W", init_W(model.ops, (model.get_dim("nO"), model.get_dim("nI")))) model.set_param("b", init_b(model.ops, (model.get_dim("nO"),))) thinc-release-v9.1.1/thinc/layers/hard_swish_mobilenet.py000066400000000000000000000042221467064331700236150ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..initializers import he_normal_init, zero_init from ..model import Model from ..types import Floats1d, Floats2d from ..util import get_width, partial from .chain import chain from .dropout import Dropout from .layernorm import LayerNorm @registry.layers("HardSwishMobilenet.v1") def HardSwishMobilenet( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, dropout: Optional[float] = None, normalize: bool = False, ) -> Model[Floats2d, Floats2d]: if init_W is None: init_W = he_normal_init if init_b is None: init_b = zero_init model: Model[Floats2d, Floats2d] = Model( "hardswishmobilenet", forward, init=partial(init, init_W, init_b), dims={"nO": nO, "nI": nI}, params={"W": None, "b": None}, ) if normalize: model = chain(model, LayerNorm(nI=nO)) if dropout is not None: model = chain(model, cast(Model[Floats2d, Floats2d], Dropout(dropout))) return model def forward( model: Model[Floats2d, Floats2d], X: Floats2d, is_train: bool ) -> Tuple[Floats2d, Callable]: W = cast(Floats2d, model.get_param("W")) b = cast(Floats1d, model.get_param("b")) Y_preact = model.ops.affine(X, W, b) Y = model.ops.hard_swish_mobilenet(Y_preact) def backprop(dY: Floats2d) -> Floats2d: dY = model.ops.backprop_hard_swish_mobilenet(dY, Y_preact, inplace=False) model.inc_grad("b", dY.sum(axis=0)) model.inc_grad("W", model.ops.gemm(dY, X, trans1=True)) return model.ops.gemm(dY, W) return Y, backprop def init( init_W: Callable, init_b: Callable, model: Model[Floats2d, Floats2d], X: Optional[Floats2d] = None, Y: Optional[Floats2d] = None, ) -> None: if X is not None: model.set_dim("nI", get_width(X)) if Y is not None: model.set_dim("nO", get_width(Y)) model.set_param("W", init_W(model.ops, (model.get_dim("nO"), model.get_dim("nI")))) model.set_param("b", init_b(model.ops, (model.get_dim("nO"),))) thinc-release-v9.1.1/thinc/layers/hashembed.py000066400000000000000000000070371467064331700213530ustar00rootroot00000000000000from typing import Any, Callable, Dict, Optional, Tuple, TypeVar, Union, cast from ..config import registry from ..initializers import uniform_init from ..model import Model from ..types import Floats1d, Floats2d, Ints1d, Ints2d from ..util import partial from .array_getitem import ints_getitem from .chain import chain InT = TypeVar("InT", bound=Union[Ints1d, Ints2d]) OutT = Floats2d @registry.layers("HashEmbed.v1") def HashEmbed( nO: int, nV: int, *, seed: Optional[int] = None, column: Optional[int] = None, initializer: Optional[Callable] = None, dropout: Optional[float] = None ) -> Model[InT, OutT]: """ An embedding layer that uses the “hashing trick” to map keys to distinct values. The hashing trick involves hashing each key four times with distinct seeds, to produce four likely differing values. Those values are modded into the table, and the resulting vectors summed to produce a single result. Because it’s unlikely that two different keys will collide on all four “buckets”, most distinct keys will receive a distinct vector under this scheme, even when the number of vectors in the table is very low. """ attrs: Dict[str, Any] = {"column": column, "seed": seed} if initializer is None: initializer = uniform_init if dropout is not None: attrs["dropout_rate"] = dropout model: Model = Model( "hashembed", forward, init=partial(init, initializer), params={"E": None}, dims={"nO": nO, "nV": nV, "nI": None}, attrs=attrs, ) if seed is None: model.attrs["seed"] = model.id if column is not None: # This is equivalent to array[:, column]. What you're actually doing # there is passing in a tuple: array[(:, column)], except in the context # of array indexing, the ":" creates an object slice(0, None). # So array[:, column] is array.__getitem__(slice(0), column). model = chain(ints_getitem((slice(0, None), column)), model) model.attrs["column"] = column return cast(Model[InT, OutT], model) def forward( model: Model[Ints1d, OutT], ids: Ints1d, is_train: bool ) -> Tuple[OutT, Callable]: vectors = cast(Floats2d, model.get_param("E")) nV = vectors.shape[0] nO = vectors.shape[1] if len(ids) == 0: output: Floats2d = model.ops.alloc2f(0, nO, dtype=vectors.dtype) else: ids = model.ops.as_contig(ids, dtype="uint64") nN = ids.shape[0] seed: int = model.attrs["seed"] keys = model.ops.hash(ids, seed) % nV output = model.ops.gather_add(vectors, keys) drop_mask = None if is_train: dropout: Optional[float] = model.attrs.get("dropout_rate") drop_mask = cast(Floats1d, model.ops.get_dropout_mask((nO,), dropout)) if drop_mask is not None: output *= drop_mask def backprop(d_vectors: OutT) -> Ints1d: if drop_mask is not None: d_vectors *= drop_mask dE = model.ops.alloc2f(*vectors.shape) keysT = model.ops.as_contig(keys.T, dtype="i") for i in range(keysT.shape[0]): model.ops.scatter_add(dE, keysT[i], d_vectors) model.inc_grad("E", dE) dX = model.ops.alloc1i(nN) return dX return output, backprop def init( initializer: Callable, model: Model[Ints1d, OutT], X: Optional[Ints1d] = None, Y: Optional[OutT] = None, ) -> None: E = initializer(model.ops, (model.get_dim("nV"), model.get_dim("nO"))) model.set_param("E", E) thinc-release-v9.1.1/thinc/layers/layernorm.py000066400000000000000000000047461467064331700214470ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..backends import Ops from ..config import registry from ..model import Model from ..types import Floats2d from ..util import get_width InT = Floats2d @registry.layers("LayerNorm.v1") def LayerNorm(nI: Optional[int] = None) -> Model[InT, InT]: return Model( "layernorm", forward, init=init, dims={"nI": nI, "nO": nI}, params={"G": None, "b": None}, ) def forward(model: Model[InT, InT], X: InT, is_train: bool) -> Tuple[InT, Callable]: N, mu, var = _get_moments(model.ops, X) Xhat = (X - mu) * var ** (-1.0 / 2.0) Y, backprop_rescale = _begin_update_scale_shift(model, Xhat) def backprop(dY: InT) -> InT: dY = backprop_rescale(dY) dist, sum_dy, sum_dy_dist = _get_d_moments(model.ops, dY, X, mu) d_xhat = N * dY - sum_dy - dist * var ** (-1.0) * sum_dy_dist d_xhat *= var ** (-1.0 / 2) d_xhat /= N return d_xhat return Y, backprop def init( model: Model[InT, InT], X: Optional[InT] = None, Y: Optional[InT] = None ) -> None: if X is not None: X_width = get_width(X) model.set_dim("nI", X_width) model.set_dim("nO", X_width) elif Y is not None: Y_width = get_width(Y) model.set_dim("nI", Y_width) model.set_dim("nO", Y_width) nI = model.get_dim("nI") if not model.has_dim("nO"): model.set_dim("nO", nI) model.set_param("G", model.ops.alloc1f(nI) + 1) model.set_param("b", model.ops.alloc1f(nI)) assert model.get_dim("nO") is not None def _begin_update_scale_shift(model: Model[InT, InT], X: InT) -> Tuple[InT, Callable]: G = model.get_param("G") b = model.get_param("b") Y = X * G Y += b def finish_update_scale_shift(dY: InT) -> InT: model.inc_grad("b", dY.sum(axis=0)) model.inc_grad("G", (dY * X).sum(axis=0)) return dY * G return Y, finish_update_scale_shift def _get_moments(ops: Ops, X: Floats2d) -> Tuple[Floats2d, Floats2d, Floats2d]: # TODO: Do mean methods mu: Floats2d = X.mean(axis=1, keepdims=True) var: Floats2d = X.var(axis=1, keepdims=True) + 1e-08 return cast(Floats2d, ops.asarray_f([X.shape[1]])), mu, var def _get_d_moments( ops: Ops, dy: Floats2d, X: Floats2d, mu: Floats2d ) -> Tuple[Floats2d, Floats2d, Floats2d]: dist = X - mu return ( dist, ops.xp.sum(dy, axis=1, keepdims=True), ops.xp.sum(dy * dist, axis=1, keepdims=True), ) thinc-release-v9.1.1/thinc/layers/linear.py000066400000000000000000000032701467064331700207000ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..initializers import glorot_uniform_init, zero_init from ..model import Model from ..types import Floats1d, Floats2d from ..util import get_width, partial InT = Floats2d OutT = Floats2d @registry.layers("Linear.v1") def Linear( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, ) -> Model[InT, OutT]: """Multiply inputs by a weights matrix and adds a bias vector.""" if init_W is None: init_W = glorot_uniform_init if init_b is None: init_b = zero_init return Model( "linear", forward, init=partial(init, init_W, init_b), dims={"nO": nO, "nI": nI}, params={"W": None, "b": None}, ) def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: W = cast(Floats2d, model.get_param("W")) b = cast(Floats1d, model.get_param("b")) Y = model.ops.gemm(X, W, trans2=True) Y += b def backprop(dY: OutT) -> InT: model.inc_grad("b", dY.sum(axis=0)) model.inc_grad("W", model.ops.gemm(dY, X, trans1=True)) return model.ops.gemm(dY, W) return Y, backprop def init( init_W: Callable, init_b: Callable, model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None, ) -> None: if X is not None: model.set_dim("nI", get_width(X)) if Y is not None: model.set_dim("nO", get_width(Y)) model.set_param("W", init_W(model.ops, (model.get_dim("nO"), model.get_dim("nI")))) model.set_param("b", init_b(model.ops, (model.get_dim("nO"),))) thinc-release-v9.1.1/thinc/layers/list2array.py000066400000000000000000000015551467064331700215260ustar00rootroot00000000000000from typing import Callable, List, Tuple, TypeVar from ..backends import NumpyOps from ..config import registry from ..model import Model from ..types import Array2d NUMPY_OPS = NumpyOps() OutT = TypeVar("OutT", bound=Array2d) InT = List[OutT] @registry.layers("list2array.v1") def list2array() -> Model[InT, OutT]: """Transform sequences to ragged arrays if necessary and return the data from the ragged array. If sequences are already ragged, do nothing. A ragged array is a tuple (data, lengths), where data is the concatenated data. """ return Model("list2array", forward) def forward(model: Model[InT, OutT], Xs: InT, is_train: bool) -> Tuple[OutT, Callable]: lengths = NUMPY_OPS.asarray1i([len(x) for x in Xs]) def backprop(dY: OutT) -> InT: return model.ops.unflatten(dY, lengths) return model.ops.flatten(Xs), backprop thinc-release-v9.1.1/thinc/layers/list2padded.py000066400000000000000000000011561467064331700216260ustar00rootroot00000000000000from typing import Callable, Tuple, TypeVar, cast from ..config import registry from ..model import Model from ..types import List2d, Padded InT = TypeVar("InT", bound=List2d) OutT = Padded @registry.layers("list2padded.v1") def list2padded() -> Model[InT, OutT]: """Create a layer to convert a list of array inputs into Padded.""" return Model(f"list2padded", forward) def forward(model: Model[InT, OutT], Xs: InT, is_train: bool) -> Tuple[OutT, Callable]: Yp = model.ops.list2padded(Xs) def backprop(dYp: OutT) -> InT: return cast(InT, model.ops.padded2list(dYp)) return Yp, backprop thinc-release-v9.1.1/thinc/layers/list2ragged.py000066400000000000000000000015371467064331700216410ustar00rootroot00000000000000from typing import Callable, List, Tuple, TypeVar, cast from ..config import registry from ..model import Model from ..types import ArrayXd, ListXd, Ragged InT = TypeVar("InT", bound=ListXd) OutT = Ragged @registry.layers("list2ragged.v1") def list2ragged() -> Model[InT, OutT]: """Transform sequences to ragged arrays if necessary and return the ragged array. If sequences are already ragged, do nothing. A ragged array is a tuple (data, lengths), where data is the concatenated data. """ return Model("list2ragged", forward) def forward(model: Model[InT, OutT], Xs: InT, is_train: bool) -> Tuple[OutT, Callable]: def backprop(dYr: OutT) -> InT: return cast(InT, model.ops.unflatten(dYr.data, dYr.lengths)) lengths = model.ops.asarray1i([len(x) for x in Xs]) return Ragged(model.ops.flatten(Xs), lengths), backprop thinc-release-v9.1.1/thinc/layers/logistic.py000066400000000000000000000011411467064331700212360ustar00rootroot00000000000000from typing import Callable, Tuple from ..config import registry from ..model import Model from ..types import Floats2d InT = Floats2d OutT = Floats2d @registry.layers("Logistic.v1") def Logistic() -> Model[InT, OutT]: """Deprecated in favor of `sigmoid_activation` layer, for more consistent naming. """ return Model("logistic", forward) def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: Y = model.ops.sigmoid(X, inplace=False) def backprop(dY: OutT) -> InT: return dY * model.ops.dsigmoid(Y, inplace=False) return Y, backprop thinc-release-v9.1.1/thinc/layers/lstm.py000066400000000000000000000144631467064331700204130ustar00rootroot00000000000000from functools import partial from typing import Callable, Optional, Tuple, cast from ..backends import Ops from ..config import registry from ..initializers import glorot_uniform_init, zero_init from ..model import Model from ..types import Floats1d, Floats2d, Floats4d, Padded, Ragged from ..util import get_width from .noop import noop @registry.layers("LSTM.v1") def LSTM( nO: Optional[int] = None, nI: Optional[int] = None, *, bi: bool = False, depth: int = 1, dropout: float = 0.0, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, ) -> Model[Padded, Padded]: if depth == 0: msg = "LSTM depth must be at least 1. Maybe we should make this a noop?" raise ValueError(msg) if init_W is None: init_W = glorot_uniform_init if init_b is None: init_b = zero_init model: Model[Padded, Padded] = Model( "lstm", forward, dims={"nO": nO, "nI": nI, "depth": depth, "dirs": 1 + int(bi)}, attrs={"registry_name": "LSTM.v1", "dropout_rate": dropout}, params={"LSTM": None, "HC0": None}, init=partial(init, init_W, init_b), ) return model @registry.layers("PyTorchLSTM.v1") def PyTorchLSTM( nO: int, nI: int, *, bi: bool = False, depth: int = 1, dropout: float = 0.0 ) -> Model[Padded, Padded]: import torch.nn from .pytorchwrapper import PyTorchRNNWrapper from .with_padded import with_padded if depth == 0: return noop() # type: ignore[misc] nH = nO if bi: nH = nO // 2 pytorch_rnn = PyTorchRNNWrapper( torch.nn.LSTM(nI, nH, depth, bidirectional=bi, dropout=dropout) ) pytorch_rnn.set_dim("nO", nO) pytorch_rnn.set_dim("nI", nI) return with_padded(pytorch_rnn) def init( init_W: Callable, init_b: Callable, model: Model, X: Optional[Padded] = None, Y: Optional[Padded] = None, ) -> None: if X is not None: model.set_dim("nI", get_width(X)) if Y is not None: model.set_dim("nO", get_width(Y)) nH = int(model.get_dim("nO") / model.get_dim("dirs")) nI = model.get_dim("nI") depth = model.get_dim("depth") dirs = model.get_dim("dirs") # It's easiest to use the initializer if we alloc the weights separately # and then stick them all together afterwards. The order matters here: # we need to keep the same format that CuDNN expects. params = [] # Convenience init_W = partial(init_W, model.ops) init_b = partial(init_b, model.ops) layer_nI = nI for i in range(depth): for j in range(dirs): # Input-to-gates weights and biases. params.append(init_W((nH, layer_nI))) params.append(init_W((nH, layer_nI))) params.append(init_W((nH, layer_nI))) params.append(init_W((nH, layer_nI))) params.append(init_b((nH,))) params.append(init_b((nH,))) params.append(init_b((nH,))) params.append(init_b((nH,))) # Hidden-to-gates weights and biases params.append(init_W((nH, nH))) params.append(init_W((nH, nH))) params.append(init_W((nH, nH))) params.append(init_W((nH, nH))) params.append(init_b((nH,))) params.append(init_b((nH,))) params.append(init_b((nH,))) params.append(init_b((nH,))) layer_nI = nH * dirs model.set_param("LSTM", model.ops.xp.concatenate([p.ravel() for p in params])) model.set_param("HC0", zero_init(model.ops, (2, depth, dirs, nH))) size = model.get_param("LSTM").size expected = 4 * dirs * nH * (nH + nI) + dirs * (8 * nH) for _ in range(1, depth): expected += 4 * dirs * (nH + nH * dirs) * nH + dirs * (8 * nH) assert size == expected, (size, expected) def forward( model: Model[Padded, Padded], Xp: Padded, is_train: bool ) -> Tuple[Padded, Callable]: dropout = model.attrs["dropout_rate"] Xr = _padded_to_packed(model.ops, Xp) LSTM = cast(Floats1d, model.get_param("LSTM")) HC0 = cast(Floats4d, model.get_param("HC0")) H0 = HC0[0] C0 = HC0[1] if is_train: # Apply dropout over *weights*, not *activations*. RNN activations are # heavily correlated, so dropout over the activations is less effective. # This trick was explained in Yarin Gal's thesis, and popularised by # Smerity in the AWD-LSTM. It also means we can do the dropout outside # of the backend, improving compatibility. mask = cast(Floats1d, model.ops.get_dropout_mask(LSTM.shape, dropout)) LSTM = LSTM * mask Y, fwd_state = model.ops.lstm_forward_training( LSTM, H0, C0, cast(Floats2d, Xr.data), Xr.lengths ) else: Y = model.ops.lstm_forward_inference( LSTM, H0, C0, cast(Floats2d, Xr.data), Xr.lengths ) fwd_state = tuple() assert Y.shape == (Xr.data.shape[0], Y.shape[1]), (Xr.data.shape, Y.shape) Yp = _packed_to_padded(model.ops, Ragged(Y, Xr.lengths), Xp) def backprop(dYp: Padded) -> Padded: assert fwd_state dYr = _padded_to_packed(model.ops, dYp) dX, dLSTM = model.ops.backprop_lstm( cast(Floats2d, dYr.data), dYr.lengths, LSTM, fwd_state ) dLSTM *= mask model.inc_grad("LSTM", dLSTM) return _packed_to_padded(model.ops, Ragged(dX, dYr.lengths), dYp) return Yp, backprop def _padded_to_packed(ops: Ops, Xp: Padded) -> Ragged: """Strip padding from a padded sequence.""" assert Xp.lengths.sum() == Xp.size_at_t.sum(), ( Xp.lengths.sum(), Xp.size_at_t.sum(), ) Y = ops.alloc2f(Xp.lengths.sum(), Xp.data.shape[2]) start = 0 for t in range(Xp.size_at_t.shape[0]): batch_size = Xp.size_at_t[t] Y[start : start + batch_size] = Xp.data[t, :batch_size] # type: ignore[assignment] start += batch_size return Ragged(Y, Xp.size_at_t) def _packed_to_padded(ops: Ops, Xr: Ragged, Xp: Padded) -> Padded: Y = ops.alloc3f(Xp.data.shape[0], Xp.data.shape[1], Xr.data.shape[1]) X = cast(Floats2d, Xr.data) start = 0 for t in range(Xp.size_at_t.shape[0]): batch_size = Xp.size_at_t[t] Y[t, :batch_size] = X[start : start + batch_size] start += batch_size return Padded(Y, size_at_t=Xp.size_at_t, lengths=Xp.lengths, indices=Xp.indices) thinc-release-v9.1.1/thinc/layers/map_list.py000066400000000000000000000020031467064331700212270ustar00rootroot00000000000000from typing import Callable, List, Optional, Tuple, TypeVar from ..model import Model InT = TypeVar("InT") OutT = TypeVar("OutT") def map_list(layer: Model[InT, OutT]) -> Model[List[InT], List[OutT]]: """Create a model that maps a child layer across list inputs.""" return Model("map_list", forward, layers=[layer], init=init) def forward( model: Model[List[InT], List[OutT]], Xs: List[InT], is_train: bool ) -> Tuple[List[OutT], Callable[[List[OutT]], List[InT]]]: layer = model.layers[0] Ys = [] callbacks = [] for X in Xs: Y, get_dX = layer(X, is_train) Ys.append(Y) callbacks.append(get_dX) def backprop_map_list(dYs: List[OutT]) -> List[InT]: return [callback(dY) for callback, dY in zip(callbacks, dYs)] return Ys, backprop_map_list def init( model: Model[List[InT], List[OutT]], X: Optional[List[InT]] = None, Y: Optional[List[OutT]] = None, ) -> None: model.layers[0].initialize(X=X[0] if X else None, Y=Y[0] if Y else None) thinc-release-v9.1.1/thinc/layers/maxout.py000066400000000000000000000050421467064331700207420ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..initializers import glorot_uniform_init, zero_init from ..model import Model from ..types import Floats2d from ..util import get_width, partial from .chain import chain from .dropout import Dropout from .layernorm import LayerNorm InT = Floats2d OutT = Floats2d @registry.layers("Maxout.v1") def Maxout( nO: Optional[int] = None, nI: Optional[int] = None, nP: Optional[int] = 3, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, dropout: Optional[float] = None, normalize: bool = False, ) -> Model[InT, OutT]: if init_W is None: init_W = glorot_uniform_init if init_b is None: init_b = zero_init model: Model[InT, OutT] = Model( "maxout", forward, init=partial(init, init_W, init_b), dims={"nO": nO, "nI": nI, "nP": nP}, params={"W": None, "b": None}, ) if normalize: model = chain(model, LayerNorm(nI=nO)) if dropout is not None: model = chain(model, cast(Model[InT, OutT], Dropout(dropout))) return model def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: nO = model.get_dim("nO") nP = model.get_dim("nP") nI = model.get_dim("nI") b = model.get_param("b") W = model.get_param("W") W = model.ops.reshape2f(W, nO * nP, nI) Y = model.ops.gemm(X, W, trans2=True) Y += model.ops.reshape1f(b, nO * nP) Z = model.ops.reshape3f(Y, Y.shape[0], nO, nP) best, which = model.ops.maxout(Z) def backprop(d_best: OutT) -> InT: dZ = model.ops.backprop_maxout(d_best, which, nP) # TODO: Add sum methods for Floats3d model.inc_grad("b", dZ.sum(axis=0)) # type: ignore[call-overload] dY = model.ops.reshape2f(dZ, dZ.shape[0], nO * nP) dW = model.ops.reshape3f(model.ops.gemm(dY, X, trans1=True), nO, nP, nI) model.inc_grad("W", dW) return model.ops.gemm(dY, model.ops.reshape2f(W, nO * nP, nI)) return best, backprop def init( init_W: Callable, init_b: Callable, model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None, ) -> None: if X is not None: model.set_dim("nI", get_width(X)) if Y is not None: model.set_dim("nO", get_width(Y)) W_shape = (model.get_dim("nO"), model.get_dim("nP"), model.get_dim("nI")) model.set_param("W", init_W(model.ops, W_shape)) model.set_param("b", init_b(model.ops, (model.get_dim("nO"), model.get_dim("nP")))) thinc-release-v9.1.1/thinc/layers/mish.py000066400000000000000000000043351467064331700203710ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..initializers import glorot_uniform_init, zero_init from ..model import Model from ..types import Floats1d, Floats2d from ..util import get_width, partial from .chain import chain from .dropout import Dropout from .layernorm import LayerNorm InT = Floats2d OutT = Floats2d @registry.layers("Mish.v1") def Mish( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, dropout: Optional[float] = None, normalize: bool = False, ) -> Model[InT, OutT]: """Dense layer with mish activation. https://arxiv.org/pdf/1908.08681.pdf """ if init_W is None: init_W = glorot_uniform_init if init_b is None: init_b = zero_init model: Model[InT, OutT] = Model( "mish", forward, init=partial(init, init_W, init_b), dims={"nO": nO, "nI": nI}, params={"W": None, "b": None}, ) if normalize: model = chain(model, cast(Model[InT, OutT], LayerNorm(nI=nO))) if dropout is not None: model = chain(model, cast(Model[InT, OutT], Dropout(dropout))) return model def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: W = cast(Floats2d, model.get_param("W")) b = cast(Floats1d, model.get_param("b")) Y_pre_mish = model.ops.gemm(X, W, trans2=True) Y_pre_mish += b Y = model.ops.mish(Y_pre_mish) def backprop(dY: OutT) -> InT: dY_pre_mish = model.ops.backprop_mish(dY, Y_pre_mish) model.inc_grad("W", model.ops.gemm(dY_pre_mish, X, trans1=True)) model.inc_grad("b", dY_pre_mish.sum(axis=0)) dX = model.ops.gemm(dY_pre_mish, W) return dX return Y, backprop def init( init_W: Callable, init_b: Callable, model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None, ) -> None: if X is not None: model.set_dim("nI", get_width(X)) if Y is not None: model.set_dim("nO", get_width(Y)) model.set_param("W", init_W(model.ops, (model.get_dim("nO"), model.get_dim("nI")))) model.set_param("b", init_b(model.ops, (model.get_dim("nO"),))) thinc-release-v9.1.1/thinc/layers/multisoftmax.py000066400000000000000000000033501467064331700221610ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..model import Model from ..types import Floats1d, Floats2d from ..util import get_width InT = Floats2d OutT = Floats2d @registry.layers("MultiSoftmax.v1") def MultiSoftmax(nOs: Tuple[int, ...], nI: Optional[int] = None) -> Model[InT, OutT]: """Neural network layer that predicts several multi-class attributes at once. For instance, we might predict one class with 6 variables, and another with 5. We predict the 11 neurons required for this, and then softmax them such that columns 0-6 make a probability distribution and columns 6-11 make another. """ return Model( "multisoftmax", forward, init=init, dims={"nO": sum(nOs), "nI": nI}, attrs={"nOs": nOs}, params={"W": None, "b": None}, ) def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: nOs = model.attrs["nOs"] W = cast(Floats2d, model.get_param("W")) b = cast(Floats1d, model.get_param("b")) def backprop(dY: OutT) -> InT: model.inc_grad("W", model.ops.gemm(dY, X, trans1=True)) model.inc_grad("b", dY.sum(axis=0)) return model.ops.gemm(dY, W) Y = model.ops.gemm(X, W, trans2=True) Y += b i = 0 for out_size in nOs: model.ops.softmax(Y[:, i : i + out_size], inplace=True) i += out_size return Y, backprop def init( model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None ) -> None: if X is not None: model.set_dim("nI", get_width(X)) nO = model.get_dim("nO") nI = model.get_dim("nI") model.set_param("W", model.ops.alloc2f(nO, nI)) model.set_param("b", model.ops.alloc1f(nO)) thinc-release-v9.1.1/thinc/layers/mxnetwrapper.py000066400000000000000000000102711467064331700221610ustar00rootroot00000000000000from typing import Any, Callable, Optional, Tuple, Type from ..config import registry from ..model import Model from ..shims import MXNetShim from ..types import ArgsKwargs from ..util import convert_recursive, is_mxnet_array, is_xp_array, mxnet2xp, xp2mxnet @registry.layers("MXNetWrapper.v1") def MXNetWrapper( mxnet_model, convert_inputs: Optional[Callable] = None, convert_outputs: Optional[Callable] = None, model_class: Type[Model] = Model, model_name: str = "mxnet", ) -> Model[Any, Any]: """Wrap a MXNet model, so that it has the same API as Thinc models. To optimize the model, you'll need to create a MXNet optimizer and call optimizer.step() after each batch. Your MXNet model's forward method can take arbitrary args and kwargs, but must return either a single tensor as output or a tuple. You may find the MXNet register_forward_hook helpful if you need to adapt the output. The convert functions are used to map inputs and outputs to and from your MXNet model. Each function should return the converted output, and a callback to use during the backward pass. So: Xmxnet, get_dX = convert_inputs(X) Ymxnet, mxnet_backprop = model.shims[0](Xmxnet, is_train) Y, get_dYmxnet = convert_outputs(Ymxnet) To allow maximum flexibility, the MXNetShim expects ArgsKwargs objects on the way into the forward and backward passes. The ArgsKwargs objects will be passed straight into the model in the forward pass, and straight into `mxnet.autograd.backward` during the backward pass. """ if convert_inputs is None: convert_inputs = convert_mxnet_default_inputs if convert_outputs is None: convert_outputs = convert_mxnet_default_outputs return model_class( model_name, forward, attrs={"convert_inputs": convert_inputs, "convert_outputs": convert_outputs}, shims=[MXNetShim(mxnet_model)], ) def forward(model: Model, X: Any, is_train: bool) -> Tuple[Any, Callable]: """Return the output of the wrapped MXNet model for the given input, along with a callback to handle the backward pass. """ convert_inputs = model.attrs["convert_inputs"] convert_outputs = model.attrs["convert_outputs"] Xmxnet, get_dX = convert_inputs(model, X, is_train) Ymxnet, mxnet_backprop = model.shims[0](Xmxnet, is_train) Y, get_dYmxnet = convert_outputs(model, (X, Ymxnet), is_train) def backprop(dY: Any) -> Any: dYmxnet = get_dYmxnet(dY) dXmxnet = mxnet_backprop(dYmxnet) dX = get_dX(dXmxnet) return dX return Y, backprop # Default conversion functions def convert_mxnet_default_inputs( model: Model, X: Any, is_train: bool ) -> Tuple[ArgsKwargs, Callable[[ArgsKwargs], Any]]: xp2mxnet_ = lambda x: xp2mxnet(x, requires_grad=is_train) converted = convert_recursive(is_xp_array, xp2mxnet_, X) if isinstance(converted, ArgsKwargs): def reverse_conversion(dXmxnet): return convert_recursive(is_mxnet_array, mxnet2xp, dXmxnet) return converted, reverse_conversion elif isinstance(converted, dict): def reverse_conversion(dXmxnet): dX = convert_recursive(is_mxnet_array, mxnet2xp, dXmxnet) return dX.kwargs return ArgsKwargs(args=tuple(), kwargs=converted), reverse_conversion elif isinstance(converted, (tuple, list)): def reverse_conversion(dXmxnet): dX = convert_recursive(is_mxnet_array, mxnet2xp, dXmxnet) return dX.args return ArgsKwargs(args=tuple(converted), kwargs={}), reverse_conversion else: def reverse_conversion(dXmxnet): dX = convert_recursive(is_mxnet_array, mxnet2xp, dXmxnet) return dX.args[0] return ArgsKwargs(args=(converted,), kwargs={}), reverse_conversion def convert_mxnet_default_outputs(model: Model, X_Ymxnet: Any, is_train: bool): X, Ymxnet = X_Ymxnet Y = convert_recursive(is_mxnet_array, mxnet2xp, Ymxnet) def reverse_conversion(dY: Any) -> ArgsKwargs: dYmxnet = convert_recursive(is_xp_array, xp2mxnet, dY) return ArgsKwargs(args=((Ymxnet,),), kwargs={"head_grads": dYmxnet}) return Y, reverse_conversion thinc-release-v9.1.1/thinc/layers/noop.py000066400000000000000000000007771467064331700204120ustar00rootroot00000000000000from typing import Callable, Tuple, TypeVar from ..config import registry from ..model import Model InOutT = TypeVar("InOutT") @registry.layers("noop.v1") def noop(*layers: Model) -> Model[InOutT, InOutT]: """Transform a sequences of layers into a null operation.""" return Model("noop", forward, layers=layers) def forward( model: Model[InOutT, InOutT], X: InOutT, is_train: bool ) -> Tuple[InOutT, Callable]: def backprop(dY: InOutT) -> InOutT: return dY return X, backprop thinc-release-v9.1.1/thinc/layers/padded2list.py000066400000000000000000000012761467064331700216310ustar00rootroot00000000000000from typing import Callable, Tuple, TypeVar, cast from ..config import registry from ..model import Model from ..types import List2d, Padded InT = Padded OutT = TypeVar("OutT", bound=List2d) @registry.layers("padded2list.v1") def padded2list() -> Model[InT, OutT]: """Create a layer to convert a Padded input into a list of arrays.""" return Model(f"padded2list", forward) def forward( model: Model[InT, OutT], Xp: InT, is_train: bool ) -> Tuple[OutT, Callable[[OutT], InT]]: Ys = cast(OutT, model.ops.padded2list(Xp)) def backprop(dYs: OutT) -> InT: dYp = model.ops.list2padded(dYs) assert isinstance(dYp, Padded) return dYp return Ys, backprop thinc-release-v9.1.1/thinc/layers/parametricattention.py000066400000000000000000000040701467064331700235020ustar00rootroot00000000000000from typing import Callable, Optional, Tuple from ..config import registry from ..model import Model from ..types import Ragged from ..util import get_width InT = Ragged OutT = Ragged @registry.layers("ParametricAttention.v1") def ParametricAttention(nO: Optional[int] = None) -> Model[InT, OutT]: """Weight inputs by similarity to a learned vector""" return Model("para-attn", forward, init=init, params={"Q": None}, dims={"nO": nO}) def forward(model: Model[InT, OutT], Xr: InT, is_train: bool) -> Tuple[OutT, Callable]: Q = model.get_param("Q") attention, bp_attention = _get_attention(model.ops, Q, Xr.dataXd, Xr.lengths) output, bp_output = _apply_attention(model.ops, attention, Xr.dataXd, Xr.lengths) def backprop(dYr: OutT) -> InT: dX, d_attention = bp_output(dYr.dataXd) dQ, dX2 = bp_attention(d_attention) model.inc_grad("Q", dQ.ravel()) dX += dX2 return Ragged(dX, dYr.lengths) return Ragged(output, Xr.lengths), backprop def init( model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None ) -> None: if X is not None: model.set_dim("nO", get_width(X)) # Randomly initialize the parameter, as though it were an embedding. Q = model.ops.alloc1f(model.get_dim("nO")) Q += model.ops.xp.random.uniform(-0.1, 0.1, Q.shape) model.set_param("Q", Q) def _get_attention(ops, Q, X, lengths): attention = ops.gemm(X, ops.reshape2f(Q, -1, 1)) attention = ops.softmax_sequences(attention, lengths) def get_attention_bwd(d_attention): d_attention = ops.backprop_softmax_sequences(d_attention, attention, lengths) dQ = ops.gemm(X, d_attention, trans1=True) dX = ops.xp.outer(d_attention, Q) return dQ, dX return attention, get_attention_bwd def _apply_attention(ops, attention, X, lengths): output = X * attention def apply_attention_bwd(d_output): d_attention = (X * d_output).sum(axis=1, keepdims=True) dX = d_output * attention return dX, d_attention return output, apply_attention_bwd thinc-release-v9.1.1/thinc/layers/parametricattention_v2.py000066400000000000000000000056341467064331700241200ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..model import Model from ..types import Floats2d, Ragged from ..util import get_width from .noop import noop InT = Ragged OutT = Ragged KEY_TRANSFORM_REF: str = "key_transform" @registry.layers("ParametricAttention.v2") def ParametricAttention_v2( *, key_transform: Optional[Model[Floats2d, Floats2d]] = None, nO: Optional[int] = None ) -> Model[InT, OutT]: if key_transform is None: key_transform = noop() """Weight inputs by similarity to a learned vector""" return Model( "para-attn", forward, init=init, params={"Q": None}, dims={"nO": nO}, refs={KEY_TRANSFORM_REF: key_transform}, layers=[key_transform], ) def forward(model: Model[InT, OutT], Xr: InT, is_train: bool) -> Tuple[OutT, Callable]: Q = model.get_param("Q") key_transform = model.get_ref(KEY_TRANSFORM_REF) attention, bp_attention = _get_attention( model.ops, Q, key_transform, Xr.dataXd, Xr.lengths, is_train ) output, bp_output = _apply_attention(model.ops, attention, Xr.dataXd, Xr.lengths) def backprop(dYr: OutT) -> InT: dX, d_attention = bp_output(dYr.dataXd) dQ, dX2 = bp_attention(d_attention) model.inc_grad("Q", dQ.ravel()) dX += dX2 return Ragged(dX, dYr.lengths) return Ragged(output, Xr.lengths), backprop def init( model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None ) -> None: key_transform = model.get_ref(KEY_TRANSFORM_REF) width = get_width(X) if X is not None else None if width: model.set_dim("nO", width) if key_transform.has_dim("nO"): key_transform.set_dim("nO", width) # Randomly initialize the parameter, as though it were an embedding. Q = model.ops.alloc1f(model.get_dim("nO")) Q += model.ops.xp.random.uniform(-0.1, 0.1, Q.shape) model.set_param("Q", Q) X_array = X.dataXd if X is not None else None Y_array = Y.dataXd if Y is not None else None key_transform.initialize(X_array, Y_array) def _get_attention(ops, Q, key_transform, X, lengths, is_train): K, K_bp = key_transform(X, is_train=is_train) attention = ops.gemm(K, ops.reshape2f(Q, -1, 1)) attention = ops.softmax_sequences(attention, lengths) def get_attention_bwd(d_attention): d_attention = ops.backprop_softmax_sequences(d_attention, attention, lengths) dQ = ops.gemm(K, d_attention, trans1=True) dY = ops.xp.outer(d_attention, Q) dX = K_bp(dY) return dQ, dX return attention, get_attention_bwd def _apply_attention(ops, attention, X, lengths): output = X * attention def apply_attention_bwd(d_output): d_attention = (X * d_output).sum(axis=1, keepdims=True) dX = d_output * attention return dX, d_attention return output, apply_attention_bwd thinc-release-v9.1.1/thinc/layers/premap_ids.pyx000066400000000000000000000046751467064331700217530ustar00rootroot00000000000000# cython: binding=True, infer_types=True, profile=False from libc.stdint cimport int32_t, int64_t from preshed.maps cimport PreshMap from typing import Callable, Dict, Mapping, Optional, Tuple, Union, cast import numpy from ..config import registry from ..model import Model from ..types import Ints1d, Ints2d from ..util import to_numpy InT = Union[Ints1d, Ints2d] OutT = Ints2d cdef lookup(PreshMap mapping, int64_t[:] keys, int64_t default): """ Faster dict.get(keys, default) for the case when the "dict" is a Dict[int, int] converted to PreshMap and the "keys" is a numpy integer vector. """ cdef int maxi = len(keys) result = numpy.empty(maxi, dtype="int64") cdef int64_t[:] result_view = result for i in range(maxi): v = mapping[keys[i]] if v is None: result_view[i] = default else: result_view[i] = v return result @registry.layers("premap_ids.v1") def premap_ids( mapping_table: Mapping[int, int], default: int = 0, *, column: Optional[int] = None ): """Remap integer inputs to integers a mapping table, usually as a preprocess before embeddings.""" mapper = PreshMap(initial_size=len(mapping_table)) for k, v in mapping_table.items(): if not (isinstance(k, int) and isinstance(v, int)): raise ValueError( "mapping_table has to be of type Mapping[int, int], " f"but found {k}, {type(k)} and {v}, {type(v)}" ) mapper[k] = v return Model( "premap_ids", forward, attrs={ "mapping_table": mapper, "default": default, "column": column } ) def forward( model: Model, inputs: InT, is_train: bool ) -> Tuple[OutT, Callable]: table = model.attrs["mapping_table"] default = model.attrs["default"] column = model.attrs["column"] # Have to convert to numpy anyways, because # cupy ints don't work together with Python ints. if column is None: idx = to_numpy(inputs) else: idx = to_numpy(cast(Ints2d, inputs)[:, column]) result = lookup(table, idx, default) arr = model.ops.asarray2i(result) output = model.ops.reshape2i(arr, -1, 1) inputs_shape = inputs.shape def backprop(dY: OutT) -> InT: if len(inputs_shape) == 1: return model.ops.alloc1i(*inputs_shape) else: return model.ops.alloc2i(*inputs_shape) return output, backprop thinc-release-v9.1.1/thinc/layers/pytorchwrapper.py000066400000000000000000000302271467064331700225210ustar00rootroot00000000000000from typing import Any, Callable, Dict, Optional, Tuple, cast from ..compat import torch from ..config import registry from ..model import Model from ..shims import PyTorchGradScaler, PyTorchShim from ..types import ArgsKwargs, Floats3d, Padded from ..util import ( convert_recursive, is_torch_array, is_xp_array, partial, torch2xp, xp2torch, ) @registry.layers("PyTorchRNNWrapper.v1") def PyTorchRNNWrapper( pytorch_model: Any, convert_inputs: Optional[Callable] = None, convert_outputs: Optional[Callable] = None, ) -> Model[Padded, Padded]: """Wrap a PyTorch RNN model for use in Thinc.""" if convert_inputs is None: convert_inputs = convert_rnn_inputs if convert_outputs is None: convert_outputs = convert_rnn_outputs return cast( Model[Padded, Padded], PyTorchWrapper( pytorch_model, convert_inputs=convert_inputs, convert_outputs=convert_outputs, ), ) @registry.layers("PyTorchWrapper.v1") def PyTorchWrapper( pytorch_model: Any, convert_inputs: Optional[Callable] = None, convert_outputs: Optional[Callable] = None, ) -> Model[Any, Any]: """Wrap a PyTorch model, so that it has the same API as Thinc models. To optimize the model, you'll need to create a PyTorch optimizer and call optimizer.step() after each batch. See examples/wrap_pytorch.py Your PyTorch model's forward method can take arbitrary args and kwargs, but must return either a single tensor as output or a tuple. You may find the PyTorch register_forward_hook helpful if you need to adapt the output. The convert functions are used to map inputs and outputs to and from your PyTorch model. Each function should return the converted output, and a callback to use during the backward pass. So: Xtorch, get_dX = convert_inputs(X) Ytorch, torch_backprop = model.shims[0](Xtorch, is_train) Y, get_dYtorch = convert_outputs(Ytorch) To allow maximum flexibility, the PyTorchShim expects ArgsKwargs objects on the way into the forward and backward passed. The ArgsKwargs objects will be passed straight into the model in the forward pass, and straight into `torch.autograd.backward` during the backward pass. """ if convert_inputs is None: convert_inputs = convert_pytorch_default_inputs if convert_outputs is None: convert_outputs = convert_pytorch_default_outputs return Model( "pytorch", forward, attrs={"convert_inputs": convert_inputs, "convert_outputs": convert_outputs}, shims=[PyTorchShim(pytorch_model)], dims={"nI": None, "nO": None}, ) @registry.layers("PyTorchWrapper.v2") def PyTorchWrapper_v2( pytorch_model: Any, convert_inputs: Optional[Callable] = None, convert_outputs: Optional[Callable] = None, mixed_precision: bool = False, grad_scaler: Optional[PyTorchGradScaler] = None, device: Optional["torch.device"] = None, ) -> Model[Any, Any]: """Wrap a PyTorch model, so that it has the same API as Thinc models. To optimize the model, you'll need to create a PyTorch optimizer and call optimizer.step() after each batch. See examples/wrap_pytorch.py Your PyTorch model's forward method can take arbitrary args and kwargs, but must return either a single tensor as output or a tuple. You may find the PyTorch register_forward_hook helpful if you need to adapt the output. The convert functions are used to map inputs and outputs to and from your PyTorch model. Each function should return the converted output, and a callback to use during the backward pass. So: Xtorch, get_dX = convert_inputs(X) Ytorch, torch_backprop = model.shims[0](Xtorch, is_train) Y, get_dYtorch = convert_outputs(Ytorch) To allow maximum flexibility, the PyTorchShim expects ArgsKwargs objects on the way into the forward and backward passed. The ArgsKwargs objects will be passed straight into the model in the forward pass, and straight into `torch.autograd.backward` during the backward pass. mixed_precision: Enable mixed-precision. This changes whitelisted ops to run in half precision for better performance and lower memory use. grad_scaler: The gradient scaler to use for mixed-precision training. If this argument is set to "None" and mixed precision is enabled, a gradient scaler with the default configuration is used. device: The PyTorch device to run the model on. When this argument is set to "None", the default device for the currently active Thinc ops is used. """ if convert_inputs is None: convert_inputs = convert_pytorch_default_inputs if convert_outputs is None: convert_outputs = convert_pytorch_default_outputs return Model( "pytorch", forward, attrs={"convert_inputs": convert_inputs, "convert_outputs": convert_outputs}, shims=[ PyTorchShim( pytorch_model, mixed_precision=mixed_precision, grad_scaler=grad_scaler, device=device, ) ], dims={"nI": None, "nO": None}, ) @registry.layers("PyTorchWrapper.v3") def PyTorchWrapper_v3( pytorch_model: "torch.nn.Module", convert_inputs: Optional[Callable] = None, convert_outputs: Optional[Callable] = None, mixed_precision: bool = False, grad_scaler: Optional[PyTorchGradScaler] = None, device: Optional["torch.device"] = None, serialize_model: Optional[Callable[[Any], bytes]] = None, deserialize_model: Optional[Callable[[Any, bytes, "torch.device"], Any]] = None, ) -> Model[Any, Any]: """Wrap a PyTorch model, so that it has the same API as Thinc models. To optimize the model, you'll need to create a PyTorch optimizer and call optimizer.step() after each batch. See examples/wrap_pytorch.py Your PyTorch model's forward method can take arbitrary args and kwargs, but must return either a single tensor or a tuple. You may find the PyTorch register_forward_hook helpful if you need to adapt the output. The convert functions are used to map inputs and outputs to and from your PyTorch model. Each function should return the converted output, and a callback to use during the backward pass. So: Xtorch, get_dX = convert_inputs(X) Ytorch, torch_backprop = model.shims[0](Xtorch, is_train) Y, get_dYtorch = convert_outputs(Ytorch) To allow maximum flexibility, the PyTorchShim expects ArgsKwargs objects on the way into the forward and backward passed. The ArgsKwargs objects will be passed straight into the model in the forward pass, and straight into `torch.autograd.backward` during the backward pass. mixed_precision: Enable mixed-precision. This changes whitelisted ops to run in half precision for better performance and lower memory use. grad_scaler: The gradient scaler to use for mixed-precision training. If this argument is set to "None" and mixed precision is enabled, a gradient scaler with the default configuration is used. device: The PyTorch device to run the model on. When this argument is set to "None", the default device for the currently active Thinc ops is used. serialize_model: Callback that receives the wrapped PyTorch model as its argument and returns a "bytes" representation of the same. The representation should contain all the necessary information to fully deserialize the model. When set to "None", the default serializer serializes the model's parameters. deserialize_model: Callback that receives the default PyTorch model (passed to the constructor), the serialized "bytes" representation and a PyTorch device. It should return a fully deserialized model on the target device as its result. When set to "None", the default deserializer deserializes the model's parameters. """ if convert_inputs is None: convert_inputs = convert_pytorch_default_inputs if convert_outputs is None: convert_outputs = convert_pytorch_default_outputs return Model( "pytorch", forward, attrs={"convert_inputs": convert_inputs, "convert_outputs": convert_outputs}, shims=[ PyTorchShim( pytorch_model, mixed_precision=mixed_precision, grad_scaler=grad_scaler, device=device, serialize_model=serialize_model, deserialize_model=deserialize_model, ) ], dims={"nI": None, "nO": None}, ) def forward(model: Model, X: Any, is_train: bool) -> Tuple[Any, Callable]: """Return the output of the wrapped PyTorch model for the given input, along with a callback to handle the backward pass. """ convert_inputs = model.attrs["convert_inputs"] convert_outputs = model.attrs["convert_outputs"] Xtorch, get_dX = convert_inputs(model, X, is_train) Ytorch, torch_backprop = model.shims[0](Xtorch, is_train) Y, get_dYtorch = convert_outputs(model, (X, Ytorch), is_train) def backprop(dY: Any) -> Any: dYtorch = get_dYtorch(dY) dXtorch = torch_backprop(dYtorch) dX = get_dX(dXtorch) return dX return Y, backprop # Default conversion functions def convert_pytorch_default_inputs( model: Model, X: Any, is_train: bool ) -> Tuple[ArgsKwargs, Callable[[ArgsKwargs], Any]]: shim = cast(PyTorchShim, model.shims[0]) xp2torch_ = lambda x: xp2torch(x, requires_grad=is_train, device=shim.device) converted = convert_recursive(is_xp_array, xp2torch_, X) if isinstance(converted, ArgsKwargs): def reverse_conversion(dXtorch): return convert_recursive(is_torch_array, torch2xp, dXtorch) return converted, reverse_conversion elif isinstance(converted, dict): def reverse_conversion(dXtorch): dX = convert_recursive(is_torch_array, torch2xp, dXtorch) return dX.kwargs return ArgsKwargs(args=tuple(), kwargs=converted), reverse_conversion elif isinstance(converted, (tuple, list)): def reverse_conversion(dXtorch): dX = convert_recursive(is_torch_array, torch2xp, dXtorch) return dX.args return ArgsKwargs(args=tuple(converted), kwargs={}), reverse_conversion else: def reverse_conversion(dXtorch): dX = convert_recursive(is_torch_array, torch2xp, dXtorch) return dX.args[0] return ArgsKwargs(args=(converted,), kwargs={}), reverse_conversion def convert_pytorch_default_outputs(model: Model, X_Ytorch: Any, is_train: bool): shim = cast(PyTorchShim, model.shims[0]) X, Ytorch = X_Ytorch Y = convert_recursive(is_torch_array, torch2xp, Ytorch) def reverse_conversion(dY: Any) -> ArgsKwargs: dYtorch = convert_recursive( is_xp_array, partial(xp2torch, device=shim.device), dY ) return ArgsKwargs(args=((Ytorch,),), kwargs={"grad_tensors": dYtorch}) return Y, reverse_conversion # BiLSTM conversion functions def convert_rnn_inputs(model: Model, Xp: Padded, is_train: bool): shim = cast(PyTorchShim, model.shims[0]) size_at_t = Xp.size_at_t lengths = Xp.lengths indices = Xp.indices def convert_from_torch_backward(d_inputs: ArgsKwargs) -> Padded: dX = torch2xp(d_inputs.args[0]) return Padded(dX, size_at_t, lengths, indices) # type: ignore output = ArgsKwargs( args=(xp2torch(Xp.data, requires_grad=True, device=shim.device), None), kwargs={}, ) return output, convert_from_torch_backward def convert_rnn_outputs(model: Model, inputs_outputs: Tuple, is_train): shim = cast(PyTorchShim, model.shims[0]) Xp, (Ytorch, _) = inputs_outputs def convert_for_torch_backward(dYp: Padded) -> ArgsKwargs: dYtorch = xp2torch(dYp.data, requires_grad=True, device=shim.device) return ArgsKwargs(args=(Ytorch,), kwargs={"grad_tensors": dYtorch}) Y = cast(Floats3d, torch2xp(Ytorch)) Yp = Padded(Y, Xp.size_at_t, Xp.lengths, Xp.indices) return Yp, convert_for_torch_backward thinc-release-v9.1.1/thinc/layers/ragged2list.py000066400000000000000000000014051467064331700216330ustar00rootroot00000000000000from typing import Callable, Tuple, TypeVar, cast from ..config import registry from ..model import Model from ..types import ListXd, Ragged InT = Ragged OutT = TypeVar("OutT", bound=ListXd) @registry.layers("ragged2list.v1") def ragged2list() -> Model[InT, OutT]: """Transform sequences from a ragged format into lists.""" return Model("ragged2list", forward) def forward(model: Model[InT, OutT], Xr: InT, is_train: bool) -> Tuple[OutT, Callable]: lengths = Xr.lengths def backprop(dXs: OutT) -> InT: return Ragged(model.ops.flatten(dXs, pad=0), lengths) # type:ignore[arg-type] # type ignore necessary for older versions of Mypy/Pydantic data = cast(OutT, model.ops.unflatten(Xr.dataXd, Xr.lengths)) return data, backprop thinc-release-v9.1.1/thinc/layers/reduce_first.py000066400000000000000000000014571467064331700221110ustar00rootroot00000000000000from typing import Callable, Tuple, cast from ..config import registry from ..model import Model from ..types import Floats2d, Ragged from ..util import ArrayInfo InT = Ragged OutT = Floats2d @registry.layers("reduce_first.v1") def reduce_first() -> Model[InT, OutT]: """Reduce ragged-formatted sequences to their first element.""" return Model("reduce_first", forward) def forward( model: Model[InT, OutT], Xr: InT, is_train: bool ) -> Tuple[OutT, Callable[[OutT], InT]]: Y, starts_ends = model.ops.reduce_first(cast(Floats2d, Xr.data), Xr.lengths) array_info = ArrayInfo.from_array(Y) def backprop(dY: OutT) -> InT: array_info.check_consistency(dY) dX = model.ops.backprop_reduce_first(dY, starts_ends) return Ragged(dX, Xr.lengths) return Y, backprop thinc-release-v9.1.1/thinc/layers/reduce_last.py000066400000000000000000000014341467064331700217200ustar00rootroot00000000000000from typing import Callable, Tuple, cast from ..config import registry from ..model import Model from ..types import Floats2d, Ragged from ..util import ArrayInfo InT = Ragged OutT = Floats2d @registry.layers("reduce_last.v1") def reduce_last() -> Model[InT, OutT]: """Reduce ragged-formatted sequences to their last element.""" return Model("reduce_last", forward) def forward( model: Model[InT, OutT], Xr: InT, is_train: bool ) -> Tuple[OutT, Callable[[OutT], InT]]: Y, lasts = model.ops.reduce_last(cast(Floats2d, Xr.data), Xr.lengths) array_info = ArrayInfo.from_array(Y) def backprop(dY: OutT) -> InT: array_info.check_consistency(dY) dX = model.ops.backprop_reduce_last(dY, lasts) return Ragged(dX, Xr.lengths) return Y, backprop thinc-release-v9.1.1/thinc/layers/reduce_max.py000066400000000000000000000013201467064331700215340ustar00rootroot00000000000000from typing import Callable, Tuple, cast from ..config import registry from ..model import Model from ..types import Floats2d, Ragged from ..util import ArrayInfo InT = Ragged OutT = Floats2d @registry.layers("reduce_max.v1") def reduce_max() -> Model[InT, OutT]: return Model("reduce_max", forward) def forward(model: Model[InT, OutT], Xr: InT, is_train: bool) -> Tuple[OutT, Callable]: Y, which = model.ops.reduce_max(cast(Floats2d, Xr.data), Xr.lengths) lengths = Xr.lengths array_info = ArrayInfo.from_array(Y) def backprop(dY: OutT) -> InT: array_info.check_consistency(dY) return Ragged(model.ops.backprop_reduce_max(dY, which, lengths), lengths) return Y, backprop thinc-release-v9.1.1/thinc/layers/reduce_mean.py000066400000000000000000000013101467064331700216660ustar00rootroot00000000000000from typing import Callable, Tuple, cast from ..config import registry from ..model import Model from ..types import Floats2d, Ragged from ..util import ArrayInfo InT = Ragged OutT = Floats2d @registry.layers("reduce_mean.v1") def reduce_mean() -> Model[InT, OutT]: return Model("reduce_mean", forward) def forward(model: Model[InT, OutT], Xr: InT, is_train: bool) -> Tuple[OutT, Callable]: Y = model.ops.reduce_mean(cast(Floats2d, Xr.data), Xr.lengths) lengths = Xr.lengths array_info = ArrayInfo.from_array(Y) def backprop(dY: OutT) -> InT: array_info.check_consistency(dY) return Ragged(model.ops.backprop_reduce_mean(dY, lengths), lengths) return Y, backprop thinc-release-v9.1.1/thinc/layers/reduce_sum.py000066400000000000000000000013021467064331700215530ustar00rootroot00000000000000from typing import Callable, Tuple, cast from ..config import registry from ..model import Model from ..types import Floats2d, Ragged from ..util import ArrayInfo InT = Ragged OutT = Floats2d @registry.layers("reduce_sum.v1") def reduce_sum() -> Model[InT, OutT]: return Model("reduce_sum", forward) def forward(model: Model[InT, OutT], Xr: InT, is_train: bool) -> Tuple[OutT, Callable]: Y = model.ops.reduce_sum(cast(Floats2d, Xr.data), Xr.lengths) lengths = Xr.lengths array_info = ArrayInfo.from_array(Y) def backprop(dY: OutT) -> InT: array_info.check_consistency(dY) return Ragged(model.ops.backprop_reduce_sum(dY, lengths), lengths) return Y, backprop thinc-release-v9.1.1/thinc/layers/relu.py000066400000000000000000000040111467064331700203670ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..initializers import glorot_uniform_init, zero_init from ..model import Model from ..types import Floats1d, Floats2d from ..util import get_width, partial from .chain import chain from .dropout import Dropout from .layernorm import LayerNorm InT = Floats2d OutT = Floats2d @registry.layers("Relu.v1") def Relu( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, dropout: Optional[float] = None, normalize: bool = False, ) -> Model[InT, OutT]: if init_W is None: init_W = glorot_uniform_init if init_b is None: init_b = zero_init model: Model[InT, OutT] = Model( "relu", forward, init=partial(init, init_W, init_b), dims={"nO": nO, "nI": nI}, params={"W": None, "b": None}, ) if normalize: model = chain(model, LayerNorm(nI=nO)) if dropout is not None: model = chain(model, cast(Model[Floats2d, Floats2d], Dropout(dropout))) return model def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: W = cast(Floats2d, model.get_param("W")) b = cast(Floats1d, model.get_param("b")) Y = model.ops.affine(X, W, b) Y = model.ops.relu(Y) def backprop(dY: OutT) -> InT: dY = model.ops.backprop_relu(dY, Y) model.inc_grad("b", dY.sum(axis=0)) model.inc_grad("W", model.ops.gemm(dY, X, trans1=True)) return model.ops.gemm(dY, W) return Y, backprop def init( init_W: Callable, init_b: Callable, model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None, ) -> None: if X is not None: model.set_dim("nI", get_width(X)) if Y is not None: model.set_dim("nO", get_width(Y)) model.set_param("W", init_W(model.ops, (model.get_dim("nO"), model.get_dim("nI")))) model.set_param("b", init_b(model.ops, (model.get_dim("nO"),))) thinc-release-v9.1.1/thinc/layers/remap_ids.py000066400000000000000000000060001467064331700213630ustar00rootroot00000000000000from typing import Any, Callable, Dict, Hashable, Optional, Sequence, Tuple, Union, cast from ..config import registry from ..model import Model from ..types import DTypes, Ints1d, Ints2d from ..util import is_xp_array, to_numpy InT = Union[Sequence[Hashable], Ints1d, Ints2d] OutT = Ints2d InT_v1 = Sequence[Any] OutT_v1 = Ints2d @registry.layers("remap_ids.v1") def remap_ids( mapping_table: Dict[Any, int] = {}, default: int = 0, dtype: DTypes = "i" ) -> Model[InT_v1, OutT_v1]: """Remap string or integer inputs using a mapping table, usually as a preprocess before embeddings. The mapping table can be passed in on input, or updated after the layer has been created. The mapping table is stored in the "mapping_table" attribute. """ return Model( "remap_ids", forward, attrs={"mapping_table": mapping_table, "dtype": dtype, "default": default}, ) def forward( model: Model[InT_v1, OutT_v1], inputs: InT_v1, is_train: bool ) -> Tuple[OutT, Callable]: table = model.attrs["mapping_table"] default = model.attrs["default"] dtype = model.attrs["dtype"] values = [table.get(x, default) for x in inputs] arr = model.ops.asarray2i(values, dtype=dtype) output = model.ops.reshape2i(arr, -1, 1) def backprop(dY: OutT_v1) -> InT: return [] return output, backprop @registry.layers("remap_ids.v2") def remap_ids_v2( mapping_table: Optional[Union[Dict[int, int], Dict[str, int]]] = None, default: int = 0, *, column: Optional[int] = None ) -> Model[InT, OutT]: """Remap string or integer inputs using a mapping table, usually as a preprocessing step before embeddings. The mapping table can be passed in on input, or updated after the layer has been created. The mapping table is stored in the "mapping_table" attribute. Two dimensional arrays can be provided as input in which case the 'column' chooses which column to process. This is useful to work together with FeatureExtractor in spaCy. """ return Model( "remap_ids", forward_v2, attrs={"mapping_table": mapping_table, "default": default, "column": column}, ) def forward_v2( model: Model[InT, OutT], inputs: InT, is_train: bool ) -> Tuple[OutT, Callable]: table = model.attrs["mapping_table"] if table is None: raise ValueError("'mapping table' not set") default = model.attrs["default"] column = model.attrs["column"] if is_xp_array(inputs): xp_input = True if column is not None: idx = to_numpy(cast(Ints2d, inputs)[:, column]) else: idx = to_numpy(inputs) else: xp_input = False idx = inputs values = [table.get(x, default) for x in idx] arr = model.ops.asarray2i(values, dtype="i") output = model.ops.reshape2i(arr, -1, 1) def backprop(dY: OutT) -> InT: if xp_input: return model.ops.xp.empty(dY.shape) # type: ignore else: return [] return output, backprop thinc-release-v9.1.1/thinc/layers/residual.py000066400000000000000000000040541467064331700212370ustar00rootroot00000000000000from typing import Callable, List, Optional, Tuple, TypeVar from ..config import registry from ..model import Model from ..types import Floats1d, Floats2d, Floats3d, Floats4d, FloatsXd, Padded, Ragged # fmt: off InT = TypeVar( "InT", List[Floats1d], List[Floats2d], List[Floats3d], List[Floats4d], Ragged, Padded, FloatsXd, Floats1d, Floats2d, Floats3d, Floats4d) # fmt: on @registry.layers("residual.v1") def residual(layer: Model[InT, InT]) -> Model[InT, InT]: return Model( f"residual({layer.name})", forward, init=init, layers=[layer], dims={ "nO": layer.get_dim("nO") if layer.has_dim("nO") else None, "nI": layer.get_dim("nI") if layer.has_dim("nI") else None, }, ) def forward(model: Model[InT, InT], X: InT, is_train: bool) -> Tuple[InT, Callable]: def backprop(d_output: InT) -> InT: dX = backprop_layer(d_output) if isinstance(d_output, list): return [d_output[i] + dX[i] for i in range(len(d_output))] elif isinstance(d_output, Ragged): return Ragged(d_output.data + dX.data, dX.lengths) elif isinstance(X, Padded): dX.data += d_output.data return dX else: return d_output + dX Y, backprop_layer = model.layers[0](X, is_train) if isinstance(X, list): return [X[i] + Y[i] for i in range(len(X))], backprop elif isinstance(X, Ragged): return Ragged(X.data + Y.data, X.lengths), backprop elif isinstance(X, Padded): Y.data += X.data return Y, backprop else: return X + Y, backprop def init( model: Model[InT, InT], X: Optional[InT] = None, Y: Optional[InT] = None ) -> None: first_layer = model.layers[0] if first_layer.has_dim("nO") is None: first_layer.initialize(X=X, Y=Y) else: first_layer.initialize(X=X) if first_layer.has_dim("nO"): model.set_dim("nO", first_layer.get_dim("nO")) if first_layer.has_dim("nI"): model.set_dim("nI", first_layer.get_dim("nI")) thinc-release-v9.1.1/thinc/layers/resizable.py000066400000000000000000000053031467064331700214050ustar00rootroot00000000000000from typing import Callable, Optional, TypeVar from ..config import registry from ..model import Model from ..types import Floats2d InT = TypeVar("InT") OutT = TypeVar("OutT") @registry.layers("resizable.v1") def resizable(layer, resize_layer: Callable) -> Model[InT, OutT]: """Container that holds one layer that can change dimensions.""" return Model( f"resizable({layer.name})", forward, init=init, layers=[layer], attrs={"resize_layer": resize_layer}, dims={name: layer.maybe_get_dim(name) for name in layer.dim_names}, ) def forward(model: Model[InT, OutT], X: InT, is_train: bool): layer = model.layers[0] Y, callback = layer(X, is_train=is_train) def backprop(dY: OutT) -> InT: return callback(dY) return Y, backprop def init( model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None ) -> None: layer = model.layers[0] layer.initialize(X, Y) def resize_model(model: Model[InT, OutT], new_nO): old_layer = model.layers[0] new_layer = model.attrs["resize_layer"](old_layer, new_nO) model.layers[0] = new_layer return model def resize_linear_weighted( layer: Model[Floats2d, Floats2d], new_nO, *, fill_defaults=None ) -> Model[Floats2d, Floats2d]: """Create a resized copy of a layer that has parameters W and b and dimensions nO and nI.""" assert not layer.layers assert not layer.ref_names assert not layer.shims # return the original layer if it wasn't initialized or if nO didn't change if layer.has_dim("nO") is None: layer.set_dim("nO", new_nO) return layer elif new_nO == layer.get_dim("nO"): return layer elif layer.has_dim("nI") is None: layer.set_dim("nO", new_nO, force=True) return layer dims = {name: layer.maybe_get_dim(name) for name in layer.dim_names} dims["nO"] = new_nO new_layer: Model[Floats2d, Floats2d] = Model( layer.name, layer._func, dims=dims, params={name: None for name in layer.param_names}, init=layer.init, attrs=layer.attrs, refs={}, ops=layer.ops, ) new_layer.initialize() for name in layer.param_names: if layer.has_param(name): filler = 0 if not fill_defaults else fill_defaults.get(name, 0) _resize_parameter(name, layer, new_layer, filler=filler) return new_layer def _resize_parameter(name, layer, new_layer, filler=0): larger = new_layer.get_param(name) smaller = layer.get_param(name) # copy the original weights larger[: len(smaller)] = smaller # set the new weights larger[len(smaller) :] = filler new_layer.set_param(name, larger) thinc-release-v9.1.1/thinc/layers/siamese.py000066400000000000000000000031161467064331700210530ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, TypeVar from ..config import registry from ..model import Model from ..types import ArrayXd from ..util import get_width LayerT = TypeVar("LayerT") SimT = TypeVar("SimT") InT = Tuple[LayerT, LayerT] OutT = TypeVar("OutT", bound=ArrayXd) @registry.layers("siamese.v1") def siamese( layer: Model[LayerT, SimT], similarity: Model[Tuple[SimT, SimT], OutT] ) -> Model[InT, OutT]: return Model( f"siamese({layer.name}, {similarity.name})", forward, init=init, layers=[layer, similarity], dims={"nI": layer.get_dim("nI"), "nO": similarity.get_dim("nO")}, ) def forward( model: Model[InT, OutT], X1_X2: InT, is_train: bool ) -> Tuple[OutT, Callable]: X1, X2 = X1_X2 vec1, bp_vec1 = model.layers[0](X1, is_train) vec2, bp_vec2 = model.layers[0](X2, is_train) output, bp_output = model.layers[1]((vec1, vec2), is_train) def finish_update(d_output: OutT) -> InT: d_vec1, d_vec2 = bp_output(d_output) d_input1 = bp_vec1(d_vec1) d_input2 = bp_vec2(d_vec2) return (d_input1, d_input2) return output, finish_update def init( model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None ) -> None: if X is not None: model.layers[0].set_dim("nI", get_width(X[1])) model.layers[0].initialize(X=X[0]) X = (model.layers[0].predict(X[0]), model.layers[0].predict(X[1])) model.layers[1].initialize(X=X, Y=Y) model.set_dim("nI", model.layers[0].get_dim("nI")) model.set_dim("nO", model.layers[1].get_dim("nO")) thinc-release-v9.1.1/thinc/layers/sigmoid.py000066400000000000000000000036311467064331700210620ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..initializers import zero_init from ..model import Model from ..types import Floats1d, Floats2d from ..util import get_width, partial InT = Floats2d OutT = Floats2d @registry.layers("Sigmoid.v1") def Sigmoid( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, ) -> Model[InT, OutT]: """A dense layer, followed by a sigmoid (logistic) activation function. This is usually used instead of the Softmax layer as an output for multi-label classification. """ if init_W is None: init_W = zero_init if init_b is None: init_b = zero_init return Model( "sigmoid", forward, init=partial(init, init_W, init_b), dims={"nO": nO, "nI": nI}, params={"W": None, "b": None}, ) def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: W = cast(Floats2d, model.get_param("W")) b = cast(Floats1d, model.get_param("b")) Y = model.ops.affine(X, W, b) Y = model.ops.sigmoid(Y) def backprop(dY: InT) -> OutT: dY = model.ops.backprop_sigmoid(dY, Y, inplace=False) model.inc_grad("b", dY.sum(axis=0)) model.inc_grad("W", model.ops.gemm(dY, X, trans1=True)) return model.ops.gemm(dY, W) return Y, backprop def init( init_W: Callable, init_b: Callable, model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None, ) -> None: if X is not None and model.has_dim("nI") is None: model.set_dim("nI", get_width(X)) if Y is not None and model.has_dim("nO") is None: model.set_dim("nO", get_width(Y)) model.set_param("W", init_W(model.ops, (model.get_dim("nO"), model.get_dim("nI")))) model.set_param("b", init_b(model.ops, (model.get_dim("nO"),))) thinc-release-v9.1.1/thinc/layers/sigmoid_activation.py000066400000000000000000000012141467064331700232760ustar00rootroot00000000000000from typing import Callable, Tuple, TypeVar, cast from ..config import registry from ..model import Model from ..types import FloatsXdT @registry.layers("sigmoid_activation.v1") def sigmoid_activation() -> Model[FloatsXdT, FloatsXdT]: return Model("sigmoid_activation", forward) def forward( model: Model[FloatsXdT, FloatsXdT], X: FloatsXdT, is_train: bool ) -> Tuple[FloatsXdT, Callable]: Y = model.ops.sigmoid(X, inplace=False) def backprop(dY: FloatsXdT) -> FloatsXdT: return cast( FloatsXdT, dY * model.ops.dsigmoid(Y, inplace=False), # type:ignore[operator] ) return Y, backprop thinc-release-v9.1.1/thinc/layers/softmax.py000066400000000000000000000062451467064331700211140ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..initializers import zero_init from ..model import Model from ..types import Floats1d, Floats2d from ..util import ArrayInfo, get_width, partial InT = Floats2d OutT = Floats2d @registry.layers("Softmax.v1") def Softmax( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, ) -> Model[InT, OutT]: if init_W is None: init_W = zero_init if init_b is None: init_b = zero_init return Model( "softmax", forward, init=partial(init, init_W, init_b), dims={"nO": nO, "nI": nI}, params={"W": None, "b": None}, attrs={"softmax_normalize": True, "softmax_temperature": 1.0}, ) @registry.layers("Softmax.v2") def Softmax_v2( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, normalize_outputs: bool = True, temperature: float = 1.0, ) -> Model[InT, OutT]: if init_W is None: init_W = zero_init if init_b is None: init_b = zero_init validate_temperature(temperature) return Model( "softmax", forward, init=partial(init, init_W, init_b), dims={"nO": nO, "nI": nI}, params={"W": None, "b": None}, attrs={ "softmax_normalize": normalize_outputs, "softmax_temperature": temperature, }, ) def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: normalize = model.attrs["softmax_normalize"] or is_train temperature = model.attrs["softmax_temperature"] validate_temperature(temperature) W = cast(Floats2d, model.get_param("W")) b = cast(Floats1d, model.get_param("b")) Y = model.ops.affine(X, W, b) if normalize: Y = model.ops.softmax(Y, temperature=temperature) array_info = ArrayInfo.from_array(Y) def backprop(dY: InT) -> OutT: array_info.check_consistency(dY) if temperature != 1.0: dY = dY / temperature model.inc_grad("b", dY.sum(axis=0)) model.inc_grad("W", model.ops.gemm(dY, X, trans1=True)) return model.ops.gemm(dY, W) def backprop_unnormalized(dY: InT): msg = "backprop is not supported for an unnormalized Softmax layer" raise ValueError(msg) if normalize: return Y, backprop else: return Y, backprop_unnormalized def init( init_W: Callable, init_b: Callable, model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None, ) -> None: if X is not None and model.has_dim("nI") is None: model.set_dim("nI", get_width(X)) if Y is not None and model.has_dim("nO") is None: model.set_dim("nO", get_width(Y)) model.set_param("W", init_W(model.ops, (model.get_dim("nO"), model.get_dim("nI")))) model.set_param("b", init_b(model.ops, (model.get_dim("nO"),))) def validate_temperature(temperature): if temperature <= 0.0: msg = "softmax temperature must not be zero or negative" raise ValueError(msg) thinc-release-v9.1.1/thinc/layers/softmax_activation.py000066400000000000000000000010361467064331700233260ustar00rootroot00000000000000from typing import Callable, Tuple from ..config import registry from ..model import Model from ..types import Floats2d InT = Floats2d OutT = Floats2d @registry.layers("softmax_activation.v1") def softmax_activation() -> Model[InT, OutT]: return Model("softmax_activation", forward) def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: Y = model.ops.softmax(X, inplace=False) def backprop(dY: OutT) -> InT: return model.ops.backprop_softmax(Y, dY, axis=-1) return Y, backprop thinc-release-v9.1.1/thinc/layers/sparselinear.pyx000066400000000000000000000177571467064331700223250ustar00rootroot00000000000000# cython: infer_types=True, cdivision=True, bounds_check=False, wraparound=False, profile=False cimport cython cimport numpy as np from libc.stdint cimport int32_t, uint32_t, uint64_t from typing import Callable, Optional, Tuple from ..backends import CupyOps, NumpyOps from ..config import registry from ..model import Model from ..types import ArrayXd from ..util import get_array_module, get_width, is_cupy_array, is_numpy_array InT = Tuple[ArrayXd, ArrayXd, ArrayXd] OutT = ArrayXd @cython.binding(True) @registry.layers("SparseLinear.v1") def SparseLinear(nO: Optional[int] = None, length: int = 2 ** 18): # NB: We can't have generic return type annotation if we want function to # be bound (and inspectable): https://github.com/cython/cython/issues/2753 return Model( "sparse_linear", forward, init=init, params={"W": None, "b": None}, dims={"nO": nO, "length": length}, attrs={"v1_indexing": True}, ) @cython.binding(True) @registry.layers("SparseLinear.v2") def SparseLinear_v2(nO: Optional[int] = None, length: int = 2 ** 18): # NB: We can't have generic return type annotation if we want function to # be bound (and inspectable): https://github.com/cython/cython/issues/2753 return Model( "sparse_linear", forward, init=init, params={"W": None, "b": None}, dims={"nO": nO, "length": length}, attrs={"v1_indexing": False}, ) @cython.binding(True) def forward(model: Model, keys_values_lengths: InT, is_train: bool) -> Tuple[OutT, Callable]: # NB: We can't have generic Model annotation if we want function to # be bound (and inspectable): https://github.com/cython/cython/issues/2753 keys, values, lengths = keys_values_lengths if is_cupy_array(keys): # Currently we don't have a GPU-compatible implementation of this function :( # It sucks, but at least we can get the correct result by copying to CPU. return _begin_gpu_update(model, keys, values, lengths) else: return _begin_cpu_update(model, keys, values, lengths) def init(model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None) -> Model[InT, OutT]: if Y is not None: model.set_dim("nO", get_width(Y)) nO = model.get_dim("nO") length = model.get_dim("length") model.set_param("W", model.ops.alloc((nO * length,), dtype="f")) model.set_param("b", model.ops.alloc((nO,), dtype="f")) return model def _begin_gpu_update(model: Model[InT, OutT], keys: ArrayXd, values: ArrayXd, lengths: ArrayXd) -> Tuple[ArrayXd, Callable]: xp = get_array_module(keys) scores_cpu, callback = _begin_cpu_update(model, keys.get(), values.get(), lengths.get()) def backprop_gpu_update(d_scores: ArrayXd) -> Tuple[ArrayXd, ArrayXd, ArrayXd]: callback(d_scores.get()) return (keys, values, lengths) return xp.asarray(scores_cpu), backprop_gpu_update def _begin_cpu_update(model, np.ndarray keys, np.ndarray values, np.ndarray lengths): cdef int nO = model.get_dim("nO") cdef int length = model.get_dim("length") cdef np.ndarray W = model.get_param("W") cdef np.ndarray b = model.get_param("b") cdef np.ndarray scores = model.ops.alloc((len(lengths), nO)) cdef bint v1_indexing = model.attrs["v1_indexing"] scores += b set_scoresC(scores.data, keys.data, values.data, lengths.data, lengths.shape[0], nO, W.data, length, v1_indexing) return scores, _finish_linear_update(model, keys, values, lengths) class _finish_linear_update: """Move this out of a closure, into its own callable object, to avoid pickling errors :(.""" def __init__(self, model, keys, values, lengths): self.model = model self.keys = keys self.values = values self.lengths = lengths def __call__(self, float[:, ::1] d_scores): nO = self.model.get_dim("nO") length = self.model.get_dim("length") cdef np.ndarray d_weights = self.model.ops.alloc((nO*length,)) cdef np.ndarray d_bias = self.model.ops.alloc((nO,)) cdef np.ndarray keys = self.keys cdef np.ndarray values = self.values cdef np.ndarray lengths = self.lengths cdef bint v1_indexing = self.model.attrs["v1_indexing"] set_gradientC(d_weights.data, keys.data, values.data, lengths.data, lengths.shape[0], nO, &d_scores[0,0], length, v1_indexing) cdef int i, j for i in range(d_scores.shape[0]): for j in range(d_scores.shape[1]): d_bias[j] += d_scores[i, j] self.model.inc_grad("W", d_weights) self.model.inc_grad("b", d_bias) return (self.keys, self.values, self.lengths) # v1_indexing is invalid and only uses a subset of the weight matrix, v1 # indexing is provided here for compatibility. See #752 for more information. cdef void set_scoresC(float* scores, const uint64_t* keys, const float* values, const int32_t* lengths, int batch_size, int nr_out, const float* weights, int nr_weight, bint v1_indexing) nogil: cdef uint32_t idx1, idx2 cdef uint32_t hash1, hash2 for length in lengths[:batch_size]: for i in range(length): hash1 = MurmurHash3_x86_32_uint64(keys[i], 0) hash2 = MurmurHash3_x86_32_uint64(keys[i], 1) if v1_indexing: idx1 = hash1 & (nr_weight-1) idx2 = hash2 & (nr_weight-1) else: idx1 = hash1 % nr_weight idx2 = hash2 % nr_weight value = values[i] for clas in range(nr_out): if v1_indexing: scores[clas] += weights[idx1 + clas] * value scores[clas] += weights[idx2 + clas] * value else: scores[clas] += weights[(clas * nr_weight) + idx1] * value scores[clas] += weights[(clas * nr_weight) + idx2] * value scores += nr_out keys += length values += length # v1_indexing is invalid and only uses a subset of the weight matrix, v1 # indexing is provided here for compatibility. See #752 for more information. cdef void set_gradientC(float* d_weights, const uint64_t* keys, const float* values, const int32_t* lengths, int batch_size, int nr_out, const float* d_scores, int nr_weight, bint v1_indexing) nogil: cdef uint32_t idx1, idx2 cdef uint32_t hash1, hash2 for length in lengths[:batch_size]: for i in range(length): hash1 = MurmurHash3_x86_32_uint64(keys[i], 0) hash2 = MurmurHash3_x86_32_uint64(keys[i], 1) if v1_indexing: idx1 = hash1 & (nr_weight-1) idx2 = hash2 & (nr_weight-1) else: idx1 = hash1 % nr_weight idx2 = hash2 % nr_weight value = values[i] for clas in range(nr_out): if v1_indexing: d_weights[idx1 + clas] += d_scores[clas] * value d_weights[idx2 + clas] += d_scores[clas] * value else: d_weights[(clas * nr_weight) + idx1] += d_scores[clas] * value d_weights[(clas * nr_weight) + idx2] += d_scores[clas] * value d_scores += nr_out keys += length values += length cdef uint32_t MurmurHash3_x86_32_uint64(uint64_t key, uint32_t seed) nogil: cdef uint32_t h1 = seed cdef uint32_t c1 = 0xcc9e2d51u cdef uint32_t c2 = 0x1b873593u cdef uint32_t k1 k1 = key & 0xffffffffu k1 *= c1 k1 = (k1 << 15) | (k1 >> 17) k1 *= c2 h1 ^= k1 h1 = (h1 << 13) | (h1 >> 19) h1 = h1*5+0xe6546b64u k1 = key >> 32 k1 *= c1 k1 = (k1 << 15) | (k1 >> 17) k1 *= c2 h1 ^= k1 h1 = (h1 << 13) | (h1 >> 19) h1 = h1*5+0xe6546b64u h1 ^= 8 h1 ^= h1 >> 16 h1 *= 0x85ebca6bu h1 ^= h1 >> 13 h1 *= 0xc2b2ae35u h1 ^= h1 >> 16 return h1 thinc-release-v9.1.1/thinc/layers/strings2arrays.py000066400000000000000000000016711467064331700224260ustar00rootroot00000000000000from ctypes import c_uint64 from typing import Callable, List, Sequence, Tuple from murmurhash import hash_unicode from ..config import registry from ..model import Model from ..types import Ints2d InT = Sequence[Sequence[str]] OutT = List[Ints2d] @registry.layers("strings2arrays.v1") def strings2arrays() -> Model[InT, OutT]: """Transform a sequence of string sequences to a list of arrays.""" return Model("strings2arrays", forward) def forward(model: Model[InT, OutT], Xs: InT, is_train: bool) -> Tuple[OutT, Callable]: # Cast 32-bit (signed) integer to 64-bit unsigned, since such casting # is deprecated in NumPy. hashes = [[c_uint64(hash_unicode(word)).value for word in X] for X in Xs] hash_arrays = [model.ops.asarray1i(h, dtype="uint64") for h in hashes] arrays = [model.ops.reshape2i(array, -1, 1) for array in hash_arrays] def backprop(dX: OutT) -> InT: return [] return arrays, backprop thinc-release-v9.1.1/thinc/layers/swish.py000066400000000000000000000041201467064331700205560ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, cast from ..config import registry from ..initializers import he_normal_init, zero_init from ..model import Model from ..types import Floats1d, Floats2d from ..util import get_width, partial from .chain import chain from .dropout import Dropout from .layernorm import LayerNorm @registry.layers("Swish.v1") def Swish( nO: Optional[int] = None, nI: Optional[int] = None, *, init_W: Optional[Callable] = None, init_b: Optional[Callable] = None, dropout: Optional[float] = None, normalize: bool = False, ) -> Model[Floats2d, Floats2d]: if init_W is None: init_W = he_normal_init if init_b is None: init_b = zero_init model: Model[Floats2d, Floats2d] = Model( "swish", forward, init=partial(init, init_W, init_b), dims={"nO": nO, "nI": nI}, params={"W": None, "b": None}, ) if normalize: model = chain(model, LayerNorm(nI=nO)) if dropout is not None: model = chain(model, cast(Model[Floats2d, Floats2d], Dropout(dropout))) return model def forward( model: Model[Floats2d, Floats2d], X: Floats2d, is_train: bool ) -> Tuple[Floats2d, Callable]: W = cast(Floats2d, model.get_param("W")) b = cast(Floats1d, model.get_param("b")) Y_preact = model.ops.affine(X, W, b) Y = model.ops.swish(Y_preact) def backprop(dY: Floats2d) -> Floats2d: dY = model.ops.backprop_swish(dY, Y_preact, Y, inplace=False) model.inc_grad("b", dY.sum(axis=0)) model.inc_grad("W", model.ops.gemm(dY, X, trans1=True)) return model.ops.gemm(dY, W) return Y, backprop def init( init_W: Callable, init_b: Callable, model: Model[Floats2d, Floats2d], X: Optional[Floats2d] = None, Y: Optional[Floats2d] = None, ) -> None: if X is not None: model.set_dim("nI", get_width(X)) if Y is not None: model.set_dim("nO", get_width(Y)) model.set_param("W", init_W(model.ops, (model.get_dim("nO"), model.get_dim("nI")))) model.set_param("b", init_b(model.ops, (model.get_dim("nO"),))) thinc-release-v9.1.1/thinc/layers/tensorflowwrapper.py000066400000000000000000000146251467064331700232370ustar00rootroot00000000000000# mypy: ignore-errors from typing import Any, Callable, Dict, Optional, Tuple, Type, TypeVar import srsly from ..compat import tensorflow as tf from ..model import Model from ..shims import TensorFlowShim, keras_model_fns, maybe_handshake_model from ..types import ArgsKwargs, ArrayXd from ..util import ( assert_tensorflow_installed, convert_recursive, is_tensorflow_array, is_xp_array, tensorflow2xp, xp2tensorflow, ) InT = TypeVar("InT") OutT = TypeVar("OutT") InFunc = TypeVar("InFunc") XType = TypeVar("XType", bound=ArrayXd) YType = TypeVar("YType", bound=ArrayXd) def keras_subclass( name: str, X: XType, Y: YType, input_shape: Tuple[int, ...], compile_args: Optional[Dict[str, Any]] = None, ) -> Callable[[InFunc], InFunc]: """Decorate a custom keras subclassed model with enough information to serialize and deserialize it reliably in the face of the many restrictions on keras subclassed models. name (str): The unique namespace string to use to represent this model class. X (Any): A sample X input for performing a forward pass on the network. Y (Any): A sample Y input for performing a backward pass on the network. input_shape (Tuple[int, ...]): A set of input shapes for building the network. compile: Arguments to pass directly to the keras `model.compile` call. RETURNS (Callable): The decorated class. """ compile_defaults = {"optimizer": "adam", "loss": "mse"} if compile_args is None: compile_args = compile_defaults else: compile_args = {**compile_defaults, **compile_args} def call_fn(clazz): clazz.catalogue_name = property(lambda inst: name) clazz.eg_shape = property(lambda inst: input_shape) clazz.eg_compile = property(lambda inst: compile_args) clazz.eg_x = property(lambda inst: X) clazz.eg_y = property(lambda inst: Y) @keras_model_fns(name) def create_component(*call_args, **call_kwargs): return clazz(*call_args, **call_kwargs) # Capture construction args and store them on the instance wrapped_init = clazz.__init__ def __init__(self, *args, **kwargs): wrapped_init(self, *args, **kwargs) try: srsly.json_dumps(args) srsly.json_dumps(kwargs) except BaseException as _err: raise ValueError( "In order to serialize Keras Subclass models, the constructor " "arguments must be serializable. This allows thinc to recreate " "the code-based model with the same configuration.\n" f"The encountered error is: {_err}" ) self.eg_args = ArgsKwargs(args, kwargs) clazz.__init__ = __init__ return clazz return call_fn def TensorFlowWrapper( tensorflow_model: Any, convert_inputs: Optional[Callable] = None, convert_outputs: Optional[Callable] = None, optimizer: Optional[Any] = None, model_class: Type[Model] = Model, model_name: str = "tensorflow", ) -> Model[InT, OutT]: """Wrap a TensorFlow model, so that it has the same API as Thinc models. To optimize the model, you'll need to create a TensorFlow optimizer and call optimizer.apply_gradients after each batch. """ assert_tensorflow_installed() if not isinstance(tensorflow_model, tf.keras.models.Model): err = f"Expected tf.keras.models.Model, got: {type(tensorflow_model)}" raise ValueError(err) tensorflow_model = maybe_handshake_model(tensorflow_model) if convert_inputs is None: convert_inputs = _convert_inputs if convert_outputs is None: convert_outputs = _convert_outputs return model_class( model_name, forward, shims=[TensorFlowShim(tensorflow_model, optimizer=optimizer)], attrs={"convert_inputs": convert_inputs, "convert_outputs": convert_outputs}, ) def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: """Return the output of the wrapped TensorFlow model for the given input, along with a callback to handle the backward pass. """ convert_inputs = model.attrs["convert_inputs"] convert_outputs = model.attrs["convert_outputs"] tensorflow_model = model.shims[0] X_tensorflow, get_dX = convert_inputs(model, X, is_train) if is_train: Y_tensorflow, tensorflow_backprop = tensorflow_model(X_tensorflow, is_train) else: Y_tensorflow = tensorflow_model(X_tensorflow, is_train) Y, get_dY_tensorflow = convert_outputs(model, Y_tensorflow, is_train) def backprop(dY: OutT) -> InT: dY_tensorflow = get_dY_tensorflow(dY) dX_tensorflow = tensorflow_backprop(dY_tensorflow) return get_dX(dX_tensorflow) return Y, backprop # Default conversion functions # These are pretty much the same as the PyTorch one, but I think we should # leave the duplication -- I think the abstraction could get pretty messy, # and then may need to be undone, as there can always be different specifics. def _convert_inputs(model, X, is_train): xp2tensorflow_ = lambda x: xp2tensorflow(x, requires_grad=is_train) converted = convert_recursive(is_xp_array, xp2tensorflow_, X) if isinstance(converted, ArgsKwargs): def reverse_conversion(dXtf): return convert_recursive(is_tensorflow_array, tensorflow2xp, dXtf) return converted, reverse_conversion elif isinstance(converted, dict): def reverse_conversion(dXtf): dX = convert_recursive(is_tensorflow_array, tensorflow2xp, dXtf) return dX.kwargs return ArgsKwargs(args=tuple(), kwargs=converted), reverse_conversion elif isinstance(converted, (tuple, list)): def reverse_conversion(dXtf): dX = convert_recursive(is_tensorflow_array, tensorflow2xp, dXtf) return dX.args return ArgsKwargs(args=converted, kwargs={}), reverse_conversion else: def reverse_conversion(dXtf): dX = convert_recursive(is_tensorflow_array, tensorflow2xp, dXtf) return dX.args[0] return ArgsKwargs(args=(converted,), kwargs={}), reverse_conversion def _convert_outputs(model, Ytf, is_train): Y = convert_recursive(is_tensorflow_array, tensorflow2xp, Ytf) def reverse_conversion(dY): return convert_recursive(is_xp_array, xp2tensorflow, dY) return Y, reverse_conversion thinc-release-v9.1.1/thinc/layers/torchscriptwrapper.py000066400000000000000000000063141467064331700233750ustar00rootroot00000000000000from typing import Any, Callable, Optional from ..compat import torch from ..model import Model from ..shims import PyTorchGradScaler, PyTorchShim, TorchScriptShim from .pytorchwrapper import ( convert_pytorch_default_inputs, convert_pytorch_default_outputs, forward, ) def TorchScriptWrapper_v1( torchscript_model: Optional["torch.jit.ScriptModule"] = None, convert_inputs: Optional[Callable] = None, convert_outputs: Optional[Callable] = None, mixed_precision: bool = False, grad_scaler: Optional[PyTorchGradScaler] = None, device: Optional["torch.device"] = None, ) -> Model[Any, Any]: """Wrap a TorchScript model, so that it has the same API as Thinc models. torchscript_model: The TorchScript module. A value of `None` is also possible to construct a shim to deserialize into. convert_inputs: Function that converts inputs and gradients that should be passed to the model to Torch tensors. convert_outputs: Function that converts model outputs and gradients from Torch tensors Thinc arrays. mixed_precision: Enable mixed-precision. This changes whitelisted ops to run in half precision for better performance and lower memory use. grad_scaler: The gradient scaler to use for mixed-precision training. If this argument is set to "None" and mixed precision is enabled, a gradient scaler with the default configuration is used. device: The PyTorch device to run the model on. When this argument is set to "None", the default device for the currently active Thinc ops is used. """ if convert_inputs is None: convert_inputs = convert_pytorch_default_inputs if convert_outputs is None: convert_outputs = convert_pytorch_default_outputs return Model( "pytorch_script", forward, attrs={"convert_inputs": convert_inputs, "convert_outputs": convert_outputs}, shims=[ TorchScriptShim( model=torchscript_model, mixed_precision=mixed_precision, grad_scaler=grad_scaler, device=device, ) ], dims={"nI": None, "nO": None}, ) def pytorch_to_torchscript_wrapper(model: Model): """Convert a PyTorch wrapper to a TorchScript wrapper. The embedded PyTorch `Module` is converted to `ScriptModule`. """ shim = model.shims[0] if not isinstance(shim, PyTorchShim): raise ValueError("Expected PyTorchShim when converting a PyTorch wrapper") convert_inputs = model.attrs["convert_inputs"] convert_outputs = model.attrs["convert_outputs"] pytorch_model = shim._model if not isinstance(pytorch_model, torch.nn.Module): raise ValueError("PyTorchShim does not wrap a PyTorch module") torchscript_model = torch.jit.script(pytorch_model) grad_scaler = shim._grad_scaler mixed_precision = shim._mixed_precision device = shim.device return TorchScriptWrapper_v1( torchscript_model, convert_inputs=convert_inputs, convert_outputs=convert_outputs, mixed_precision=mixed_precision, grad_scaler=grad_scaler, device=device, ) thinc-release-v9.1.1/thinc/layers/tuplify.py000066400000000000000000000037421467064331700211260ustar00rootroot00000000000000from typing import Any, Optional, Tuple, TypeVar from ..config import registry from ..model import Model InT = TypeVar("InT") OutT = Tuple @registry.layers("tuplify.v1") def tuplify( layer1: Model[InT, Any], layer2: Model[InT, Any], *layers ) -> Model[InT, Tuple]: """Send a separate copy of the input to each child layer, and join the outputs of the children into a tuple on the way out. Typically used to provide both modified data and the original input to a downstream layer. """ layers = (layer1, layer2) + layers names = [layer.name for layer in layers] return Model( "tuple(" + ", ".join(names) + ")", tuplify_forward, init=init, layers=layers, dims={"nI": None}, ) def tuplify_forward(model, X, is_train): Ys = [] backprops = [] for layer in model.layers: Y, backprop = layer(X, is_train) Ys.append(Y) backprops.append(backprop) def backprop_tuplify(dYs): dXs = [bp(dY) for bp, dY in zip(backprops, dYs)] dX = dXs[0] for dx in dXs[1:]: dX += dx return dX return tuple(Ys), backprop_tuplify def init( model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None ) -> None: if X is None and Y is None: for layer in model.layers: layer.initialize() if model.layers[0].has_dim("nI"): model.set_dim("nI", model.layers[0].get_dim("nI")) # Try to set nO on each layer, where available. # All layers have the same input, and the output should map directly from the # given Y, if provided. for ii, layer in enumerate(model.layers): if Y is not None and layer.has_dim("nO") is None: layer.initialize(X=X, Y=Y[ii]) else: layer.initialize(X=X) if model.layers[0].has_dim("nI"): model.set_dim("nI", model.layers[0].get_dim("nI")) # this model can have an input dimension, but can't have an output dimension thinc-release-v9.1.1/thinc/layers/uniqued.py000066400000000000000000000040151467064331700210760ustar00rootroot00000000000000from typing import Callable, Optional, Tuple import numpy from ..config import registry from ..model import Model from ..types import Floats2d, Ints2d InT = Ints2d OutT = Floats2d @registry.layers("uniqued.v1") def uniqued(layer: Model, *, column: int = 0) -> Model[InT, OutT]: """Group inputs to a layer, so that the layer only has to compute for the unique values. The data is transformed back before output, and the same transformation is applied for the gradient. Effectively, this is a cache local to each minibatch. """ return Model( f"uniqued({layer.name})", forward, init=init, layers=[layer], dims={"nO": None, "nI": None}, attrs={"column": column}, ) def forward(model: Model[InT, OutT], X: InT, is_train: bool) -> Tuple[OutT, Callable]: column: int = model.attrs["column"] layer = model.layers[0] if X.size < 2: return layer(X, is_train) keys = X[:, column] if not isinstance(keys, numpy.ndarray): keys = keys.get() # pragma: no cover uniq_keys, ind, inv, counts = layer.ops.xp.unique( keys, return_index=True, return_inverse=True, return_counts=True ) counts = model.ops.reshape2i(counts, -1, 1) X_uniq = X[ind] Y_uniq, bp_Y_uniq = layer(X_uniq, is_train) Y = Y_uniq[inv].reshape((X.shape[0],) + Y_uniq.shape[1:]) uniq_shape = tuple(Y_uniq.shape) def backprop(dY: OutT) -> InT: dY_uniq = layer.ops.alloc2f(*uniq_shape) layer.ops.scatter_add(dY_uniq, layer.ops.asarray_i(inv), dY) d_uniques = bp_Y_uniq(dY_uniq) # This confusing bit of indexing "ununiques" return (d_uniques / counts)[inv] return Y, backprop def init( model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None ) -> None: layer = model.layers[0] layer.initialize(X=X, Y=Y) if layer.has_dim("nI"): model.set_dim("nI", layer.get_dim("nI")) # pragma: no cover if layer.has_dim("nO"): model.set_dim("nO", layer.get_dim("nO")) thinc-release-v9.1.1/thinc/layers/with_array.py000066400000000000000000000067721467064331700216110ustar00rootroot00000000000000from typing import Callable, Optional, Tuple, TypeVar, Union, cast from ..backends import NumpyOps from ..config import registry from ..model import Model from ..types import Array3d, ArrayXd, ListXd, Padded, Ragged NUMPY_OPS = NumpyOps() ArrayTXd = TypeVar("ArrayTXd", bound=ArrayXd) SeqT = TypeVar("SeqT", bound=Union[Padded, Ragged, ListXd, ArrayXd]) @registry.layers("with_array.v1") def with_array(layer: Model[ArrayTXd, ArrayTXd], pad: int = 0) -> Model[SeqT, SeqT]: """Transform sequence data into a contiguous array on the way into and out of a model. Handles a variety of sequence types: lists, padded and ragged. If the input is an array, it is passed through unchanged. """ model: Model[SeqT, SeqT] = Model( f"with_array({layer.name})", forward, init=init, layers=[layer], attrs={"pad": pad}, dims={name: layer.maybe_get_dim(name) for name in layer.dim_names}, ) return model def forward( model: Model[SeqT, SeqT], Xseq: SeqT, is_train: bool ) -> Tuple[SeqT, Callable]: if isinstance(Xseq, Ragged): return cast(Tuple[SeqT, Callable], _ragged_forward(model, Xseq, is_train)) elif isinstance(Xseq, Padded): return cast(Tuple[SeqT, Callable], _padded_forward(model, Xseq, is_train)) elif not isinstance(Xseq, (list, tuple)): return model.layers[0](Xseq, is_train) else: return cast(Tuple[SeqT, Callable], _list_forward(model, Xseq, is_train)) def init( model: Model[SeqT, SeqT], X: Optional[SeqT] = None, Y: Optional[SeqT] = None ) -> None: layer: Model[ArrayXd, ArrayXd] = model.layers[0] layer.initialize( X=_get_array(model, X) if X is not None else X, Y=_get_array(model, Y) if Y is not None else Y, ) for dim_name in layer.dim_names: value = layer.maybe_get_dim(dim_name) if value is not None: model.set_dim(dim_name, value) def _get_array(model, X: SeqT) -> ArrayXd: if isinstance(X, Ragged): return X.dataXd elif isinstance(X, Padded): return X.data elif not isinstance(X, (list, tuple)): return cast(ArrayXd, X) else: return model.ops.flatten(X) def _list_forward( model: Model[SeqT, SeqT], Xs: ListXd, is_train: bool ) -> Tuple[ListXd, Callable]: layer: Model[ArrayXd, ArrayXd] = model.layers[0] pad = model.attrs["pad"] lengths = NUMPY_OPS.asarray1i([len(seq) for seq in Xs]) Xf = layer.ops.flatten(Xs, pad=pad) Yf, get_dXf = layer(Xf, is_train) def backprop(dYs: ListXd) -> ListXd: dYf = layer.ops.flatten(dYs, pad=pad) dXf = get_dXf(dYf) return layer.ops.unflatten(dXf, lengths, pad=pad) return layer.ops.unflatten(Yf, lengths, pad=pad), backprop def _ragged_forward( model: Model[SeqT, SeqT], Xr: Ragged, is_train: bool ) -> Tuple[Ragged, Callable]: layer: Model[ArrayXd, ArrayXd] = model.layers[0] Y, get_dX = layer(Xr.dataXd, is_train) def backprop(dYr: Ragged) -> Ragged: return Ragged(get_dX(dYr.dataXd), dYr.lengths) return Ragged(Y, Xr.lengths), backprop def _padded_forward( model: Model[SeqT, SeqT], Xp: Padded, is_train: bool ) -> Tuple[Padded, Callable]: layer: Model[Array3d, Array3d] = model.layers[0] Y, get_dX = layer(Xp.data, is_train) def backprop(dYp: Padded) -> Padded: assert isinstance(dYp, Padded) dX = get_dX(dYp.data) return Padded(dX, dYp.size_at_t, dYp.lengths, dYp.indices) return Padded(Y, Xp.size_at_t, Xp.lengths, Xp.indices), backprop thinc-release-v9.1.1/thinc/layers/with_array2d.py000066400000000000000000000100501467064331700220170ustar00rootroot00000000000000from typing import Callable, List, Optional, Tuple, TypeVar, Union, cast from ..backends import NumpyOps from ..config import registry from ..model import Model from ..types import Array2d, Floats2d, List2d, Padded, Ragged NUMPY_OPS = NumpyOps() ValT = TypeVar("ValT", bound=Array2d) SeqT = TypeVar("SeqT", bound=Union[Padded, Ragged, List2d, Array2d]) @registry.layers("with_array2d.v1") def with_array2d(layer: Model[ValT, ValT], pad: int = 0) -> Model[SeqT, SeqT]: """Transform sequence data into a contiguous 2d array on the way into and out of a model. Handles a variety of sequence types: lists, padded and ragged. If the input is a 2d array, it is passed through unchanged. """ return Model( f"with_array({layer.name})", forward, init=init, layers=[layer], attrs={"pad": pad}, dims={name: layer.maybe_get_dim(name) for name in layer.dim_names}, ) def forward( model: Model[SeqT, SeqT], Xseq: SeqT, is_train: bool ) -> Tuple[SeqT, Callable]: if isinstance(Xseq, Ragged): return cast(Tuple[SeqT, Callable], _ragged_forward(model, Xseq, is_train)) elif isinstance(Xseq, Padded): return cast(Tuple[SeqT, Callable], _padded_forward(model, Xseq, is_train)) elif not isinstance(Xseq, (list, tuple)): return model.layers[0](Xseq, is_train) else: return cast(Tuple[SeqT, Callable], _list_forward(model, Xseq, is_train)) return def init( model: Model[SeqT, SeqT], X: Optional[SeqT] = None, Y: Optional[SeqT] = None ) -> None: layer: Model[Array2d, Array2d] = model.layers[0] layer.initialize( X=_get_array(model, X) if X is not None else X, Y=_get_array(model, Y) if Y is not None else Y, ) for dim_name in layer.dim_names: value = layer.maybe_get_dim(dim_name) if value is not None: model.set_dim(dim_name, value) def _get_array(model, X: SeqT) -> Array2d: if isinstance(X, Ragged): return X.data elif isinstance(X, Padded): return model.ops.reshape2f( X.data, X.data.shape[0] * X.data.shape[1], X.data.shape[2] ) elif not isinstance(X, (list, tuple)): return cast(Array2d, X) else: return model.ops.flatten(X) def _list_forward( model: Model[SeqT, SeqT], Xs: List2d, is_train: bool ) -> Tuple[List2d, Callable]: layer: Model[Array2d, Array2d] = model.layers[0] pad = model.attrs["pad"] lengths = NUMPY_OPS.asarray1i([len(seq) for seq in Xs]) Xf = layer.ops.flatten(Xs, pad=pad) Yf, get_dXf = layer(Xf, is_train) def backprop(dYs: List2d) -> List2d: dYf = layer.ops.flatten(dYs, pad=pad) dXf = get_dXf(dYf) return layer.ops.unflatten(dXf, lengths, pad=pad) return layer.ops.unflatten(Yf, lengths, pad=pad), backprop def _ragged_forward( model: Model[SeqT, SeqT], Xr: Ragged, is_train: bool ) -> Tuple[Ragged, Callable]: layer: Model[Array2d, Array2d] = model.layers[0] Y, get_dX = layer(Xr.data, is_train) x_shape = Xr.dataXd.shape def backprop(dYr: Ragged) -> Ragged: return Ragged(get_dX(dYr.dataXd).reshape(x_shape), dYr.lengths) return Ragged(Y, Xr.lengths), backprop def _padded_forward( model: Model[SeqT, SeqT], Xp: Padded, is_train: bool ) -> Tuple[Padded, Callable]: layer: Model[Array2d, Array2d] = model.layers[0] X = model.ops.reshape2( Xp.data, Xp.data.shape[0] * Xp.data.shape[1], Xp.data.shape[2] ) Y2d, get_dX = layer(X, is_train) Y = model.ops.reshape3f( cast(Floats2d, Y2d), Xp.data.shape[0], Xp.data.shape[1], Y2d.shape[1] ) def backprop(dYp: Padded) -> Padded: assert isinstance(dYp, Padded) dY = model.ops.reshape2( dYp.data, dYp.data.shape[0] * dYp.data.shape[1], dYp.data.shape[2] ) dX2d = get_dX(dY) dX = model.ops.reshape3f( dX2d, dYp.data.shape[0], dYp.data.shape[1], dX2d.shape[1] ) return Padded(dX, dYp.size_at_t, dYp.lengths, dYp.indices) return Padded(Y, Xp.size_at_t, Xp.lengths, Xp.indices), backprop thinc-release-v9.1.1/thinc/layers/with_cpu.py000066400000000000000000000026231467064331700212510ustar00rootroot00000000000000from typing import Any, Callable, Tuple import numpy from thinc.backends import Ops from ..config import registry from ..model import Model @registry.layers("with_cpu.v1") def with_cpu(layer: Model, ops: Ops) -> Model: layer.to_cpu() return Model( f"with_cpu({layer.name})", forward, layers=[layer], ops=ops, init=init, dims={name: layer.maybe_get_dim(name) for name in layer.dim_names}, ) def forward(model: Model, X: Any, is_train: bool) -> Tuple[Any, Callable]: cpu_outputs, backprop = model.layers[0].begin_update(_to_cpu(X)) gpu_outputs = _to_device(model.ops, cpu_outputs) def with_cpu_backprop(d_outputs): cpu_d_outputs = _to_cpu(d_outputs) return backprop(cpu_d_outputs) return gpu_outputs, with_cpu_backprop def init(model: Model, X: Any, Y: Any) -> None: model.layers[0].initialize(X, Y) def _to_cpu(X): if isinstance(X, numpy.ndarray): return X elif isinstance(X, tuple): return tuple([_to_cpu(x) for x in X]) elif isinstance(X, list): return [_to_cpu(x) for x in X] elif hasattr(X, "get"): return X.get() else: return X def _to_device(ops, X): if isinstance(X, tuple): return tuple([_to_device(ops, x) for x in X]) elif isinstance(X, list): return [_to_device(ops, x) for x in X] else: return ops.asarray(X) thinc-release-v9.1.1/thinc/layers/with_debug.py000066400000000000000000000024651467064331700215540ustar00rootroot00000000000000from typing import Any, Callable, Optional, Tuple, TypeVar from ..model import Model _ModelT = TypeVar("_ModelT", bound=Model) do_nothing = lambda *args, **kwargs: None def with_debug( layer: _ModelT, name: Optional[str] = None, *, on_init: Callable[[Model, Any, Any], None] = do_nothing, on_forward: Callable[[Model, Any, bool], None] = do_nothing, on_backprop: Callable[[Any], None] = do_nothing, ) -> _ModelT: """Debugging layer that wraps any layer and allows executing callbacks during the forward pass, backward pass and initialization. The callbacks will receive the same arguments as the functions they're called in. """ name = layer.name if name is None else name orig_forward = layer._func orig_init = layer.init def forward(model: Model, X: Any, is_train: bool) -> Tuple[Any, Callable]: on_forward(model, X, is_train) layer_Y, layer_callback = orig_forward(layer, X, is_train=is_train) def backprop(dY: Any) -> Any: on_backprop(dY) return layer_callback(dY) return layer_Y, backprop def init(model: Model, X: Any, Y: Any) -> None: on_init(model, X, Y) if orig_init is not None: orig_init(layer, X, Y) layer.replace_callbacks(forward, init=init) return layer thinc-release-v9.1.1/thinc/layers/with_flatten.py000066400000000000000000000032121467064331700221120ustar00rootroot00000000000000from typing import Any, Callable, List, Optional, Sequence, Tuple, TypeVar, cast from ..config import registry from ..model import Model from ..types import ArrayXd, ListXd ItemT = TypeVar("ItemT") InT = Sequence[Sequence[ItemT]] OutT = ListXd InnerInT = Sequence[ItemT] InnerOutT = ArrayXd @registry.layers("with_flatten.v1") def with_flatten(layer: Model[InnerInT[ItemT], InnerOutT]) -> Model[InT[ItemT], OutT]: return Model(f"with_flatten({layer.name})", forward, layers=[layer], init=init) def forward( model: Model[InT, OutT], Xnest: InT, is_train: bool ) -> Tuple[OutT, Callable]: layer: Model[InnerInT, InnerOutT] = model.layers[0] Xflat = _flatten(Xnest) Yflat, backprop_layer = layer(Xflat, is_train) # Get the split points. We want n-1 splits for n items. arr = layer.ops.asarray1i([len(x) for x in Xnest[:-1]]) splits = arr.cumsum() Ynest = layer.ops.xp.split(Yflat, splits, axis=0) def backprop(dYnest: OutT) -> InT: dYflat = model.ops.flatten(dYnest) # type: ignore[arg-type, var-annotated] # type ignore necessary for older versions of Mypy/Pydantic dXflat = backprop_layer(dYflat) dXnest = layer.ops.xp.split(dXflat, splits, axis=-1) return dXnest return Ynest, backprop def _flatten(nested: InT) -> InnerInT: flat: List = [] for item in nested: flat.extend(item) return cast(InT, flat) def init( model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None ) -> None: model.layers[0].initialize( _flatten(X) if X is not None else None, model.layers[0].ops.xp.hstack(Y) if Y is not None else None, ) thinc-release-v9.1.1/thinc/layers/with_flatten_v2.py000066400000000000000000000036411467064331700225270ustar00rootroot00000000000000from typing import Any, Callable, List, Optional, Sequence, Tuple, TypeVar, cast from ..config import registry from ..model import Model InItemT = TypeVar("InItemT") OutItemT = TypeVar("OutItemT") ItemT = TypeVar("ItemT") NestedT = List[List[ItemT]] FlatT = List[ItemT] @registry.layers("with_flatten.v2") def with_flatten_v2( layer: Model[FlatT[InItemT], FlatT[OutItemT]] ) -> Model[NestedT[InItemT], NestedT[OutItemT]]: return Model(f"with_flatten({layer.name})", forward, layers=[layer], init=init) def forward( model: Model[NestedT[InItemT], NestedT[OutItemT]], Xnest: NestedT[InItemT], is_train: bool, ) -> Tuple[NestedT[OutItemT], Callable]: layer: Model[FlatT[InItemT], FlatT[OutItemT]] = model.layers[0] Xflat, lens = _flatten(Xnest) Yflat, backprop_layer = layer(Xflat, is_train) Ynest = _unflatten(Yflat, lens) def backprop(dYnest: NestedT[InItemT]) -> NestedT[OutItemT]: dYflat, _ = _flatten(dYnest) # type: ignore[arg-type, var-annotated] # type ignore necessary for older versions of Mypy/Pydantic dXflat = backprop_layer(dYflat) dXnest = _unflatten(dXflat, lens) return dXnest return Ynest, backprop def _flatten(nested: NestedT[ItemT]) -> Tuple[FlatT[ItemT], List[int]]: flat: List = [] lens: List[int] = [] for item in nested: flat.extend(item) lens.append(len(item)) return cast(FlatT[ItemT], flat), lens def _unflatten(flat: FlatT[ItemT], lens: List[int]) -> NestedT[ItemT]: nested = [] for l in lens: nested.append(flat[:l]) flat = flat[l:] return nested def init( model: Model[NestedT[InItemT], NestedT[OutItemT]], X: Optional[NestedT[InItemT]] = None, Y: Optional[NestedT[OutItemT]] = None, ) -> None: model.layers[0].initialize( _flatten(X)[0] if X is not None else None, model.layers[0].ops.xp.hstack(Y) if Y is not None else None, ) thinc-release-v9.1.1/thinc/layers/with_getitem.py000066400000000000000000000022171467064331700221170ustar00rootroot00000000000000from typing import Any, Callable, Optional, Tuple from ..config import registry from ..model import Model InT = Tuple[Any, ...] OutT = Tuple[Any, ...] @registry.layers("with_getitem.v1") def with_getitem(idx: int, layer: Model) -> Model[InT, OutT]: """Transform data on the way into and out of a layer, by plucking an item from a tuple. """ return Model( f"with_getitem({layer.name})", forward, init=init, layers=[layer], attrs={"idx": idx}, ) def forward( model: Model[InT, OutT], items: InT, is_train: bool ) -> Tuple[OutT, Callable]: idx = model.attrs["idx"] Y_i, backprop_item = model.layers[0](items[idx], is_train) def backprop(d_output: OutT) -> InT: dY_i = backprop_item(d_output[idx]) return d_output[:idx] + (dY_i,) + d_output[idx + 1 :] return items[:idx] + (Y_i,) + items[idx + 1 :], backprop def init( model: Model[InT, OutT], X: Optional[InT] = None, Y: Optional[OutT] = None ) -> None: idx = model.attrs["idx"] X_i = X[idx] if X is not None else X Y_i = Y[idx] if Y is not None else Y model.layers[0].initialize(X=X_i, Y=Y_i) thinc-release-v9.1.1/thinc/layers/with_list.py000066400000000000000000000055151467064331700214400ustar00rootroot00000000000000from typing import Callable, List, Optional, Tuple, TypeVar, Union, cast from ..config import registry from ..model import Model from ..types import Array2d, Floats2d, Ints2d, List2d, Padded, Ragged SeqT = TypeVar("SeqT", Padded, Ragged, List2d, List[Floats2d], List[Ints2d]) @registry.layers("with_list.v1") def with_list(layer: Model[List2d, List2d]) -> Model[SeqT, SeqT]: return Model( f"with_list({layer.name})", forward, init=init, layers=[layer], dims={name: layer.maybe_get_dim(name) for name in layer.dim_names}, ) def forward( model: Model[SeqT, SeqT], Xseq: SeqT, is_train: bool ) -> Tuple[SeqT, Callable]: layer: Model[List2d, List2d] = model.layers[0] if isinstance(Xseq, Padded): return _padded_forward(layer, Xseq, is_train) elif isinstance(Xseq, Ragged): return _ragged_forward(layer, Xseq, is_train) else: return cast(Tuple[SeqT, Callable], layer(cast(List2d, Xseq), is_train)) def init( model: Model[SeqT, SeqT], X: Optional[SeqT] = None, Y: Optional[SeqT] = None ) -> None: model.layers[0].initialize( X=_get_list(model, X) if X is not None else None, Y=_get_list(model, Y) if Y is not None else None, ) def _get_list(model, seq): if isinstance(seq, Padded): return model.ops.padded2list(seq) elif isinstance(seq, Ragged): return model.ops.unflatten(seq.data, seq.lengths) else: return seq def _ragged_forward( layer: Model[List2d, List2d], Xr: Ragged, is_train: bool ) -> Tuple[Ragged, Callable]: # Assign these to locals, to keep code a bit shorter. unflatten = layer.ops.unflatten flatten = layer.ops.flatten # It's worth being a bit careful about memory here, as the activations # are potentially large on GPU. So we make nested function calls instead # of assigning to temporaries where possible, so memory can be reclaimed # sooner. Ys, get_dXs = layer(unflatten(Xr.data, Xr.lengths), is_train) def backprop(dYr: Ragged): return Ragged( flatten(get_dXs(unflatten(dYr.data, dYr.lengths))), dYr.lengths, ) return Ragged(flatten(Ys), Xr.lengths), backprop def _padded_forward( layer: Model[List2d, List2d], Xp: Padded, is_train: bool ) -> Tuple[Padded, Callable]: # Assign these to locals, to keep code a bit shorter. padded2list = layer.ops.padded2list list2padded = layer.ops.list2padded # It's worth being a bit careful about memory here, as the activations # are potentially large on GPU. So we make nested function calls instead # of assigning to temporaries where possible, so memory can be reclaimed # sooner. Ys, get_dXs = layer(padded2list(Xp), is_train) def backprop(dYp): return list2padded(get_dXs(padded2list(dYp))) return list2padded(Ys), backprop thinc-release-v9.1.1/thinc/layers/with_nvtx_range.py000066400000000000000000000024141467064331700226330ustar00rootroot00000000000000from typing import Any, Callable, Optional, Tuple, TypeVar from ..model import Model from ..util import use_nvtx_range _ModelT = TypeVar("_ModelT", bound=Model) def with_nvtx_range( layer: _ModelT, name: Optional[str] = None, *, forward_color: int = -1, backprop_color: int = -1, ) -> _ModelT: """Wraps any layer and marks the forward and backprop phases as NVTX ranges for CUDA profiling. By default, the name of the layer is used as the name of the range, followed by the name of the pass. """ name = layer.name if name is None else name orig_forward = layer._func orig_init = layer.init def forward(model: Model, X: Any, is_train: bool) -> Tuple[Any, Callable]: with use_nvtx_range(f"{name} forward", forward_color): layer_Y, layer_callback = orig_forward(model, X, is_train=is_train) def backprop(dY: Any) -> Any: with use_nvtx_range(f"{name} backprop", backprop_color): return layer_callback(dY) return layer_Y, backprop def init(_model: Model, X: Any, Y: Any) -> Model: if orig_init is not None: return orig_init(layer, X, Y) else: return layer layer.replace_callbacks(forward, init=init) return layer thinc-release-v9.1.1/thinc/layers/with_padded.py000066400000000000000000000113701467064331700217020ustar00rootroot00000000000000from typing import Callable, List, Optional, Tuple, TypeVar, Union, cast from ..config import registry from ..model import Model from ..types import Array2d, Floats3d, Ints1d, List2d, Padded, Ragged from ..util import is_xp_array PaddedData = Tuple[Floats3d, Ints1d, Ints1d, Ints1d] SeqT = TypeVar("SeqT", bound=Union[Padded, Ragged, List2d, Floats3d, PaddedData]) @registry.layers("with_padded.v1") def with_padded(layer: Model[Padded, Padded]) -> Model[SeqT, SeqT]: return Model( f"with_padded({layer.name})", forward, init=init, layers=[layer], dims={name: layer.maybe_get_dim(name) for name in layer.dim_names}, ) def forward( model: Model[SeqT, SeqT], Xseq: SeqT, is_train: bool ) -> Tuple[SeqT, Callable]: layer: Model[Padded, Padded] = model.layers[0] if isinstance(Xseq, Padded): return cast(Tuple[SeqT, Callable], layer(Xseq, is_train)) elif isinstance(Xseq, Ragged): return cast(Tuple[SeqT, Callable], _ragged_forward(layer, Xseq, is_train)) elif _is_padded_data(Xseq): return cast( Tuple[SeqT, Callable], _tuple_forward(layer, cast(PaddedData, Xseq), is_train), ) elif is_xp_array(Xseq): return cast( Tuple[SeqT, Callable], _array_forward(layer, cast(Floats3d, Xseq), is_train) ) else: return cast( Tuple[SeqT, Callable], _list_forward(layer, cast(List2d, Xseq), is_train) ) def init( model: Model[SeqT, SeqT], X: Optional[SeqT] = None, Y: Optional[SeqT] = None ) -> None: model.layers[0].initialize( X=_get_padded(model, X) if X is not None else None, Y=_get_padded(model, Y) if Y is not None else None, ) def _is_padded_data(seq: SeqT) -> bool: return isinstance(seq, tuple) and len(seq) == 4 and all(map(is_xp_array, seq)) def _get_padded(model: Model, seq: SeqT) -> Padded: if isinstance(seq, Padded): return seq elif isinstance(seq, Ragged): return model.ops.list2padded(model.ops.unflatten(seq.data, seq.lengths)) elif _is_padded_data(seq): return Padded(*seq) # type: ignore[misc] elif is_xp_array(seq): floats3d_seq = cast(Floats3d, seq) size_at_t = model.ops.asarray1i([floats3d_seq.shape[1]] * floats3d_seq.shape[0]) lengths = model.ops.asarray1i([floats3d_seq.shape[0]] * floats3d_seq.shape[1]) indices = model.ops.xp.arange(floats3d_seq.shape[1]) return Padded(floats3d_seq, size_at_t, lengths, indices) else: assert isinstance(seq, list), seq return model.ops.list2padded(seq) def _array_forward( layer: Model[Padded, Padded], X: Floats3d, is_train ) -> Tuple[Floats3d, Callable]: # Create bogus metadata for Padded. Xp = _get_padded(layer, X) Yp, get_dXp = layer(Xp, is_train) size_at_t = Xp.size_at_t lengths = Xp.lengths indices = Xp.indices def backprop(dY: Floats3d) -> Floats3d: dYp = Padded(dY, size_at_t, lengths, indices) dXp = get_dXp(dYp) return dXp.data return cast(Floats3d, Yp.data), backprop def _tuple_forward( layer: Model[Padded, Padded], X: PaddedData, is_train: bool ) -> Tuple[PaddedData, Callable]: Yp, get_dXp = layer(Padded(*X), is_train) def backprop(dY): dXp = get_dXp(Padded(*dY)) return (dXp.data, dXp.size_at_t, dXp.lengths, dXp.indices) return (cast(Floats3d, Yp.data), Yp.size_at_t, Yp.lengths, Yp.indices), backprop def _ragged_forward( layer: Model[Padded, Padded], Xr: Ragged, is_train: bool ) -> Tuple[Ragged, Callable]: # Assign these to locals, to keep code a bit shorter. list2padded = layer.ops.list2padded padded2list = layer.ops.padded2list unflatten = layer.ops.unflatten flatten = layer.ops.flatten # It's worth being a bit careful about memory here, as the activations # are potentially large on GPU. So we make nested function calls instead # of assigning to temporaries where possible, so memory can be reclaimed # sooner. Yp, get_dXp = layer(list2padded(unflatten(Xr.data, Xr.lengths)), is_train) def backprop(dYr: Ragged): flattened = flatten( padded2list(get_dXp(list2padded(unflatten(dYr.data, dYr.lengths)))), ) return Ragged(flattened, dYr.lengths) flattened = flatten(padded2list(Yp)) return Ragged(flattened, Xr.lengths), backprop def _list_forward( layer: Model[Padded, Padded], Xs: List2d, is_train: bool ) -> Tuple[List2d, Callable]: # Assign these to locals, to keep code a bit shorter. list2padded = layer.ops.list2padded padded2list = layer.ops.padded2list Yp, get_dXp = layer(list2padded(Xs), is_train) def backprop(dYs): return padded2list(get_dXp(list2padded(dYs))) return padded2list(Yp), backprop thinc-release-v9.1.1/thinc/layers/with_ragged.py000066400000000000000000000105361467064331700217150ustar00rootroot00000000000000from typing import Callable, List, Optional, Tuple, TypeVar, Union, cast from ..backends import NumpyOps from ..config import registry from ..model import Model from ..types import Array2d, Ints1d, List2d, ListXd, Padded, Ragged NUMPY_OPS = NumpyOps() RaggedData = Tuple[Array2d, Ints1d] SeqT = TypeVar("SeqT", bound=Union[Padded, Ragged, ListXd, RaggedData]) @registry.layers("with_ragged.v1") def with_ragged(layer: Model[Ragged, Ragged]) -> Model[SeqT, SeqT]: return Model(f"with_ragged({layer.name})", forward, init=init, layers=[layer]) def forward( model: Model[SeqT, SeqT], Xseq: SeqT, is_train: bool ) -> Tuple[SeqT, Callable]: layer: Model[Ragged, Ragged] = model.layers[0] if isinstance(Xseq, Ragged): return cast(Tuple[SeqT, Callable], layer(Xseq, is_train)) elif isinstance(Xseq, Padded): return cast(Tuple[SeqT, Callable], _padded_forward(layer, Xseq, is_train)) elif _is_ragged_data(Xseq): return cast( Tuple[SeqT, Callable], _tuple_forward(layer, cast(RaggedData, Xseq), is_train), ) else: return cast( Tuple[SeqT, Callable], _list_forward(layer, cast(List, Xseq), is_train) ) def init( model: Model[SeqT, SeqT], X: Optional[SeqT] = None, Y: Optional[SeqT] = None, ) -> None: model.layers[0].initialize( X=_get_ragged(model, X) if X is not None else None, Y=_get_ragged(model, Y) if Y is not None else None, ) def _is_ragged_data(seq): return isinstance(seq, tuple) and len(seq) == 2 def _get_ragged(model: Model[SeqT, SeqT], seq: SeqT) -> Ragged: if isinstance(seq, Ragged): return seq elif isinstance(seq, Padded): lists = model.ops.padded2list(seq) lengths = model.ops.asarray1i([len(x) for x in lists]) k = model.ops.flatten(lists) return Ragged(model.ops.flatten(lists), lengths) elif _is_ragged_data(seq): return Ragged(*seq) # type: ignore[misc] else: list2d_seq = cast(List2d, seq) lengths = model.ops.asarray1i([len(x) for x in list2d_seq]) return Ragged(model.ops.flatten(list2d_seq), lengths) def _tuple_forward( layer: Model[Ragged, Ragged], X: RaggedData, is_train: bool ) -> Tuple[RaggedData, Callable]: Yr, get_dXr = layer(Ragged(*X), is_train) def backprop(dY: RaggedData) -> RaggedData: dXr = get_dXr(Ragged(*dY)) return (dXr.data, dXr.lengths) return (Yr.data, Yr.lengths), backprop def _padded_forward( layer: Model[Ragged, Ragged], Xp: Padded, is_train: bool ) -> Tuple[Padded, Callable]: # Assign these to locals, to keep code a bit shorter. list2padded = layer.ops.list2padded padded2list = layer.ops.padded2list unflatten = layer.ops.unflatten flatten = layer.ops.flatten # It's worth being a bit careful about memory here, as the activations # are potentially large on GPU. So we make nested function calls instead # of assigning to temporaries where possible, so memory can be reclaimed # sooner. Xs = padded2list(Xp) # Bit annoying here: padded is in a different order, so we need to make new # lengths. The lengths are unconditionally allocated in CPU memory, because # otherwire unflatten would move GPU allocations to the CPU again. For the # ragged arrays we let the layer's ops determine how lengths should be # stored to ensure that the array and lengths use the same type of memory. lengths = NUMPY_OPS.asarray1i([len(x) for x in Xs]) Yr, get_dXr = layer(Ragged(flatten(Xs), layer.ops.asarray1i(lengths)), is_train) def backprop(dYp: Padded): flattened = flatten(padded2list(dYp)) dXr = get_dXr(Ragged(flattened, lengths)) return list2padded(unflatten(dXr.data, lengths)) return ( list2padded(unflatten(Yr.data, Yr.lengths)), backprop, ) def _list_forward( layer: Model[Ragged, Ragged], Xs: List, is_train: bool ) -> Tuple[List, Callable]: # Assign these to locals, to keep code a bit shorter. flatten = layer.ops.flatten unflatten = layer.ops.unflatten lengths = [len(x) for x in Xs] Yr, get_dXr = layer(Ragged(flatten(Xs), layer.ops.asarray1i(lengths)), is_train) def backprop(dYs): flattened = flatten(dYs) return unflatten(get_dXr(Ragged(flattened, lengths)).data, lengths) return unflatten(Yr.data, Yr.lengths), backprop thinc-release-v9.1.1/thinc/layers/with_reshape.py000066400000000000000000000033771467064331700221200ustar00rootroot00000000000000from typing import Callable, List, Optional, Tuple, TypeVar, cast from ..config import registry from ..model import Model from ..types import Array2d, Array3d InT = TypeVar("InT", bound=Array3d) OutT = TypeVar("OutT", bound=Array2d) @registry.layers("with_reshape.v1") def with_reshape(layer: Model[OutT, OutT]) -> Model[InT, InT]: """Reshape data on the way into and out from a layer.""" return Model( f"with_reshape({layer.name})", forward, init=init, layers=[layer], dims={"nO": None, "nI": None}, ) def forward(model: Model[InT, InT], X: InT, is_train: bool) -> Tuple[InT, Callable]: layer = model.layers[0] initial_shape = X.shape final_shape = list(initial_shape[:-1]) + [layer.get_dim("nO")] nB = X.shape[0] nT = X.shape[1] X2d = model.ops.reshape(X, (-1, X.shape[2])) Y2d, Y2d_backprop = layer(X2d, is_train=is_train) Y = model.ops.reshape3(Y2d, *final_shape) def backprop(dY: InT) -> InT: reshaped = model.ops.reshape2(dY, nB * nT, -1) return Y2d_backprop(model.ops.reshape3(reshaped, *initial_shape)) return cast(InT, Y), backprop def init( model: Model[InT, InT], X: Optional[Array3d] = None, Y: Optional[Array3d] = None ) -> None: layer = model.layers[0] if X is None and Y is None: layer.initialize() X2d: Optional[Array2d] = None Y2d: Optional[Array2d] = None if X is not None: X2d = cast(Array2d, model.ops.reshape(X, (-1, X.shape[-1]))) if Y is not None: Y2d = cast(Array2d, model.ops.reshape(Y, (-1, Y.shape[-1]))) layer.initialize(X=X2d, Y=Y2d) if layer.has_dim("nI"): model.set_dim("nI", layer.get_dim("nI")) if layer.has_dim("nO"): model.set_dim("nO", layer.get_dim("nO")) thinc-release-v9.1.1/thinc/layers/with_signpost_interval.py000066400000000000000000000027471467064331700242430ustar00rootroot00000000000000from typing import Any, Callable, Optional, Tuple, TypeVar from ..compat import has_os_signpost, os_signpost from ..model import Model _ModelT = TypeVar("_ModelT", bound=Model) def with_signpost_interval( layer: _ModelT, signposter: "os_signpost.Signposter", name: Optional[str] = None, ) -> _ModelT: """Wraps any layer and marks the init, forward and backprop phases using signpost intervals for macOS Instruments profiling By default, the name of the layer is used as the name of the range, followed by the name of the pass. """ if not has_os_signpost: raise ValueError( "with_signpost_interval layer requires the 'os_signpost' package" ) name = layer.name if name is None else name orig_forward = layer._func orig_init = layer.init def forward(model: Model, X: Any, is_train: bool) -> Tuple[Any, Callable]: with signposter.use_interval(f"{name} forward"): layer_Y, layer_callback = orig_forward(model, X, is_train=is_train) def backprop(dY: Any) -> Any: with signposter.use_interval(f"{name} backprop"): return layer_callback(dY) return layer_Y, backprop def init(_model: Model, X: Any, Y: Any) -> Model: if orig_init is not None: with signposter.use_interval(f"{name} init"): return orig_init(layer, X, Y) else: return layer layer.replace_callbacks(forward, init=init) return layer thinc-release-v9.1.1/thinc/loss.py000066400000000000000000000376641467064331700171250ustar00rootroot00000000000000from abc import abstractmethod from typing import ( Any, Dict, Generic, List, Optional, Sequence, Tuple, TypeVar, Union, cast, ) from .config import registry from .types import Floats2d, Ints1d from .util import get_array_module, to_categorical LossT = TypeVar("LossT") GradT = TypeVar("GradT") GuessT = TypeVar("GuessT") TruthT = TypeVar("TruthT") IntsOrFloats = Union[Ints1d, Floats2d] IntsOrFloatsOrStrs = Union[Ints1d, Floats2d, Sequence[int], Sequence[str]] class Loss(Generic[GuessT, TruthT, GradT, LossT]): # pragma: no cover """Base class for classes computing the loss / gradient. The class can be initialized with settings if needed. It provides get_loss and get_grad as separate methods to allow calculating them separately. It also provides a __call__ method that returns a tuple of both. """ def __init__(self, **kwargs: Any) -> None: ... def __call__(self, guesses: GuessT, truths: TruthT) -> Tuple[GradT, LossT]: return self.get_grad(guesses, truths), self.get_loss(guesses, truths) @abstractmethod def get_grad(self, guesses: GuessT, truths: TruthT) -> GradT: ... @abstractmethod def get_loss(self, guesses: GuessT, truths: TruthT) -> LossT: ... class CategoricalCrossentropy(Loss): names: Optional[Sequence[str]] missing_value: Optional[Union[str, int]] _name_to_i: Dict[str, int] def __init__( self, *, normalize: bool = True, names: Optional[Sequence[str]] = None, missing_value: Optional[Union[str, int]] = None, neg_prefix: Optional[str] = None, label_smoothing: float = 0.0, ): self.normalize = normalize self.names = names self.missing_value = missing_value self.neg_prefix = neg_prefix self.label_smoothing = label_smoothing if names is not None: self._name_to_i = {name: i for i, name in enumerate(names)} else: self._name_to_i = {} def convert_truths(self, truths, guesses: Floats2d) -> Tuple[Floats2d, Floats2d]: xp = get_array_module(guesses) missing = [] negatives_mask = None if self.names: negatives_mask = xp.ones((len(truths), len(self.names)), dtype="f") missing_value = self.missing_value # Convert list of ints or list of strings if isinstance(truths, list): truths = list(truths) if len(truths): if isinstance(truths[0], int): for i, value in enumerate(truths): if value == missing_value: missing.append(i) else: if self.names is None: msg = ( "Cannot calculate loss from list of strings without names. " "You can pass the names as a keyword argument when you " "create the loss object, " "e.g. CategoricalCrossentropy(names=['dog', 'cat'])" ) raise ValueError(msg) for i, value in enumerate(truths): if value == missing_value: truths[i] = self.names[0] missing.append(i) elif ( value and self.neg_prefix and value.startswith(self.neg_prefix) ): truths[i] = value[len(self.neg_prefix) :] neg_index = self._name_to_i[truths[i]] negatives_mask[i] = 0 # type: ignore negatives_mask[i][neg_index] = -1 # type: ignore truths = [self._name_to_i[name] for name in truths] truths = xp.asarray(truths, dtype="i") mask = _make_mask(guesses, missing) else: mask = _make_mask_by_value(truths, guesses, missing_value) if truths.ndim != guesses.ndim: # transform categorical values to one-hot encoding truths = to_categorical( cast(Ints1d, truths), n_classes=guesses.shape[-1], label_smoothing=self.label_smoothing, ) else: if self.label_smoothing: raise ValueError( "Label smoothing is only applied, when truths have type " "List[str], List[int] or Ints1d, but it seems like Floats2d " "was provided." ) # Transform negative annotations to a 0 for the negated value # + mask all other values for that row if negatives_mask is not None: truths *= negatives_mask truths[truths == -1] = 0 negatives_mask[negatives_mask == -1] = 1 mask *= negatives_mask return truths, mask def __call__( self, guesses: Floats2d, truths: IntsOrFloatsOrStrs ) -> Tuple[Floats2d, float]: d_truth = self.get_grad(guesses, truths) return (d_truth, self._get_loss_from_grad(d_truth)) def get_grad(self, guesses: Floats2d, truths: IntsOrFloatsOrStrs) -> Floats2d: target, mask = self.convert_truths(truths, guesses) xp = get_array_module(target) if guesses.shape != target.shape: # pragma: no cover err = f"Cannot calculate CategoricalCrossentropy loss: mismatched shapes: {guesses.shape} vs {target.shape}." raise ValueError(err) if xp.any(guesses > 1) or xp.any(guesses < 0): # pragma: no cover err = f"Cannot calculate CategoricalCrossentropy loss with guesses outside the [0,1] interval." raise ValueError(err) if xp.any(target > 1) or xp.any(target < 0): # pragma: no cover err = f"Cannot calculate CategoricalCrossentropy loss with truth values outside the [0,1] interval." raise ValueError(err) difference = guesses - target difference *= mask if self.normalize: difference = difference / guesses.shape[0] return difference def get_loss(self, guesses: Floats2d, truths: IntsOrFloatsOrStrs) -> float: d_truth = self.get_grad(guesses, truths) return self._get_loss_from_grad(d_truth) def _get_loss_from_grad(self, d_truth: Floats2d) -> float: # TODO: Add overload for axis=None case to sum return (d_truth**2).sum() # type: ignore @registry.losses("CategoricalCrossentropy.v1") def configure_CategoricalCrossentropy_v1( *, normalize: bool = True, names: Optional[Sequence[str]] = None, missing_value: Optional[Union[str, int]] = None, ) -> CategoricalCrossentropy: return CategoricalCrossentropy( normalize=normalize, names=names, missing_value=missing_value ) @registry.losses("CategoricalCrossentropy.v2") def configure_CategoricalCrossentropy_v2( *, normalize: bool = True, names: Optional[Sequence[str]] = None, missing_value: Optional[Union[str, int]] = None, neg_prefix: Optional[str] = None, ) -> CategoricalCrossentropy: return CategoricalCrossentropy( normalize=normalize, names=names, missing_value=missing_value, neg_prefix=neg_prefix, ) @registry.losses("CategoricalCrossentropy.v3") def configure_CategoricalCrossentropy_v3( *, normalize: bool = True, names: Optional[Sequence[str]] = None, missing_value: Optional[Union[str, int]] = None, neg_prefix: Optional[str] = None, label_smoothing: float = 0.0, ) -> CategoricalCrossentropy: return CategoricalCrossentropy( normalize=normalize, names=names, missing_value=missing_value, neg_prefix=neg_prefix, label_smoothing=label_smoothing, ) class SequenceCategoricalCrossentropy(Loss): def __init__( self, *, normalize: bool = True, names: Optional[Sequence[str]] = None, missing_value: Optional[Union[str, int]] = None, neg_prefix: Optional[str] = None, label_smoothing: float = 0.0, ): self.cc = CategoricalCrossentropy( normalize=False, names=names, missing_value=missing_value, neg_prefix=neg_prefix, label_smoothing=label_smoothing, ) self.normalize = normalize def __call__( self, guesses: Sequence[Floats2d], truths: Sequence[IntsOrFloatsOrStrs] ) -> Tuple[List[Floats2d], float]: grads = self.get_grad(guesses, truths) loss = self._get_loss_from_grad(grads) return grads, loss def get_grad( self, guesses: Sequence[Floats2d], truths: Sequence[IntsOrFloatsOrStrs] ) -> List[Floats2d]: err = "Cannot calculate SequenceCategoricalCrossentropy loss: guesses and truths must be same length" if len(guesses) != len(truths): # pragma: no cover raise ValueError(err) n = len(guesses) d_scores = [] for yh, y in zip(guesses, truths): d_yh = self.cc.get_grad(yh, y) if self.normalize: d_yh /= n d_scores.append(d_yh) return d_scores def get_loss( self, guesses: Sequence[Floats2d], truths: Sequence[IntsOrFloatsOrStrs] ) -> float: return self._get_loss_from_grad(self.get_grad(guesses, truths)) def _get_loss_from_grad(self, grads: Sequence[Floats2d]) -> float: loss = 0.0 for grad in grads: loss += self.cc._get_loss_from_grad(grad) return loss @registry.losses("SequenceCategoricalCrossentropy.v1") def configure_SequenceCategoricalCrossentropy_v1( *, normalize: bool = True, names: Optional[Sequence[str]] = None ) -> SequenceCategoricalCrossentropy: return SequenceCategoricalCrossentropy(normalize=normalize, names=names) @registry.losses("SequenceCategoricalCrossentropy.v2") def configure_SequenceCategoricalCrossentropy_v2( *, normalize: bool = True, names: Optional[Sequence[str]] = None, neg_prefix: Optional[str] = None, ) -> SequenceCategoricalCrossentropy: return SequenceCategoricalCrossentropy( normalize=normalize, names=names, neg_prefix=neg_prefix ) @registry.losses("SequenceCategoricalCrossentropy.v3") def configure_SequenceCategoricalCrossentropy_v3( *, normalize: bool = True, names: Optional[Sequence[str]] = None, missing_value: Optional[Union[str, int]] = None, neg_prefix: Optional[str] = None, label_smoothing: float = 0.0, ) -> SequenceCategoricalCrossentropy: return SequenceCategoricalCrossentropy( normalize=normalize, names=names, missing_value=missing_value, neg_prefix=neg_prefix, label_smoothing=label_smoothing, ) class L2Distance(Loss): def __init__(self, *, normalize: bool = True): self.normalize = normalize def __call__(self, guesses: Floats2d, truths: Floats2d) -> Tuple[Floats2d, float]: return self.get_grad(guesses, truths), self.get_loss(guesses, truths) def get_grad(self, guesses: Floats2d, truths: Floats2d) -> Floats2d: if guesses.shape != truths.shape: # pragma: no cover err = f"Cannot calculate L2 distance: mismatched shapes: {guesses.shape} vs {truths.shape}." raise ValueError(err) difference = guesses - truths if self.normalize: difference = difference / guesses.shape[0] return difference def get_loss(self, guesses: Floats2d, truths: Floats2d) -> float: if guesses.shape != truths.shape: # pragma: no cover err = f"Cannot calculate L2 distance: mismatched shapes: {guesses.shape} vs {truths.shape}." raise ValueError(err) d_truth = self.get_grad(guesses, truths) # TODO: Add overload for axis=None case to sum return (d_truth**2).sum() # type: ignore @registry.losses("L2Distance.v1") def configure_L2Distance(*, normalize: bool = True) -> L2Distance: return L2Distance(normalize=normalize) class CosineDistance(Loss): def __init__(self, *, normalize: bool = True, ignore_zeros: bool = False): self.normalize = normalize self.ignore_zeros = ignore_zeros def __call__(self, guesses: Floats2d, truths: Floats2d) -> Tuple[Floats2d, float]: return self.get_grad(guesses, truths), self.get_loss(guesses, truths) def get_similarity(self, guesses: Floats2d, truths: Floats2d) -> float: if guesses.shape != truths.shape: # pragma: no cover err = f"Cannot calculate cosine similarity: mismatched shapes: {guesses.shape} vs {truths.shape}." raise ValueError(err) xp = get_array_module(guesses) # Add a small constant to avoid 0 vectors yh = guesses + 1e-8 y = truths + 1e-8 norm_yh = xp.linalg.norm(yh, axis=1, keepdims=True) norm_y = xp.linalg.norm(y, axis=1, keepdims=True) mul_norms = norm_yh * norm_y cosine = (yh * y).sum(axis=1, keepdims=True) / mul_norms return cosine def get_grad(self, guesses: Floats2d, truths: Floats2d) -> Floats2d: if guesses.shape != truths.shape: # pragma: no cover err = f"Cannot calculate cosine similarity: mismatched shapes: {guesses.shape} vs {truths.shape}." raise ValueError(err) # Note: not using get_distance() here to avoid duplicating certain calculations xp = get_array_module(guesses) # Find the zero vectors if self.ignore_zeros: zero_indices = xp.abs(truths).sum(axis=1) == 0 # Add a small constant to avoid 0 vectors yh = guesses + 1e-8 y = truths + 1e-8 # https://math.stackexchange.com/questions/1923613/partial-derivative-of-cosinesimilarity norm_yh = xp.linalg.norm(yh, axis=1, keepdims=True) norm_y = xp.linalg.norm(y, axis=1, keepdims=True) mul_norms = norm_yh * norm_y cosine = (yh * y).sum(axis=1, keepdims=True) / mul_norms d_yh = (y / mul_norms) - (cosine * (yh / norm_yh**2)) if self.ignore_zeros: # If the target was a zero vector, don't count it in the loss. d_yh[zero_indices] = 0 if self.normalize: d_yh = d_yh / guesses.shape[0] return -d_yh def get_loss(self, guesses: Floats2d, truths: Floats2d) -> float: if guesses.shape != truths.shape: # pragma: no cover err = f"Cannot calculate cosine similarity: mismatched shapes: {guesses.shape} vs {truths.shape}." raise ValueError(err) xp = get_array_module(guesses) cosine = self.get_similarity(guesses, truths) losses = xp.abs(cosine - 1) if self.ignore_zeros: # If the target was a zero vector, don't count it in the loss. zero_indices = xp.abs(truths).sum(axis=1) == 0 losses[zero_indices] = 0 if self.normalize: losses = losses / guesses.shape[0] loss = losses.sum() return loss @registry.losses("CosineDistance.v1") def configure_CosineDistance( *, normalize: bool = True, ignore_zeros: bool = False ) -> CosineDistance: return CosineDistance(normalize=normalize, ignore_zeros=ignore_zeros) def _make_mask(guesses, missing) -> Floats2d: xp = get_array_module(guesses) mask = xp.ones(guesses.shape, dtype="f") mask[missing] = 0 return mask def _make_mask_by_value(truths, guesses, missing_value) -> Floats2d: xp = get_array_module(guesses) mask = xp.ones(guesses.shape, dtype="f") if missing_value is not None: if truths.ndim == 1: mask[truths == missing_value] = 0.0 else: # In 2D truths, labels are encoded as one-hot vectors, so we can get # the label indices using argmax. labels = xp.argmax(truths, axis=-1) mask[labels == missing_value] = 0.0 return mask __all__ = [ "SequenceCategoricalCrossentropy", "CategoricalCrossentropy", "L2Distance", "CosineDistance", ] thinc-release-v9.1.1/thinc/model.py000066400000000000000000001041471467064331700172340ustar00rootroot00000000000000import contextlib import copy import functools import threading from contextvars import ContextVar from pathlib import Path from typing import ( Any, Callable, Dict, Generic, Iterable, Iterator, List, Optional, Sequence, Set, Tuple, TypeVar, Union, cast, ) import srsly from .backends import CupyOps, NumpyOps, Ops, ParamServer, get_current_ops from .optimizers import Optimizer # noqa: F401 from .shims import Shim from .types import FloatsXd from .util import ( DATA_VALIDATION, convert_recursive, is_xp_array, partial, validate_fwd_input_output, ) InT = TypeVar("InT") OutT = TypeVar("OutT") SelfT = TypeVar("SelfT", bound="Model") context_operators: ContextVar[dict] = ContextVar("context_operators", default={}) def empty_init(model: "Model", *args, **kwargs) -> "Model": return model class Model(Generic[InT, OutT]): """Class for implementing Thinc models and layers.""" global_id: int = 0 global_id_lock: threading.Lock = threading.Lock() _context_operators = context_operators name: str ops: Ops id: int _func: Callable init: Callable _params: ParamServer _dims: Dict[str, Optional[int]] _layers: List["Model"] _shims: List[Shim] _attrs: Dict[str, Any] _has_params: Dict[str, Optional[bool]] # This "locks" the class, so we get an error if you try to assign to # an unexpected variable. __slots__ = [ "name", "id", "ops", "_func", "init", "_params", "_dims", "_attrs", "_refs", "_layers", "_shims", "_has_params", ] def __init__( self, name: str, forward: Callable, *, init: Optional[Callable] = None, dims: Dict[str, Optional[int]] = {}, params: Dict[str, Optional[FloatsXd]] = {}, layers: Sequence["Model"] = [], shims: List[Shim] = [], attrs: Dict[str, Any] = {}, refs: Dict[str, Optional["Model"]] = {}, ops: Optional[Union[NumpyOps, CupyOps]] = None, ): """Initialize a new model.""" self.name = name if init is None: init = partial(empty_init, self) # Assign to callable attrs: https://github.com/python/mypy/issues/2427 setattr(self, "_func", forward) setattr(self, "init", init) self.ops = ops if ops is not None else get_current_ops() self._params = ParamServer() self._dims = dict(dims) self._attrs = dict(attrs) self._refs = dict(refs) self._layers = list(layers) self._shims = list(shims) # Take care to increment the base class here! It needs to be unique # across all models. with Model.global_id_lock: Model.global_id += 1 self.id = Model.global_id self._has_params = {} for name, value in params.items(): self._has_params[name] = None if value is not None: self.set_param(name, value) @property def layers(self) -> List["Model"]: """A list of child layers of the model. You can append to it to add layers but not reassign it. """ return self._layers @property def shims(self) -> List[Shim]: return self._shims @property def attrs(self) -> Dict[str, Any]: """A dict of the model's attrs. You can write to it to update attrs but not reassign it. """ return self._attrs @property def param_names(self) -> Tuple[str, ...]: """Get the names of registered parameter (including unset).""" return tuple(self._has_params.keys()) @property def grad_names(self) -> Tuple[str, ...]: """Get the names of parameters with registered gradients (including unset).""" return tuple([name for name in self.param_names if self.has_grad(name)]) @property def dim_names(self) -> Tuple[str, ...]: """Get the names of registered dimensions (including unset).""" return tuple(self._dims.keys()) @property def ref_names(self) -> Tuple[str, ...]: """Get the names of registered node references (including unset).""" return tuple(self._refs.keys()) @classmethod @contextlib.contextmanager def define_operators(cls, operators: Dict[str, Callable]): """Bind arbitrary binary functions to Python operators, for use in any `Model` instance. Can (and should) be used as a contextmanager. EXAMPLE: with Model.define_operators({">>": chain}): model = Relu(512) >> Relu(512) >> Softmax() """ token = cls._context_operators.set(dict(operators)) yield cls._context_operators.reset(token) def has_dim(self, name: str) -> Optional[bool]: """Check whether the model has a dimension of a given name. If the dimension is registered but the value is unset, returns None. """ if name not in self._dims: return False elif self._dims[name] is not None: return True else: return None def get_dim(self, name: str) -> int: """Retrieve the value of a dimension of the given name.""" if name not in self._dims: raise KeyError(f"Cannot get dimension '{name}' for model '{self.name}'") value = self._dims[name] if value is None: err = f"Cannot get dimension '{name}' for model '{self.name}': value unset" raise ValueError(err) else: return value def set_dim(self, name: str, value: int, *, force: bool = False) -> None: """Set a value for a dimension.""" if name not in self._dims: raise KeyError( f"Cannot set unknown dimension '{name}' for model '{self.name}'." ) old_value = self._dims[name] has_params = any(bool(y) for x, y in self._has_params.items()) invalid_change = (old_value is not None and old_value != value) and ( not force or force and has_params ) if invalid_change: err = f"Attempt to change dimension '{name}' for model '{self.name}' from {old_value} to {value}" raise ValueError(err) self._dims[name] = value def maybe_get_dim(self, name: str) -> Optional[int]: """Retrieve the value of a dimension of the given name, or None.""" return self.get_dim(name) if self.has_dim(name) else None def has_param(self, name: str) -> Optional[bool]: """Check whether the model has a weights parameter of the given name. Returns None if the parameter is registered but currently unset. """ if name not in self._has_params: return False elif self._has_params[name] is not None: return True else: return None def get_param(self, name: str) -> FloatsXd: """Retrieve a weights parameter by name.""" if name not in self._has_params: raise KeyError(f"Unknown param: '{name}' for model '{self.name}'.") if not self._params.has_param(self.id, name): raise KeyError( f"Parameter '{name}' for model '{self.name}' has not been allocated yet." ) return self._params.get_param(self.id, name) def maybe_get_param(self, name: str) -> Optional[FloatsXd]: """Retrieve a weights parameter by name, or None.""" return self.get_param(name) if self.has_param(name) else None def set_param(self, name: str, value: Optional[FloatsXd]) -> None: """Set a weights parameter's value.""" if value is None: self._has_params[name] = None else: self._params.set_param(self.id, name, value) self._has_params[name] = True def has_grad(self, name: str) -> bool: """Check whether the model has a non-zero gradient for a parameter.""" return self._params.has_grad(self.id, name) def get_grad(self, name: str) -> FloatsXd: """Get a gradient from the model.""" return self._params.get_grad(self.id, name) def set_grad(self, name: str, value: FloatsXd) -> None: """Set a gradient value for the model.""" self._params.set_grad(self.id, name, value) def maybe_get_grad(self, name: str) -> Optional[FloatsXd]: """Retrieve a gradient by name, or None.""" return self.get_grad(name) if self.has_grad(name) else None def inc_grad(self, name: str, value: FloatsXd) -> None: """Increment the gradient of a parameter by a value.""" self._params.inc_grad(self.id, name, value) def has_ref(self, name: str) -> Optional[bool]: """Check whether the model has a reference of a given name. If the reference is registered but the value is unset, returns None. """ if name not in self._refs: return False elif self._refs[name] is not None: return True else: return None def get_ref(self, name: str) -> "Model": """Retrieve the value of a reference of the given name.""" if name not in self._refs: raise KeyError(f"Cannot get reference '{name}' for model '{self.name}'.") value = self._refs[name] if value is None: err = f"Cannot get reference '{name}' for model '{self.name}': value unset." raise ValueError(err) else: return value def maybe_get_ref(self, name: str) -> Optional["Model"]: """Retrieve the value of a reference if it exists, or None.""" return self.get_ref(name) if self.has_ref(name) else None def set_ref(self, name: str, value: Optional["Model"]) -> None: """Set a value for a reference.""" if value is None: self._refs[name] = value elif value in self.walk(): self._refs[name] = value else: raise ValueError("Cannot add reference to node not in tree.") def __call__(self, X: InT, is_train: bool) -> Tuple[OutT, Callable]: """Call the model's `forward` function, returning the output and a callback to compute the gradients via backpropagation.""" return self._func(self, X, is_train=is_train) def initialize(self, X: Optional[InT] = None, Y: Optional[OutT] = None) -> "Model": """Finish initialization of the model, optionally providing a batch of example input and output data to perform shape inference.""" if DATA_VALIDATION.get(): validate_fwd_input_output(self.name, self._func, X, Y) if self.init is not None: self.init(self, X=X, Y=Y) return self def begin_update(self, X: InT) -> Tuple[OutT, Callable[[OutT], InT]]: """Run the model over a batch of data, returning the output and a callback to complete the backward pass. A tuple (Y, finish_update), where Y is a batch of output data, and finish_update is a callback that takes the gradient with respect to the output and an optimizer function, and returns the gradient with respect to the input. """ return self._func(self, X, is_train=True) def predict(self, X: InT) -> OutT: """Call the model's `forward` function with `is_train=False`, and return only the output, instead of the `(output, callback)` tuple. """ return self._func(self, X, is_train=False)[0] def finish_update(self, optimizer: Optimizer) -> None: """Update parameters with current gradients. The optimizer is called with each parameter and gradient of the model. """ for node in self.walk(): for shim in node.shims: shim.finish_update(optimizer) for node in self.walk(): for name in node.param_names: if node.has_grad(name): param, grad = optimizer( (node.id, name), node.get_param(name), node.get_grad(name) ) node.set_param(name, param) @contextlib.contextmanager def use_params(self, params: Dict[Tuple[int, str], FloatsXd]): """Context manager to temporarily set the model's parameters to specified values. The params are a dictionary keyed by model IDs, whose values are arrays of weight values. """ backup = {} for name in self.param_names: key = (self.id, name) if key in params: backup[name] = self.get_param(name) self.set_param(name, params[key]) with contextlib.ExitStack() as stack: for layer in self.layers: stack.enter_context(layer.use_params(params)) for shim in self.shims: stack.enter_context(shim.use_params(params)) yield if backup: for name, param in backup.items(): self.set_param(name, param) def walk(self, *, order: str = "bfs") -> Iterable["Model"]: """Iterate out layers of the model. Nodes are returned in breadth-first order by default. Other possible orders are "dfs_pre" (depth-first search in preorder) and "dfs_post" (depth-first search in postorder).""" if order == "bfs": return self._walk_bfs() elif order == "dfs_pre": return self._walk_dfs(post_order=False) elif order == "dfs_post": return self._walk_dfs(post_order=True) else: raise ValueError("Invalid order, must be one of: bfs, dfs_pre, dfs_post") def _walk_bfs(self) -> Iterable["Model"]: """Iterate out layers of the model, breadth-first.""" queue = [self] seen: Set[int] = set() for node in queue: if id(node) in seen: continue seen.add(id(node)) yield node queue.extend(node.layers) def _walk_dfs(self, post_order: bool = False) -> Iterable["Model"]: """Iterate out layers of the model, depth-first.""" seen: Dict[int, Iterator["Model"]] = dict() stack = [self] seen[id(self)] = iter(self.layers) if not post_order: yield self while stack: try: next_child = next(seen[id(stack[-1])]) if not id(next_child) in seen: if not post_order: yield next_child stack.append(next_child) seen[id(next_child)] = iter(next_child.layers) except StopIteration: if post_order: yield stack[-1] stack.pop() def remove_node(self, node: "Model") -> None: """Remove a node from all layers lists, and then update references. References that no longer point to a node within the tree will be set to `None`. For instance, let's say a node has its grandchild as a reference. If the child is removed, the grandchild reference will be left dangling, so will be set to None. """ for child in list(self.walk()): while node in child.layers: child.layers.remove(node) tree = set(self.walk()) for node in tree: for name in node.ref_names: ref = node.get_ref(name) if ref is not None and ref not in tree: node.set_ref(name, None) def replace_callbacks( self, forward: Callable, *, init: Optional[Callable] = None ) -> None: setattr(self, "_func", forward) setattr(self, "init", init) def replace_node(self, old: "Model", new: "Model") -> bool: """Replace a node anywhere it occurs within the model. Returns a boolean indicating whether the replacement was made.""" seen = False # We need to replace nodes in topological order of the transposed graph # to ensure that a node's dependencies are processed before the node. # This is equivalent to a post-order traversal of the original graph. for node in list(self.walk(order="dfs_post")): if node is old: seen = True else: node._layers = [ new if layer is old else layer for layer in node._layers ] for name in node.ref_names: if node.get_ref(name) is old: node.set_ref(name, new) return seen def get_gradients(self) -> Dict[Tuple[int, str], Tuple[FloatsXd, FloatsXd]]: """Get non-zero gradients of the model's parameters, as a dictionary keyed by the parameter ID. The values are (weights, gradients) tuples. """ gradients = {} for node in self.walk(): for name in node.grad_names: param = node.get_param(name) grad = node.get_grad(name) gradients[(node.id, name)] = (param, grad) return gradients def copy(self: SelfT) -> SelfT: """ Create a copy of the model, its attributes, and its parameters. Any child layers will also be deep-copied. The copy will receive a distinct `model.id` value. """ return self._copy() def _copy( self: SelfT, seen: Optional[Dict[int, Union["Model", Shim]]] = None ) -> SelfT: if seen is None: seen = {} params = {} for name in self.param_names: params[name] = self.get_param(name) if self.has_param(name) else None copied_layers: List[Model] = [] for layer in self.layers: if id(layer) in seen: copied_layers.append(cast(Model, seen[id(layer)])) else: copied_layer = layer._copy(seen) seen[id(layer)] = copied_layer copied_layers.append(copied_layer) copied_shims = [] for shim in self.shims: if id(shim) in seen: copied_shims.append(cast(Shim, seen[id(shim)])) else: copied_shim = shim.copy() seen[id(shim)] = copied_shim copied_shims.append(copied_shim) copied: Model[InT, OutT] = Model( self.name, self._func, init=self.init, params=copy.deepcopy(params), dims=copy.deepcopy(self._dims), attrs=copy.deepcopy(self._attrs), layers=copied_layers, shims=copied_shims, ) for name in self.grad_names: copied.set_grad(name, self.get_grad(name).copy()) return cast(SelfT, copied) def to_gpu(self, gpu_id: int) -> None: # pragma: no cover """Transfer the model to a given GPU device.""" import cupy.cuda.device with cupy.cuda.device.Device(gpu_id): self._to_ops(CupyOps()) def to_cpu(self) -> None: # pragma: no cover """Transfer the model to CPU.""" self._to_ops(NumpyOps()) def _to_ops(self, ops: Ops) -> None: # pragma: no cover """Common method for to_cpu/to_gpu.""" for node in self.walk(): node.ops = ops for name in node.param_names: if node.has_param(name): node.set_param(name, ops.asarray_f(node.get_param(name))) if node.has_grad(name): node.set_grad(name, ops.asarray_f(node.get_grad(name))) for shim in node.shims: shim.to_device(ops.device_type, ops.device_id) def to_bytes(self) -> bytes: """Serialize the model to a bytes representation. Models are usually serialized using msgpack, so you should be able to call msgpack.loads() on the data and get back a dictionary with the contents. Serialization should round-trip identically, i.e. the same bytes should result from loading and serializing a model. """ msg = self.to_dict() to_numpy_le = partial(self.ops.to_numpy, byte_order="<") msg = convert_recursive(is_xp_array, to_numpy_le, msg) return srsly.msgpack_dumps(msg) def to_disk(self, path: Union[Path, str]) -> None: """Serialize the model to disk. Most models will serialize to a single file, which should just be the bytes contents of model.to_bytes(). """ path = Path(path) if isinstance(path, str) else path with path.open("wb") as file_: file_.write(self.to_bytes()) def to_dict(self) -> Dict: """Serialize the model to a dict representation. Serialization should round-trip identically, i.e. the same dict should result from loading and serializing a model. """ # We separate out like this to make it easier to read the data in chunks. # The shims might have large weights, while the nodes data will be # small. The attrs are probably not very large, but could be. # The lists are aligned, and refer to the order of self.walk(). msg: Dict[str, List] = {"nodes": [], "attrs": [], "params": [], "shims": []} nodes = list(self.walk()) # Serialize references by their index into the flattened tree. # This is the main reason we can't accept out-of-tree references: # we'd have no way to serialize/deserialize them. node_to_i: Dict[int, Optional[int]] node_to_i = {node.id: i for i, node in enumerate(nodes)} for i, node in enumerate(nodes): refs: Dict[str, Optional[int]] = {} invalid_refs: List[str] = [] for name in node.ref_names: if not node.has_ref(name): refs[name] = None else: ref = node.get_ref(name) if ref.id in node_to_i: refs[name] = node_to_i[ref.id] else: invalid_refs.append(name) if invalid_refs: raise ValueError(f"Cannot get references: {invalid_refs}") dims = {} for dim in node.dim_names: dims[dim] = node.get_dim(dim) if node.has_dim(dim) else None msg["nodes"].append( {"index": i, "name": node.name, "dims": dims, "refs": refs} ) for node in nodes: attrs = {} for name, value in node.attrs.items(): try: attrs[name] = serialize_attr(value, value, name, node) except TypeError: continue msg["attrs"].append(attrs) for node in nodes: msg["shims"].append([shim.to_bytes() for shim in node.shims]) for node in nodes: params: Dict[str, Optional[FloatsXd]] = {} for name in node.param_names: if node.has_param(name): params[name] = cast(Optional[FloatsXd], node.get_param(name)) else: params[name] = None msg["params"].append(params) return msg def from_bytes(self, bytes_data: bytes) -> "Model": """Deserialize the model from a bytes representation. Models are usually serialized using msgpack, so you should be able to call msgpack.loads() on the data and get back a dictionary with the contents. Serialization should round-trip identically, i.e. the same bytes should result from loading and serializing a model. """ msg = srsly.msgpack_loads(bytes_data) msg = convert_recursive(is_xp_array, self.ops.asarray, msg) return self.from_dict(msg) def from_disk(self, path: Union[Path, str]) -> "Model": """Deserialize the model from disk. Most models will serialize to a single file, which should just be the bytes contents of model.to_bytes(). """ path = Path(path) if isinstance(path, str) else path with path.open("rb") as file_: bytes_data = file_.read() return self.from_bytes(bytes_data) def from_dict(self, msg: Dict) -> "Model": if "nodes" not in msg.keys(): # pragma: no cover err = "Trying to read a Model that was created with an incompatible version of Thinc" raise ValueError(err) nodes = list(self.walk()) if len(msg["nodes"]) != len(nodes): raise ValueError("Cannot deserialize model: mismatched structure") for i, node in enumerate(nodes): info = msg["nodes"][i] node.name = info["name"] for dim, value in info["dims"].items(): if value is not None: node.set_dim(dim, value) for ref, ref_index in info["refs"].items(): if ref_index is None: node.set_ref(ref, None) else: node.set_ref(ref, nodes[ref_index]) for attr, value in msg["attrs"][i].items(): default_value = node.attrs.get(attr) loaded_value = deserialize_attr(default_value, value, attr, node) node.attrs[attr] = loaded_value for param_name, value in msg["params"][i].items(): if value is not None: value = node.ops.asarray(value).copy() node.set_param(param_name, value) for i, shim_bytes in enumerate(msg["shims"][i]): node.shims[i].from_bytes(shim_bytes) return self def can_from_disk(self, path: Union[Path, str], *, strict: bool = True) -> bool: """Check whether serialized data on disk is compatible with the model. If 'strict', the function returns False if the model has an attribute already loaded that would be changed. """ path = Path(path) if isinstance(path, str) else path if path.is_dir() or not path.exists(): return False with path.open("rb") as file_: bytes_data = file_.read() return self.can_from_bytes(bytes_data, strict=strict) def can_from_bytes(self, bytes_data: bytes, *, strict: bool = True) -> bool: """Check whether the bytes data is compatible with the model. If 'strict', the function returns False if the model has an attribute already loaded that would be changed. """ try: msg = srsly.msgpack_loads(bytes_data) except ValueError: return False return self.can_from_dict(msg, strict=strict) def can_from_dict(self, msg: Dict, *, strict: bool = True) -> bool: """Check whether a dictionary is compatible with the model. If 'strict', the function returns False if the model has an attribute already loaded that would be changed. """ if "nodes" not in msg.keys(): return False nodes = list(self.walk()) if len(msg["nodes"]) != len(nodes): return False for i, node in enumerate(nodes): info = msg["nodes"][i] if strict and info["name"] != node.name: return False if len(msg["shims"][i]) != len(node.shims): # TODO: The shims should have a check for this too, but # for now we just check if the lengths match. return False for dim, value in info["dims"].items(): has_dim = node.has_dim(dim) if has_dim is False: return False elif has_dim and node.get_dim(dim) != value: return False for param_name, value in msg["params"][i].items(): has_param = node.has_param(param_name) if has_param is False: return False elif has_param and value is not None: param = node.get_param(param_name) if param.shape != value.shape: return False if strict: for attr, value in msg["attrs"][i].items(): if attr in node.attrs: try: serialized = serialize_attr( node.attrs[attr], node.attrs[attr], attr, node ) except TypeError: continue if serialized != value: return False return True def __add__(self, other: Any) -> "Model": """Apply the function bound to the '+' operator.""" if "+" not in self._context_operators.get(): raise TypeError("Undefined operator: +") return self._context_operators.get()["+"](self, other) def __sub__(self, other: Any) -> "Model": """Apply the function bound to the '-' operator.""" if "-" not in self._context_operators.get(): raise TypeError("Undefined operator: -") return self._context_operators.get()["-"](self, other) def __mul__(self, other: Any) -> "Model": """Apply the function bound to the '*' operator.""" if "*" not in self._context_operators.get(): raise TypeError("Undefined operator: *") return self._context_operators.get()["*"](self, other) def __matmul__(self, other: Any) -> "Model": """Apply the function bound to the '@' operator.""" if "@" not in self._context_operators.get(): raise TypeError("Undefined operator: @") return self._context_operators.get()["@"](self, other) def __div__(self, other: Any) -> "Model": # pragma: no cover """Apply the function bound to the '/' operator.""" if "/" not in self._context_operators.get(): raise TypeError("Undefined operator: /") return self._context_operators.get()["/"](self, other) def __truediv__(self, other: Any) -> "Model": """Apply the function bound to the '/' operator.""" if "/" not in self._context_operators.get(): raise TypeError("Undefined operator: /") return self._context_operators.get()["/"](self, other) def __floordiv__(self, other: Any) -> "Model": """Apply the function bound to the '//' operator.""" if "//" not in self._context_operators.get(): raise TypeError("Undefined operator: //") return self._context_operators.get()["//"](self, other) def __mod__(self, other: Any) -> "Model": """Apply the function bound to the '%' operator.""" if "%" not in self._context_operators.get(): raise TypeError("Undefined operator: %") return self._context_operators.get()["%"](self, other) def __pow__(self, other: Any, **kwargs) -> "Model": """Apply the function bound to the '**' operator.""" if "**" not in self._context_operators.get(): raise TypeError("Undefined operator: **") return self._context_operators.get()["**"](self, other) def __lshift__(self, other: Any) -> "Model": """Apply the function bound to the '<<' operator.""" if "<<" not in self._context_operators.get(): raise TypeError("Undefined operator: <<") return self._context_operators.get()["<<"](self, other) def __rshift__(self, other: Any) -> "Model": """Apply the function bound to the '>>' operator.""" if ">>" not in self._context_operators.get(): raise TypeError("Undefined operator: >>") return self._context_operators.get()[">>"](self, other) def __and__(self, other: Any) -> "Model": """Apply the function bound to the '&' operator.""" if "&" not in self._context_operators.get(): raise TypeError("Undefined operator: &") return self._context_operators.get()["&"](self, other) def __xor__(self, other: Any) -> "Model": """Apply the function bound to the '^' operator.""" if "^" not in self._context_operators.get(): raise TypeError("Undefined operator: ^") return self._context_operators.get()["^"](self, other) def __or__(self, other: Any) -> "Model": """Apply the function bound to the '|' operator.""" if "|" not in self._context_operators.get(): raise TypeError("Undefined operator: |") return self._context_operators.get()["|"](self, other) @functools.singledispatch def serialize_attr(_: Any, value: Any, name: str, model: Model) -> bytes: """Serialize an attribute value (defaults to msgpack). You can register custom serializers using the @serialize_attr.register decorator with the type to serialize, e.g.: @serialize_attr.register(MyCustomObject). """ return srsly.msgpack_dumps(value) @functools.singledispatch def deserialize_attr(_: Any, value: Any, name: str, model: Model) -> Any: """Deserialize an attribute value (defaults to msgpack). You can register custom deserializers using the @deserialize_attr.register decorator with the type to deserialize, e.g.: @deserialize_attr.register(MyCustomObject). """ return srsly.msgpack_loads(value) _ModelT = TypeVar("_ModelT", bound=Model) def change_attr_values(model: _ModelT, mapping: Dict[str, Dict[str, Any]]) -> _ModelT: """Walk over the model's nodes, changing the value of attributes using the provided mapping, which maps node names to attr names to attr values. """ for node in model.walk(): if node.name in mapping: attrs = mapping[node.name] for attr, value in attrs.items(): if attr in node.attrs: node.attrs[attr] = value return model def set_dropout_rate(model: _ModelT, drop: float, attrs=["dropout_rate"]) -> _ModelT: """Walk over the model's nodes, setting the dropout rate. You can specify one or more attribute names, by default it looks for ["dropout_rate"]. """ for node in model.walk(): for attr in attrs: if attr in node.attrs: node.attrs[attr] = drop return model def wrap_model_recursive(model: Model, wrapper: Callable[[Model], _ModelT]) -> _ModelT: """Recursively wrap a model and its submodules. The model is updated in-place.""" for node in list(model.walk()): model.replace_node(node, wrapper(node)) return wrapper(model) __all__ = [ "Model", "serialize_attr", "deserialize_attr", "change_attr_values", "set_dropout_rate", "wrap_model_recursive", ] thinc-release-v9.1.1/thinc/mypy.py000066400000000000000000000263131467064331700171300ustar00rootroot00000000000000import itertools from typing import Dict, List from mypy.checker import TypeChecker from mypy.errorcodes import ErrorCode from mypy.errors import Errors from mypy.nodes import CallExpr, Decorator, Expression, FuncDef, MypyFile, NameExpr from mypy.options import Options from mypy.plugin import CheckerPluginInterface, FunctionContext, Plugin from mypy.subtypes import is_subtype from mypy.types import CallableType, Instance, Type, TypeVarType thinc_model_fullname = "thinc.model.Model" chained_out_fullname = "thinc.types.XY_YZ_OutT" intoin_outtoout_out_fullname = "thinc.types.XY_XY_OutT" def plugin(version: str): return ThincPlugin class ThincPlugin(Plugin): def __init__(self, options: Options) -> None: super().__init__(options) def get_function_hook(self, fullname: str): return function_hook def function_hook(ctx: FunctionContext) -> Type: try: return get_reducers_type(ctx) except AssertionError: # Add more function callbacks here return ctx.default_return_type def get_reducers_type(ctx: FunctionContext) -> Type: """ Determine a more specific model type for functions that combine models. This function operates on function *calls*. It analyzes each function call by looking at the function definition and the arguments passed as part of the function call, then determines a more specific return type for the function call. This method accepts a `FunctionContext` as part of the Mypy plugin interface. This function context provides easy access to: * `args`: List of "actual arguments" filling each "formal argument" of the called function. "Actual arguments" are those passed to the function as part of the function call. "Formal arguments" are the parameters defined by the function definition. The same actual argument may serve to fill multiple formal arguments. In some cases the relationship may even be ambiguous. For example, calling `range(*args)`, the actual argument `*args` may fill the `start`, `stop` or `step` formal arguments, depending on the length of the list. The `args` list is of length `num_formals`, with each element corresponding to a formal argument. Each value in the `args` list is a list of actual arguments which may fill the formal argument. For example, in the function call `range(*args, num)`, `num` may fill the `start`, `end` or `step` formal arguments depending on the length of `args`, so type-checking needs to consider all of these possibilities. * `arg_types`: Type annotation (or inferred type) of each argument. Like `args`, this value is a list of lists with an outer list entry for each formal argument and an inner list entry for each possible actual argument for the formal argument. * `arg_kinds`: "Kind" of argument passed to the function call. Argument kinds include positional, star (`*args`), named (`x=y`) and star2 (`**kwargs`) arguments (among others). Like `args`, this value is a list of lists. * `context`: AST node representing the function call with all available type information. Notable attributes include: * `args` and `arg_kinds`: Simple list of actual arguments, not mapped to formal arguments. * `callee`: AST node representing the function being called. Typically this is a `NameExpr`. To resolve this node to the function definition it references, accessing `callee.node` will usually return either a `FuncDef` or `Decorator` node. * etc. This function infers a more specific type for model-combining functions by making certain assumptions about how the function operates based on the order of its formal arguments and its return type. If the return type is `Model[InT, XY_YZ_OutT]`, the output of each argument is expected to be used as the input to the next argument. It's therefore necessary to check that the output type of each model is compatible with the input type of the following model. The combined model has the type `Model[InT, OutT]`, where `InT` is the input type of the first model and `OutT` is the output type of the last model. If the return type is `Model[InT, XY_XY_OutT]`, all model arguments receive input of the same type and are expected to produce output of the same type. It's therefore necessary to check that all models have the same input types and the same output types. The combined model has the type `Model[InT, OutT]`, where `InT` is the input type of all model arguments and `OutT` is the output type of all model arguments. Raises: AssertionError: Raised if a more specific model type couldn't be determined, indicating that the default general return type should be used. """ # Verify that we have a type-checking API and a default return type (presumably a # `thinc.model.Model` instance) assert isinstance(ctx.api, TypeChecker) assert isinstance(ctx.default_return_type, Instance) # Verify that we're inspecting a function call to a callable defined or decorated function assert isinstance(ctx.context, CallExpr) callee = ctx.context.callee assert isinstance(callee, NameExpr) callee_node = callee.node assert isinstance(callee_node, (FuncDef, Decorator)) callee_node_type = callee_node.type assert isinstance(callee_node_type, CallableType) # Verify that the callable returns a `thinc.model.Model` # TODO: Use `map_instance_to_supertype` to map subtypes to `Model` instances. # (figure out how to look up the `TypeInfo` for a class outside of the module being type-checked) callee_return_type = callee_node_type.ret_type assert isinstance(callee_return_type, Instance) assert callee_return_type.type.fullname == thinc_model_fullname assert callee_return_type.args assert len(callee_return_type.args) == 2 # Obtain the output type parameter of the `thinc.model.Model` return type # of the called API function out_type = callee_return_type.args[1] # Check if the `Model`'s output type parameter is one of the "special # type variables" defined to represent model composition (chaining) and # homogeneous reduction assert isinstance(out_type, TypeVarType) assert out_type.fullname if out_type.fullname not in {intoin_outtoout_out_fullname, chained_out_fullname}: return ctx.default_return_type # Extract type of each argument used to call the API function, making sure that they are also # `thinc.model.Model` instances args = list(itertools.chain(*ctx.args)) arg_types = [] for arg_type in itertools.chain(*ctx.arg_types): # TODO: Use `map_instance_to_supertype` to map subtypes to `Model` instances. assert isinstance(arg_type, Instance) assert arg_type.type.fullname == thinc_model_fullname assert len(arg_type.args) == 2 arg_types.append(arg_type) # Collect neighboring pairs of arguments and their types arg_pairs = list(zip(args[:-1], args[1:])) arg_types_pairs = list(zip(arg_types[:-1], arg_types[1:])) # Determine if passed models will be chained or if they all need to have # the same input and output type if out_type.fullname == chained_out_fullname: # Models will be chained, meaning that the output of each model will # be passed as the input to the next model # Verify that model inputs and outputs are compatible for (arg1, arg2), (type1, type2) in zip(arg_pairs, arg_types_pairs): assert isinstance(type1, Instance) assert isinstance(type2, Instance) assert type1.type.fullname == thinc_model_fullname assert type2.type.fullname == thinc_model_fullname check_chained( l1_arg=arg1, l1_type=type1, l2_arg=arg2, l2_type=type2, api=ctx.api ) # Generated model takes the first model's input and returns the last model's output return Instance( ctx.default_return_type.type, [arg_types[0].args[0], arg_types[-1].args[1]] ) elif out_type.fullname == intoin_outtoout_out_fullname: # Models must have the same input and output types # Verify that model inputs and outputs are compatible for (arg1, arg2), (type1, type2) in zip(arg_pairs, arg_types_pairs): assert isinstance(type1, Instance) assert isinstance(type2, Instance) assert type1.type.fullname == thinc_model_fullname assert type2.type.fullname == thinc_model_fullname check_intoin_outtoout( l1_arg=arg1, l1_type=type1, l2_arg=arg2, l2_type=type2, api=ctx.api ) # Generated model accepts and returns the same types as all passed models return Instance( ctx.default_return_type.type, [arg_types[0].args[0], arg_types[0].args[1]] ) # Make sure the default return type is returned if no branch was selected assert False, "Thinc mypy plugin error: it should return before this point" def check_chained( *, l1_arg: Expression, l1_type: Instance, l2_arg: Expression, l2_type: Instance, api: CheckerPluginInterface, ): if not is_subtype(l1_type.args[1], l2_type.args[0]): api.fail( f"Layer outputs type ({l1_type.args[1]}) but the next layer expects ({l2_type.args[0]}) as an input", l1_arg, code=error_layer_output, ) api.fail( f"Layer input type ({l2_type.args[0]}) is not compatible with output ({l1_type.args[1]}) from previous layer", l2_arg, code=error_layer_input, ) def check_intoin_outtoout( *, l1_arg: Expression, l1_type: Instance, l2_arg: Expression, l2_type: Instance, api: CheckerPluginInterface, ): if l1_type.args[0] != l2_type.args[0]: api.fail( f"Layer input ({l1_type.args[0]}) not compatible with next layer input ({l2_type.args[0]})", l1_arg, code=error_layer_input, ) api.fail( f"Layer input ({l2_type.args[0]}) not compatible with previous layer input ({l1_type.args[0]})", l2_arg, code=error_layer_input, ) if l1_type.args[1] != l2_type.args[1]: api.fail( f"Layer output ({l1_type.args[1]}) not compatible with next layer output ({l2_type.args[1]})", l1_arg, code=error_layer_output, ) api.fail( f"Layer output ({l2_type.args[1]}) not compatible with previous layer output ({l1_type.args[1]})", l2_arg, code=error_layer_output, ) error_layer_input = ErrorCode("layer-mismatch-input", "Invalid layer input", "Thinc") error_layer_output = ErrorCode("layer-mismatch-output", "Invalid layer output", "Thinc") class IntrospectChecker(TypeChecker): def __init__( self, errors: Errors, modules: Dict[str, MypyFile], options: Options, tree: MypyFile, path: str, plugin: Plugin, per_line_checking_time_ns: Dict[int, int], ): self._error_messages: List[str] = [] super().__init__( errors, modules, options, tree, path, plugin, per_line_checking_time_ns ) thinc-release-v9.1.1/thinc/optimizers.py000066400000000000000000000343641467064331700203440ustar00rootroot00000000000000import itertools import math from collections import defaultdict from types import GeneratorType from typing import Any, Dict, List, Optional, Tuple, Union, cast from .backends import get_array_ops from .config import registry from .schedules import Schedule, constant from .types import FloatsXd, Generator KeyT = Tuple[int, str] ScheduleT = Union[float, List[float], Generator, Schedule] SGD_DEFAULTS: Dict[str, Union[float, bool, int]] = { "L2": 0.0, "L2_is_weight_decay": True, "grad_clip": 1.0, } ADAM_DEFAULTS: Dict[str, Union[float, bool, int]] = { "learn_rate": 0.001, "beta1": 0.9, "beta2": 0.999, "eps": 1e-08, "L2": SGD_DEFAULTS["L2"], "grad_clip": SGD_DEFAULTS["grad_clip"], "L2_is_weight_decay": True, } @registry.optimizers("RAdam.v1") def RAdam( learn_rate: ScheduleT = ADAM_DEFAULTS["learn_rate"], *, beta1: ScheduleT = ADAM_DEFAULTS["beta1"], beta2: ScheduleT = ADAM_DEFAULTS["beta2"], eps: ScheduleT = ADAM_DEFAULTS["eps"], L2: ScheduleT = ADAM_DEFAULTS["L2"], L2_is_weight_decay: bool = cast(bool, ADAM_DEFAULTS["L2_is_weight_decay"]), grad_clip: ScheduleT = ADAM_DEFAULTS["grad_clip"], use_averages: bool = True, ): return Optimizer( learn_rate, beta1=beta1, beta2=beta2, eps=eps, grad_clip=grad_clip, L2_is_weight_decay=L2_is_weight_decay, L2=L2, use_averages=use_averages, use_radam=True, ) @registry.optimizers("Adam.v1") def Adam( learn_rate: ScheduleT = ADAM_DEFAULTS["learn_rate"], *, L2: ScheduleT = ADAM_DEFAULTS["L2"], beta1: ScheduleT = ADAM_DEFAULTS["beta1"], beta2: ScheduleT = ADAM_DEFAULTS["beta2"], eps: ScheduleT = ADAM_DEFAULTS["eps"], grad_clip: ScheduleT = ADAM_DEFAULTS["grad_clip"], L2_is_weight_decay: bool = cast(bool, ADAM_DEFAULTS["L2_is_weight_decay"]), use_averages: bool = True, ): return Optimizer( learn_rate, L2=L2, beta1=beta1, beta2=beta2, eps=eps, grad_clip=grad_clip, L2_is_weight_decay=L2_is_weight_decay, use_averages=use_averages, use_radam=False, ) @registry.optimizers("SGD.v1") def SGD( learn_rate: ScheduleT, *, L2: ScheduleT = SGD_DEFAULTS["L2"], grad_clip: ScheduleT = SGD_DEFAULTS["grad_clip"], L2_is_weight_decay: bool = cast(bool, SGD_DEFAULTS["L2_is_weight_decay"]), use_averages: bool = True, ): return Optimizer( learn_rate, L2=L2, grad_clip=grad_clip, L2_is_weight_decay=L2_is_weight_decay, beta1=0.0, beta2=0.0, use_averages=use_averages, ) class Optimizer(object): """Do various flavours of stochastic gradient descent, with first and second order momentum. Currently support 'vanilla' SGD, Adam, and RAdam. """ mom1: Dict[KeyT, FloatsXd] mom2: Dict[KeyT, FloatsXd] averages: Optional[Dict[KeyT, FloatsXd]] schedules: Dict[str, Generator] nr_update: Dict[KeyT, int] last_seen: Dict[KeyT, int] grad_clip: Schedule learn_rate: Schedule b1: Schedule b2: Schedule eps: Schedule L2: Schedule use_radam: bool L2_is_weight_decay: bool _radam_buffer: List[List[Optional[FloatsXd]]] _step: int _last_score: Optional[Tuple[int, float]] # This "locks" the class, so we get an error if you try to assign to # an unexpected variable. __slots__ = [ "mom1", "mom2", "averages", "schedules", "nr_update", "last_seen", "grad_clip", "learn_rate", "b1", "b2", "eps", "L2", "use_radam", "L2_is_weight_decay", "_radam_buffer", "_step", "_last_score", ] def __init__( self, learn_rate: ScheduleT, *, L2: ScheduleT = ADAM_DEFAULTS["L2"], beta1: ScheduleT = ADAM_DEFAULTS["beta1"], beta2: ScheduleT = ADAM_DEFAULTS["beta2"], eps: ScheduleT = ADAM_DEFAULTS["eps"], grad_clip: ScheduleT = ADAM_DEFAULTS["grad_clip"], use_averages: bool = True, use_radam: bool = False, L2_is_weight_decay: bool = True, ): """ Initialize an optimizer. learn_rate (float): The initial learning rate. L2 (float): The L2 regularization term. beta1 (float): First-order momentum. beta2 (float): Second-order momentum. eps (float): Epsilon term for Adam etc. grad_clip (float): Gradient clipping. use_averages (bool): Whether to track moving averages of the parameters. use_radam (bool): Whether to use the RAdam optimizer. L2_is_weight_decay (bool): Whether to interpret the L2 parameter as a weight decay term, in the style of the AdamW optimizer. """ self._step = 0 self._last_score = None self.mom1 = {} self.mom2 = {} if use_averages: self.averages = {} else: self.averages = None self.nr_update = defaultdict(int) self.last_seen = defaultdict(int) self._set_attr_or_schedule("grad_clip", grad_clip) self._set_attr_or_schedule("learn_rate", learn_rate) self._set_attr_or_schedule("b1", beta1) self._set_attr_or_schedule("b2", beta2) self._set_attr_or_schedule("eps", eps) self._set_attr_or_schedule("L2", L2) self.use_radam = use_radam self.L2_is_weight_decay = L2_is_weight_decay self._radam_buffer = [[None, None, None] for _ in range(10)] def _set_attr_or_schedule(self, name, value): if isinstance(value, (float, bool, int)): setattr(self, name, constant(value)) elif isinstance(value, list): value = iter(value) setattr(self, name, _wrap_generator(name, value)) elif isinstance(value, GeneratorType): setattr(self, name, _wrap_generator(name, value)) elif isinstance(value, Schedule): setattr(self, name, value) else: err = f"Invalid schedule for '{name}' ({type(value)})" raise ValueError(err) def step_schedules(self): self._step += 1 @property def last_score(self) -> Optional[Tuple[int, float]]: return self._last_score @last_score.setter def last_score(self, score: float): self._last_score = (self._step, score) @property def step(self) -> int: return self._step def _schedule_args(self, key: KeyT) -> Dict[str, Any]: return { "key": key, "last_score": self.last_score, } def __call__( self, key: Tuple[int, str], weights: FloatsXd, gradient: FloatsXd, *, lr_scale: float = 1.0, ): """Call the optimizer with weights and a gradient. The key is the identifier for the parameter, usually the node ID and parameter name. """ if len(gradient) < 1: return weights, gradient ops = get_array_ops(weights) self.nr_update[key] += 1 nr_upd = self.nr_update[key] schedule_args = self._schedule_args(key) if self.L2(self.step, **schedule_args) != 0 and not self.L2_is_weight_decay: gradient += self.L2(self.step, **schedule_args) * weights if self.grad_clip(self.step, **schedule_args): gradient = ops.clip_gradient( gradient, self.grad_clip(self.step, **schedule_args), ) if self.use_radam: weights, gradient = self._radam( ops, weights, gradient, lr_scale, key, nr_upd ) elif ( self.b1(self.step, **schedule_args) > 0.0 and self.b2(self.step, **schedule_args) > 0.0 ): weights, gradient = self._adam( ops, weights, gradient, lr_scale, key, nr_upd ) elif self.b2(self.step, **schedule_args) > 0.0: # pragma: no cover raise NotImplementedError # TODO: error message else: weights -= lr_scale * self.learn_rate(self.step, **schedule_args) * gradient gradient *= 0 if self.L2(self.step, **schedule_args) != 0 and self.L2_is_weight_decay: weights -= ( lr_scale * self.learn_rate(self.step, **schedule_args) * self.L2(self.step, **schedule_args) * weights ) if self.averages is not None: if key not in self.averages: self.averages[key] = ops.alloc(weights.shape, dtype="float32") ops.update_averages(self.averages[key], weights, nr_upd) return weights, gradient def _radam(self, ops, weights, grad, lr_scale, key, nr_upd): if key not in self.mom1: self.mom1[key] = ops.alloc1f(weights.size) if key not in self.mom2: self.mom2[key] = ops.alloc1f(weights.size) weights_1D = ops.reshape1f(weights, weights.size) gradient_1D = ops.reshape1f(grad, grad.size) schedule_args = self._schedule_args(key) # While we port from the pytorch implementation, keep some of the same # naming state = { "step": self.nr_update[key], "exp_avg": self.mom1[key], "exp_avg_sq": self.mom2[key], } group = { "lr": self.learn_rate(self.step, **schedule_args), "betas": [ self.b1(self.step, **schedule_args), self.b2(self.step, **schedule_args), ], "eps": self.eps(self.step, **schedule_args), "weight_decay": 0.0, "buffer": self._radam_buffer, } degenerated_to_sgd = True exp_avg, exp_avg_sq = state["exp_avg"], state["exp_avg_sq"] beta1, beta2 = group["betas"] # exp_avg_sq.mul_(beta2).addcmul_(1 - beta2, grad, grad) exp_avg_sq *= beta2 exp_avg_sq += (1 - beta2) * (gradient_1D**2) # exp_avg.mul_(beta1).add_(1 - beta1, grad) exp_avg *= beta1 exp_avg += (1 - beta1) * gradient_1D state["step"] += 1 buffered = group["buffer"][int(state["step"] % 10)] if state["step"] == buffered[0]: N_sma, step_size = buffered[1], buffered[2] else: buffered[0] = state["step"] beta2_t = beta2 ** state["step"] N_sma_max = 2 / (1 - beta2) - 1 N_sma = N_sma_max - 2 * state["step"] * beta2_t / (1 - beta2_t) buffered[1] = N_sma # more conservative since it's an approximated value if N_sma >= 5: step_size = math.sqrt( (1 - beta2_t) * (N_sma - 4) / (N_sma_max - 4) * (N_sma - 2) / N_sma * N_sma_max / (N_sma_max - 2) ) / (1 - beta1 ** state["step"]) elif degenerated_to_sgd: step_size = 1.0 / (1 - beta1 ** state["step"]) else: step_size = -1 buffered[2] = step_size # more conservative since it's an approximated value if N_sma >= 5: if group["weight_decay"] != 0: weights_1D += -group["weight_decay"] * group["lr"] * weights_1D denom = ops.xp.sqrt(exp_avg_sq) + group["eps"] weights_1D += -step_size * group["lr"] * (exp_avg / denom) elif step_size > 0: if group["weight_decay"] != 0: weights_1D += -group["weight_decay"] * group["lr"] * weights_1D weights_1D += -step_size * group["lr"] * exp_avg return ( ops.reshape_f(weights_1D, weights.shape), ops.reshape_f(gradient_1D, grad.shape), ) def _adam(self, ops, weights, gradient, lr_scale, key, nr_upd): weights_1D = ops.reshape1f(weights, weights.size) gradient_1D = ops.reshape1f(gradient, gradient.size) schedule_args = self._schedule_args(key) if key not in self.mom1: self.mom1[key] = ops.alloc1f(weights.size) if key not in self.mom2: self.mom2[key] = ops.alloc1f(weights.size) mom1 = self.mom1[key] mom2 = self.mom2[key] b1 = self.b1(self.step, **schedule_args) b2 = self.b2(self.step, **schedule_args) fix1 = 1.0 - (b1**nr_upd) fix2 = 1.0 - (b2**nr_upd) lr = self.learn_rate(self.step, **schedule_args) * fix2**0.5 / fix1 eps = self.eps(self.step, **schedule_args) # needs to be 1D going into the adam function weights_1D, gradient_1D, mom1, mom2 = ops.adam( weights_1D, gradient_1D, mom1, mom2, b1, b2, eps, lr * lr_scale ) self.mom1[key] = mom1 self.mom2[key] = mom2 return ( ops.reshape_f(weights_1D, weights.shape), ops.reshape_f(gradient_1D, gradient.shape), ) def _wrap_generator(attr_name: str, generator: Generator) -> Schedule[Any]: try: peek = next(generator) except (StopIteration, TypeError) as e: err = f"Invalid schedule for '{attr_name}' ({type(generator)})\n{e}" raise ValueError(err) return Schedule( "wrap_generator", _wrap_generator_schedule, attrs={ "attr_name": attr_name, "last_step": -1, "last_value": peek, "generator": itertools.chain([peek], generator), }, ) def _wrap_generator_schedule(schedule: Schedule, step, **kwargs) -> float: attr_name = schedule.attrs["attr_name"] last_step = schedule.attrs["last_step"] last_value = schedule.attrs["last_value"] generator = schedule.attrs["generator"] if step < last_step: raise ValueError( f"'step' of the generator-based schedule for {attr_name} must not decrease" ) # Ensure that we have a value when we didn't step or when the # generator is exhausted. value = last_value for i in range(step - last_step): try: value = next(generator) except StopIteration: # schedule exhausted, use last value break schedule.attrs["last_step"] = step schedule.attrs["last_value"] = value return value __all__ = ["Adam", "RAdam", "SGD", "Optimizer", "ADAM_DEFAULTS", "SGD_DEFAULTS"] thinc-release-v9.1.1/thinc/py.typed000066400000000000000000000000001467064331700172400ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/schedules.py000066400000000000000000000261161467064331700201120ustar00rootroot00000000000000"""Generators that provide different rates, schedules, decays or series.""" import itertools from dataclasses import dataclass from typing import Any, Callable, Dict, Generator, Generic, Optional, Tuple, TypeVar import numpy from .config import registry OutT = TypeVar("OutT") class Schedule(Generic[OutT]): """Class for implementing Thinc schedules.""" name: str _schedule: Callable _attrs: Dict[str, Any] __slots__ = ["name", "_schedule", "_attrs"] def __init__( self, name: str, schedule: Callable, *, attrs: Dict[str, Any] = {} ) -> None: """Initialize a new schedule. name (str): The name of the schedule type. schedule (Callable): The schedule function. """ self.name = name self._schedule = schedule self._attrs = dict(attrs) def __call__(self, step: int, **extra) -> OutT: """Compute the schedule for a given step.""" if step < 0: raise ValueError(f"Step must be non-negative, was: {step}") return self._schedule(self, step, **extra) @property def attrs(self): """Schedule attributes.""" return self._attrs def to_generator( self, start: int = 0, step_size=1, **extra ) -> Generator[OutT, None, None]: """Turn the schedule into a generator. start (int): The schedule initial step. step_size (int): The amount to increase the step for each generated value. **extra: Additional arguments that are passed to the schedule. RETURNS (Generator[OutT, None, None]): The generator. """ if start < 0: raise ValueError(f"Schedule start must be non-negative, was: {start}") if step_size < 0: raise ValueError(f"Step size must be non-negative, was: {step_size}") def generate(): for step in itertools.count(start, step_size): yield self(step, **extra) return generate() @registry.schedules("constant_then.v1") def constant_then(rate: OutT, steps: int, schedule: Schedule[OutT]) -> Schedule[OutT]: """Yield a constant rate for N steps, before starting a schedule.""" return Schedule( "constant_then", _constant_then_schedule, attrs={"rate": rate, "steps": steps, "schedule": schedule}, ) def _constant_then_schedule(schedule: Schedule, step: int, **kwargs) -> float: rate = schedule.attrs["rate"] steps = schedule.attrs["steps"] schedule = schedule.attrs["schedule"] if step < steps: return rate else: return schedule(step=step, **kwargs) @registry.schedules("constant.v1") def constant(rate: OutT) -> Schedule[OutT]: """Yield a constant rate.""" return Schedule("constant", _constant_schedule, attrs={"rate": rate}) def _constant_schedule(schedule: Schedule, step: int, **kwargs) -> float: rate = schedule.attrs["rate"] return rate @registry.schedules("decaying.v1") def decaying(base_rate: float, decay: float, *, t: float = 0.0) -> Schedule[float]: """Yield an infinite series of linearly decaying values, following the schedule: base_rate * 1 / (1 + decay * (t + step)) EXAMPLE: >>> learn_rates = decaying(0.001, 1e-4) >>> next(learn_rates) 0.001 >>> next(learn_rates) 0.00999 """ return Schedule( "decaying", _decaying_schedule, attrs={"base_rate": base_rate, "decay": decay, "t": t}, ) def _decaying_schedule(schedule: Schedule, step: int, **kwargs) -> float: base_rate = schedule.attrs["base_rate"] decay = schedule.attrs["decay"] t = schedule.attrs["t"] return base_rate * (1.0 / (1.0 + decay * (step + t))) @registry.schedules("compounding.v1") def compounding( start: float, stop: float, compound: float, *, t: float = 0.0 ) -> Schedule[float]: """Yield an infinite series of compounding values. Each time the generator is called, a value is produced by multiplying the previous value by the compound rate. EXAMPLE: >>> sizes = compounding(1.0, 10.0, 1.5) >>> assert next(sizes) == 1. >>> assert next(sizes) == 1 * 1.5 >>> assert next(sizes) == 1.5 * 1.5 """ return Schedule( "compounding", _compounding_schedule, attrs={"start": start, "stop": stop, "compound": compound, "t": t}, ) def _compounding_schedule(schedule: Schedule, step: int, **kwargs) -> float: start = schedule.attrs["start"] stop = schedule.attrs["stop"] compound = schedule.attrs["compound"] t = schedule.attrs["t"] return _clip(start * (compound ** (step + t)), start, stop) def _clip(value: float, start: float, stop: float) -> float: return max(value, stop) if (start > stop) else min(value, stop) @registry.schedules("plateau.v1") def plateau( max_patience: int, scale: float, schedule: Schedule[float] ) -> Schedule[float]: """Yields values from the wrapped schedule, exponentially scaled by the number of times optimization has plateaued. The caller must pass model evaluation scores through the last_score argument for the scaling to be adjusted. The last evaluation score is passed through the last_score argument as a tuple (last_score_step, last_score). This tuple indicates when a model was last evaluated (last_score_step) and with what score (last_score). max_patience (int): the number of evaluations without improvement when we consider the model to have plateaued. scale (float): scaling of the inner schedule (scale**n_plateaus * inner). schedule (Schedule[float]): the schedule to wrap. """ return Schedule( "plateau", _plateau_schedule, attrs={ "scale": scale, "max_patience": max_patience, "schedule": schedule, "state": _PlateauState( best_score=None, last_score_step=None, patience=0, n_plateaus=0 ), }, ) def _plateau_schedule( schedule: Schedule, step: int, *, last_score: Optional[Tuple[int, float]] = None, **kwargs, ) -> float: inner_schedule: Schedule[float] = schedule.attrs["schedule"] max_patience: int = schedule.attrs["max_patience"] scale: float = schedule.attrs["scale"] state: _PlateauState = schedule.attrs["state"] if last_score is None: return (scale**state.n_plateaus) * inner_schedule( step=step, last_score=last_score, **kwargs ) last_score_step, last_score_ = last_score if ( state.best_score is None or state.last_score_step is None or last_score_ > state.best_score ): state.best_score = last_score_ state.patience = 0 elif last_score_step < state.last_score_step: raise ValueError( f"Expected score with step >= {state.last_score_step}, was: {last_score_step}" ) elif last_score_step > state.last_score_step: # If the score didn't improve and we are not seeing the last # score again, we may be at a plateau, so increase patience. state.patience += 1 # If we are at the maximum patience, we consider the optimization # to have reached a plateau. if state.patience == max_patience: state.n_plateaus += 1 state.patience = 0 state.last_score_step = last_score_step return (scale**state.n_plateaus) * inner_schedule( step=step, last_score=last_score, **kwargs ) @dataclass class _PlateauState: """Plateau schedule state. best_score (Optional[float]): the best score so far, or None when no score has been observed. last_score_step (Optional[int]): the step of the last score that was observed. patience (int): the number of scores so far which do not improve over the best score (reset after reaching the maximum patience). n_plateaus (int): the number of times the maximum patience has been reached. """ best_score: Optional[float] last_score_step: Optional[int] patience: int n_plateaus: int # @dataclass(slots=True) is only supported in Python >= 3.10 __slots__ = ["best_score", "last_score_step", "patience", "n_plateaus"] @registry.schedules("slanted_triangular.v1") def slanted_triangular( max_rate: float, num_steps: int, *, cut_frac: float = 0.1, ratio: int = 32, t: float = 0.0, ) -> Schedule[float]: """Yield an infinite series of values according to Howard and Ruder's "slanted triangular learning rate" schedule. """ cut = int(num_steps * cut_frac) return Schedule( "slanted_triangular", _slanted_triangular_schedule, attrs={ "max_rate": max_rate, "cut": cut, "cut_frac": cut_frac, "ratio": ratio, "t": t, }, ) def _slanted_triangular_schedule(schedule: Schedule, step: int, **kwargs) -> float: max_rate = schedule.attrs["max_rate"] cut = schedule.attrs["cut"] cut_frac = schedule.attrs["cut_frac"] ratio = schedule.attrs["ratio"] t = schedule.attrs["t"] t_step = step + t + 1.0 if t_step < cut: p = t_step / cut else: p = 1 - ((t_step - cut) / (cut * (1 / cut_frac - 1))) return max_rate * (1 + p * (ratio - 1)) * (1 / ratio) @registry.schedules("warmup_linear.v1") def warmup_linear( initial_rate: float, warmup_steps: int, total_steps: int ) -> Schedule[float]: """Generate a series, starting from an initial rate, and then with a warmup period, and then a linear decline. Used for learning rates. """ return Schedule( "warmup_linear", _warmup_linear_schedule, attrs={ "initial_rate": initial_rate, "warmup_steps": warmup_steps, "total_steps": total_steps, }, ) def _warmup_linear_schedule(schedule: Schedule, step: int, **kwargs) -> float: initial_rate = schedule.attrs["initial_rate"] warmup_steps = schedule.attrs["warmup_steps"] total_steps = schedule.attrs["total_steps"] if step < warmup_steps: factor = step / max(1, warmup_steps) else: factor = max(0.0, (total_steps - step) / max(1.0, total_steps - warmup_steps)) return factor * initial_rate @registry.schedules("cyclic_triangular.v1") def cyclic_triangular(min_lr: float, max_lr: float, period: int) -> Schedule[float]: return Schedule( "cyclic_triangular", _cyclic_triangular_schedule, attrs={"min_lr": min_lr, "max_lr": max_lr, "period": period}, ) def _cyclic_triangular_schedule(schedule: Schedule, step: int, **kwargs) -> float: min_lr = schedule.attrs["min_lr"] max_lr = schedule.attrs["max_lr"] period = schedule.attrs["period"] it = step + 1 # https://towardsdatascience.com/adaptive-and-cyclical-learning-rates-using-pytorch-2bf904d18dee cycle = numpy.floor(1 + it / (2 * period)) x = numpy.abs(it / period - 2 * cycle + 1) relative = max(0, 1 - x) return min_lr + (max_lr - min_lr) * relative __all__ = [ "cyclic_triangular", "warmup_linear", "constant", "constant_then", "decaying", "warmup_linear", "slanted_triangular", "compounding", ] thinc-release-v9.1.1/thinc/shims/000077500000000000000000000000001467064331700166765ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/shims/__init__.py000066400000000000000000000007161467064331700210130ustar00rootroot00000000000000from .mxnet import MXNetShim from .pytorch import PyTorchShim from .pytorch_grad_scaler import PyTorchGradScaler from .shim import Shim from .tensorflow import TensorFlowShim, keras_model_fns, maybe_handshake_model from .torchscript import TorchScriptShim # fmt: off __all__ = [ "MXNetShim", "PyTorchShim", "PyTorchGradScaler", "Shim", "TensorFlowShim", "TorchScriptShim", "maybe_handshake_model", "keras_model_fns", ] # fmt: on thinc-release-v9.1.1/thinc/shims/mxnet.py000066400000000000000000000103331467064331700204030ustar00rootroot00000000000000# mypy: ignore-errors import copy from typing import Any, cast import srsly from ..compat import mxnet as mx from ..optimizers import Optimizer from ..types import ArgsKwargs, FloatsXd from ..util import ( convert_recursive, get_array_module, make_tempfile, mxnet2xp, xp2mxnet, ) from .shim import Shim class MXNetShim(Shim): """Interface between a MXNet model and a Thinc Model. This container is *not* a Thinc Model subclass itself. """ def __call__(self, inputs, is_train): if is_train: return self.begin_update(inputs) else: return self.predict(inputs), lambda a: ... def predict(self, inputs: ArgsKwargs) -> Any: """Pass inputs through to the underlying MXNet model, and return the output. No conversions are performed. The MXNet model is set into evaluation mode. """ mx.autograd.set_training(train_mode=False) with mx.autograd.pause(): outputs = self._model(*inputs.args, **inputs.kwargs) mx.autograd.set_training(train_mode=True) return outputs def begin_update(self, inputs: ArgsKwargs): """Pass the inputs through to the underlying MXNet model, keeping track of which items in the input are tensors requiring gradients. If the model returns a single value, it is converted into a one-element tuple. Return the outputs and a callback to backpropagate. """ mx.autograd.set_training(train_mode=True) mx.autograd.set_recording(True) output = self._model(*inputs.args, **inputs.kwargs) def backprop(grads): mx.autograd.set_recording(False) mx.autograd.backward(*grads.args, **grads.kwargs) return convert_recursive( lambda x: hasattr(x, "grad"), lambda x: x.grad, inputs ) return output, backprop def finish_update(self, optimizer: Optimizer): params = [] grads = [] shapes = [] ctx = mx.current_context() for key, value in self._model.collect_params().items(): grad = cast(FloatsXd, mxnet2xp(value.grad(ctx))) param = cast(FloatsXd, mxnet2xp(value.data(ctx))) params.append(param.ravel()) grads.append(grad.ravel()) shapes.append((param.size, param.shape)) if not params: return xp = get_array_module(params[0]) flat_params, flat_grads = optimizer( (self.id, "mxnet-shim"), xp.concatenate(params), xp.concatenate(grads) ) start = 0 for key, value in self._model.collect_params().items(): size, shape = shapes.pop(0) param = flat_params[start : start + size].reshape(shape) value.set_data(xp2mxnet(param)) value.zero_grad() start += size def copy(self, ctx: "mx.context.Context" = None): if ctx is None: ctx = mx.current_context() model_bytes = self.to_bytes() copied = copy.deepcopy(self) copied._model.initialize(ctx=ctx) copied.from_bytes(model_bytes) return copied def to_device(self, device_type: str, device_id: int): if device_type == "cpu": self._model = self.copy(mx.cpu()) elif device_type == "gpu": self._model = self.copy(mx.gpu()) else: msg = f"Unexpected device_type: {device_type}. Try 'cpu' or 'gpu'." raise ValueError(msg) def to_bytes(self): # MXNet doesn't implement save/load without a filename with make_tempfile("w+b") as temp: self._model.save_parameters(temp.name) temp.seek(0) weights_bytes = temp.read() msg = {"config": self.cfg, "state": weights_bytes} return srsly.msgpack_dumps(msg) def from_bytes(self, bytes_data): msg = srsly.msgpack_loads(bytes_data) self.cfg = msg["config"] self._load_params(msg["state"]) return self def _load_params(self, params): # MXNet doesn't implement save/load without a filename :( with make_tempfile("w+b") as temp: temp.write(params) self._model.load_parameters(temp.name, ctx=mx.current_context()) thinc-release-v9.1.1/thinc/shims/pytorch.py000066400000000000000000000221741467064331700207460ustar00rootroot00000000000000import contextlib import itertools from io import BytesIO from typing import Any, Callable, Dict, Optional, cast import srsly from ..backends import CupyOps, context_pools, get_current_ops, set_gpu_allocator from ..compat import torch from ..optimizers import Optimizer from ..types import ArgsKwargs, FloatsXd from ..util import ( convert_recursive, get_torch_default_device, iterate_recursive, torch2xp, xp2torch, ) from .pytorch_grad_scaler import PyTorchGradScaler from .shim import Shim class PyTorchShim(Shim): """Interface between a PyTorch model and a Thinc Model. This container is *not* a Thinc Model subclass itself. mixed_precision: Enable mixed-precision. This changes whitelisted ops to run in half precision for better performance and lower memory use. grad_scaler: The gradient scaler to use for mixed-precision training. If this argument is set to "None" and mixed precision is enabled, a gradient scaler with the default configuration is used. device: The PyTorch device to run the model on. When this argument is set to "None", the default device for the currently active Thinc ops is used. serialize_model: Callback that receives the wrapped PyTorch model as its argument and returns a "bytes" representation of the same. The representation should contain all the necessary information to fully deserialize the model. deserialize_model: Callback that receives the default PyTorch model (passed to the constructor), the serialized "bytes" representation and a PyTorch device. It should return a fully deserialized model on the target device as its result. """ def __init__( self, model: Any, config=None, optimizer: Any = None, mixed_precision: bool = False, grad_scaler: Optional[PyTorchGradScaler] = None, device: Optional["torch.device"] = None, serialize_model: Optional[Callable[[Any], bytes]] = None, deserialize_model: Optional[Callable[[Any, bytes, "torch.device"], Any]] = None, ): super().__init__(model, config, optimizer) if device is None: device = get_torch_default_device() if model is not None: model.to(device) if grad_scaler is None: grad_scaler = PyTorchGradScaler(mixed_precision) grad_scaler.to_(device) self._grad_scaler = grad_scaler self._mixed_precision = mixed_precision self._serialize_model = ( serialize_model if serialize_model is not None else default_serialize_torch_model ) self._deserialize_model = ( deserialize_model if deserialize_model is not None else default_deserialize_torch_model ) if CupyOps.xp is not None and isinstance(get_current_ops(), CupyOps): pools = context_pools.get() if "pytorch" not in pools: from cupy import get_default_memory_pool set_gpu_allocator("pytorch") get_default_memory_pool().free_all_blocks() def __call__(self, inputs, is_train): if is_train: return self.begin_update(inputs) else: return self.predict(inputs), lambda a: ... @property def device(self): p = next(self._model.parameters(), None) if p is None: return get_torch_default_device() else: return p.device def predict(self, inputs: ArgsKwargs) -> Any: """Pass inputs through to the underlying PyTorch model, and return the output. No conversions are performed. The PyTorch model is set into evaluation mode. """ self._model.eval() with torch.no_grad(): with torch.cuda.amp.autocast(self._mixed_precision): outputs = self._model(*inputs.args, **inputs.kwargs) self._model.train() return outputs def begin_update(self, inputs: ArgsKwargs): """Pass the inputs through to the underlying PyTorch model, keeping track of which items in the input are tensors requiring gradients. If the model returns a single value, it is converted into a one-element tuple. Return the outputs and a callback to backpropagate. """ self._model.train() # Note: mixed-precision autocast must not be applied to backprop. with torch.cuda.amp.autocast(self._mixed_precision): output = self._model(*inputs.args, **inputs.kwargs) def backprop(grads): # Normally, gradient scaling is applied to the loss of a model. However, # since regular thinc layers do not use mixed-precision, we perform scaling # locally in this shim. Scaling the loss by a factor, scales the gradients # by the same factor (see the chain rule). Therefore, we scale the gradients # backprop'ed through the succeeding layer to get the same effect as loss # scaling. grads.kwargs["grad_tensors"] = self._grad_scaler.scale( grads.kwargs["grad_tensors"], inplace=True ) torch.autograd.backward(*grads.args, **grads.kwargs) # Unscale weights and check for overflows during backprop. grad_tensors = [] for torch_data in itertools.chain( self._model.parameters(), iterate_recursive(lambda x: hasattr(x, "grad"), inputs), ): if torch_data.grad is not None: grad_tensors.append(torch_data.grad) found_inf = self._grad_scaler.unscale(grad_tensors) # If there was an over/underflow, return zeroed-out gradients. if found_inf: grad_get = lambda x: x.grad.zero_() if x.grad is not None else x.grad else: grad_get = lambda x: x.grad return convert_recursive(lambda x: hasattr(x, "grad"), grad_get, inputs) return output, backprop def finish_update(self, optimizer: Optimizer): for name, torch_data in self._model.named_parameters(): if torch_data.grad is not None: if ( not self._grad_scaler.found_inf ): # Skip weight update if any gradient overflowed. param, grad = optimizer( (self.id, name), cast(FloatsXd, torch2xp(torch_data.data)), cast(FloatsXd, torch2xp(torch_data.grad)), ) torch_data.data = xp2torch( param, requires_grad=True, device=torch_data.device ) torch_data.grad.zero_() self._grad_scaler.update() @contextlib.contextmanager def use_params(self, params): key_prefix = f"pytorch_{self.id}_" state_dict = {} for k, v in params.items(): if hasattr(k, "startswith") and k.startswith(key_prefix): state_dict[k.replace(key_prefix, "")] = xp2torch(v, device=self.device) if state_dict: backup = {k: v.clone() for k, v in self._model.state_dict().items()} self._model.load_state_dict(state_dict) yield self._model.load_state_dict(backup) else: yield def to_device(self, device_type: str, device_id: int): # pragma: no cover if device_type == "cpu": self._model.cpu() elif device_type == "gpu": self._model.cuda(device_id) else: msg = f"Invalid device_type: {device_type}. Try 'cpu' or 'gpu'" raise ValueError(msg) def to_bytes(self): model_bytes = self._serialize_model(self._model) msg = {"config": self.cfg, "state": model_bytes} return srsly.msgpack_dumps(msg) def from_bytes(self, bytes_data): device = get_torch_default_device() msg = srsly.msgpack_loads(bytes_data) self.cfg = msg["config"] self._model = self._deserialize_model(self._model, msg["state"], device) self._grad_scaler.to_(device) return self def default_serialize_torch_model(model: Any) -> bytes: """Serializes the parameters of the wrapped PyTorch model to bytes. model: Wrapped PyTorch model. Returns: A `bytes` object that encapsulates the serialized model parameters. """ filelike = BytesIO() torch.save(model.state_dict(), filelike) filelike.seek(0) return filelike.getvalue() def default_deserialize_torch_model( model: Any, state_bytes: bytes, device: "torch.device" ) -> Any: """Deserializes the parameters of the wrapped PyTorch model and moves it to the specified device. model: Wrapped PyTorch model. state_bytes: Serialized parameters as a byte stream. device: PyTorch device to which the model is bound. Returns: The deserialized model. """ filelike = BytesIO(state_bytes) filelike.seek(0) model.load_state_dict(torch.load(filelike, map_location=device)) model.to(device) return model thinc-release-v9.1.1/thinc/shims/pytorch_grad_scaler.py000066400000000000000000000136541467064331700232770ustar00rootroot00000000000000from typing import Dict, Iterable, List, Union, cast from ..compat import has_torch_amp, torch from ..util import is_torch_array class PyTorchGradScaler: """ Gradient scaler for the PyTorch shim. Gradients with small magnitudes are not representable in half-precision and will underflow to zero. A gradient scaler counters this issue by scaling up the loss before backpropagation, increasing the gradients by the same magnitude. A large enough scale will avoid that the gradients underflow. The gradients are unscaled in single precision after backpropagation, to provide the unscaled gradients to the optimizer. """ def __init__( self, enabled: bool = False, init_scale: float = 2.0**16, backoff_factor: float = 0.5, growth_factor: float = 2.0, growth_interval: int = 2000, ): """ Construct a gradient scaler for the PyTorch shim. enabled (bool): Sets whether the gradient scalar is enabled. If it is disabled, the methods of the grad scaler are no-ops. init_scale (float): The initial scale used to increase the gradient magnitude. backoff_factor (float): The scale will be multiplied by this factor if any of the gradients overflows. growth_factor (float): The scale will be multiplied by this factor when none of the gradients overflowed for "growth_interval" steps. growth_interval (int): When no overflows were found for this number of steps, the scale will be multiplied by "growth_factor". """ self._enabled = enabled self._growth_factor = growth_factor self._backoff_factor = backoff_factor self._growth_interval = growth_interval self._growth_tracker = torch.full((1,), 0, dtype=torch.int) self._scale = torch.full((1,), init_scale) self._found_inf = False def to_(self, device): self._growth_tracker = self._growth_tracker.to(device) self._scale = self._scale.to(device) def scale( self, tensors: Union["torch.Tensor", Iterable["torch.Tensor"]], inplace=False ) -> Union["torch.Tensor", List["torch.Tensor"]]: """Scale up the values in the given tensors.""" if not self._enabled: return cast("torch.Tensor", tensors) incorrect_type = ValueError( "Input to gradient scaling must be a Tensor or Iterable[Tensor]" ) # Cache per-device scales to avoid unnecessary d2d copies of the current scale. scale_per_device: Dict["torch.device", "torch.Tensor"] = dict() if is_torch_array(tensors): tensor = cast("torch.Tensor", tensors) return self._scale_tensor(tensor, scale_per_device, inplace) elif isinstance(tensors, Iterable): scaled_tensors = [] for tensor in tensors: if not is_torch_array(tensor): raise incorrect_type scaled_tensors.append( self._scale_tensor(tensor, scale_per_device, inplace) ) return scaled_tensors raise incorrect_type def _scale_tensor( self, tensor: "torch.Tensor", scale_per_device: Dict["torch.device", "torch.Tensor"], inplace: bool, ): if not has_torch_amp: raise ValueError( "Gradient scaling is not supported, requires capable GPU and torch>=1.9.0" ) if not tensor.is_cuda: msg = ( "Gradient scaling is only supported for CUDA tensors. " "If you are using PyTorch models, you can avoid this " "error by disabling mixed-precision support." ) raise ValueError(msg) device = tensor.device if device not in scale_per_device: scale_per_device[device] = self._scale.to(device=device) scale = scale_per_device[device] if inplace: return tensor.mul_(scale) else: return tensor * scale def _tensors_per_device(self, tensors): tensors_per_device = dict() for tensor in tensors: device_tensors = tensors_per_device.setdefault(tensor.device, []) device_tensors.append(tensor) return tensors_per_device @property def found_inf(self): return self._found_inf def unscale(self, tensors): """Unscale the given tensors. Returns True if any of the gradients were infinite.""" if not self._enabled: return False # Invert scale (in higher precision). inv_scale = self._scale.double().reciprocal().float() # Apply unscaling to tensors, per device. tensors_per_device = self._tensors_per_device(tensors) for device, device_tensors in tensors_per_device.items(): found_inf_device = torch.full((1,), 0.0, device=device) inv_scale_device = inv_scale.to(device=device) torch._amp_foreach_non_finite_check_and_unscale_( device_tensors, found_inf_device, inv_scale_device ) if bool(found_inf_device != 0): self._found_inf = True return self._found_inf def update(self): """ Update the scale factor and clear information about infinities. This method should be called after each optimization step. """ if not self._enabled: return found_inf_device = torch.full( (1,), 1.0 if self._found_inf else 0.0, device=self._scale.device ) torch._amp_update_scale_( self._scale, self._growth_tracker, found_inf_device, self._growth_factor, self._backoff_factor, self._growth_interval, ) # Clear infinity found status self._found_inf = False thinc-release-v9.1.1/thinc/shims/shim.py000066400000000000000000000046621467064331700202200ustar00rootroot00000000000000import contextlib import copy import threading from pathlib import Path from typing import Any, Callable, Dict, Optional, Tuple, Union class Shim: # pragma: no cover """Define a basic interface for external models. Users can create subclasses of 'shim' to wrap external libraries. We provide shims for PyTorch. The Thinc Model class treats Shim objects as a sort of special type of sublayer: it knows they're not actual Thinc Model instances, but it also knows to talk to the shim instances when doing things like using transferring between devices, loading in parameters, optimization. It also knows Shim objects need to be serialized and deserialized with to/from bytes/disk, rather than expecting that they'll be msgpack-serializable. """ global_id: int = 0 global_id_lock: threading.Lock = threading.Lock() cfg: Dict _model: Any _optimizer: Optional[Any] def __init__(self, model: Any, config=None, optimizer: Any = None): with Shim.global_id_lock: Shim.global_id += 1 self.id = Shim.global_id self.cfg = dict(config) if config is not None else {} self._model = model self._optimizer = optimizer def __call__(self, inputs, is_train: bool) -> Tuple[Any, Callable[..., Any]]: raise NotImplementedError def predict(self, fwd_args: Any) -> Any: Y, backprop = self(fwd_args, is_train=False) return Y def begin_update(self, fwd_args: Any) -> Tuple[Any, Callable[..., Any]]: return self(fwd_args, is_train=True) def finish_update(self, optimizer): raise NotImplementedError @contextlib.contextmanager def use_params(self, params): yield def copy(self): return copy.deepcopy(self) def to_device(self, device_type: str, device_id: int): raise NotImplementedError def to_disk(self, path: Union[str, Path]): bytes_data = self.to_bytes() path = Path(path) if isinstance(path, str) else path with path.open("wb") as file_: file_.write(bytes_data) def from_disk(self, path: Union[str, Path]) -> "Shim": path = Path(path) if isinstance(path, str) else path with path.open("rb") as file_: bytes_data = file_.read() return self.from_bytes(bytes_data) def to_bytes(self): raise NotImplementedError def from_bytes(self, data) -> "Shim": raise NotImplementedError thinc-release-v9.1.1/thinc/shims/tensorflow.py000066400000000000000000000245541467064331700214640ustar00rootroot00000000000000# mypy: ignore-errors import contextlib import copy from io import BytesIO from typing import Any, Dict, List, Optional import catalogue import numpy from ..backends import Ops, get_current_ops from ..compat import cupy, h5py from ..compat import tensorflow as tf from ..optimizers import Optimizer from ..types import ArgsKwargs, ArrayXd from ..util import get_array_module from .shim import Shim keras_model_fns = catalogue.create("thinc", "keras", entry_points=True) def maybe_handshake_model(keras_model): """Call the required predict/compile/build APIs to initialize a model if it is a subclass of tf.keras.Model. This is required to be able to call set_weights on subclassed layers.""" try: keras_model.get_config() return keras_model except (AttributeError, NotImplementedError): # Subclassed models don't implement get_config pass for prop_name in ["catalogue_name", "eg_x", "eg_y", "eg_shape"]: if not hasattr(keras_model, prop_name): raise ValueError( "Keras subclassed models are not whole-model serializable by " "TensorFlow. To work around this, you must decorate your keras " "model subclasses with the 'keras_subclass' decorator. The decorator " "requires a single X/Y input of fake-data that can be used to initialize " "your subclass model properly when loading the saved version." ) ops: Ops = get_current_ops() if ops.device_type == "cpu": device = "CPU" else: # pragma: no cover device = tf.test.gpu_device_name() compile_args = keras_model.eg_compile with tf.device(device): # Calling predict creates layers and weights for subclassed models keras_model.compile(**compile_args) keras_model.build(keras_model.eg_shape) keras_model.predict(keras_model.eg_x) # Made public in 2.2.x if hasattr(keras_model, "_make_train_function"): keras_model._make_train_function() else: keras_model.make_train_function() return keras_model class TensorFlowShim(Shim): """Interface between a TensorFlow model and a Thinc Model. This container is *not* a Thinc Model subclass itself. Reference for custom training: https://www.tensorflow.org/tutorials/customization/custom_training_walkthrough """ gradients: Optional[List["tf.Tensor"]] def __init__(self, model: Any, config=None, optimizer: Any = None): super().__init__(model, config, optimizer) self.gradients = None def __str__(self): lines: List[str] = [] def accumulate(line: str): lines.append(line) self._model.summary(print_fn=accumulate) return "\n".join(lines) def __call__(self, X: ArgsKwargs, is_train: bool): if is_train: return self.begin_update(X) else: return self.predict(X) def predict(self, X: ArgsKwargs): old_phase = tf.keras.backend.learning_phase() tf.keras.backend.set_learning_phase(0) Y = self._model(*X.args, **X.kwargs) tf.keras.backend.set_learning_phase(old_phase) return Y def begin_update(self, X: ArgsKwargs): tf.keras.backend.set_learning_phase(1) tape = tf.GradientTape() tape.__enter__() tape.watch(X.args) # watch the input layers output = self._model(*X.args, **X.kwargs) def backprop(d_output): # d_args[0] contains derivative of loss wrt output (d_loss/d_output) tape.__exit__(None, None, None) # We need to handle a tuple of inputs if len(X.args) == 1: wrt_tensors = [X.args[0]] # add the input layer also for d_loss/d_input else: wrt_tensors = list(X.args[0]) wrt_tensors.extend(self._model.trainable_variables) all_gradients = tape.gradient( output, wrt_tensors, output_gradients=d_output ) dX = all_gradients[: len(X.args)] opt_grads = all_gradients[1:] # Accumulate gradients if self.gradients is not None: assert len(opt_grads) == len(self.gradients), "gradients must match" variable: tf.Variable for variable, new_variable in zip(self.gradients, opt_grads): variable.assign_add(new_variable) else: # Create variables from the grads to allow accumulation self.gradients = [tf.Variable(f) for f in opt_grads] return ArgsKwargs(args=tuple(dX), kwargs={}) return output, backprop def finish_update(self, optimizer: Optimizer): if self.gradients is None: raise ValueError( "There are no gradients for optimization. Be sure to call begin_update" " before calling finish_update." ) assert len(self.gradients) == len(self._model.trainable_variables) grad: tf.Tensor variable: tf.Variable params = [] grads = [] shapes = [] for grad, variable in zip(self.gradients, self._model.trainable_variables): param = variable.numpy() grad = grad.numpy() shapes.append((param.size, param.shape)) params.append(param.ravel()) grads.append(grad.ravel()) xp = get_array_module(params[0]) flat_params, flat_grads = optimizer( (self.id, "tensorflow-shim"), xp.concatenate(params), xp.concatenate(grads) ) start = 0 for grad, variable in zip(self.gradients, self._model.trainable_variables): size, shape = shapes.pop(0) param = flat_params[start : start + size].reshape(shape) variable.assign(param) start += size self.gradients = None def _load_weights_from_state_dict( self, state_dict: Optional[Dict[str, ArrayXd]] = None ): if state_dict is None: state_dict = self._create_state_dict() for layer in self._model.layers: current_layer_weights = [] for weight in layer.weights: current_layer_weights.append(state_dict[weight.name]) layer.set_weights(current_layer_weights) # Create a state dict similar to PyTorch def _create_state_dict(self): # key as variable name and value as numpy arrays state_dict = {} for layer in self._model.layers: for weight in layer.weights: state_dict[weight.name] = weight.numpy() return state_dict @contextlib.contextmanager def use_params(self, params): key_prefix = f"tensorflow_{self.id}_" # state dict stores key as name and value as numpy array state_dict = {} for k, v in params.items(): if hasattr(k, "startswith") and k.startswith(key_prefix): if cupy is None: assert isinstance(v, numpy.ndarray) else: # pragma: no cover if isinstance(v, cupy.core.core.ndarray): v = cupy.asnumpy(v) assert isinstance(v, numpy.ndarray) state_dict[k.replace(key_prefix, "")] = v if state_dict: backup = self._create_state_dict() self._load_weights_from_state_dict(state_dict) yield self._load_weights_from_state_dict(backup) else: yield def _clone_model(self): """similar to tf.keras.models.clone_model() But the tf.keras.models.clone_model changes the names of tf.Variables. This method even preserves that """ model_json_config = self._model.to_json() tf.keras.backend.clear_session() self._model = tf.keras.models.model_from_json(model_json_config) self._load_weights_from_state_dict() def copy(self): model_json_config = self._model.to_json() self._model = None tf.keras.backend.clear_session() copied = copy.deepcopy(self) copied._model = tf.keras.models.model_from_json(model_json_config) copied._load_weights_from_state_dict() return copied def to_device(self, device_type: str, device_id: int): # pragma: no cover if device_type == "cpu": with tf.device("/CPU"): # pragma: no cover self._clone_model() elif device_type == "gpu": with tf.device("/GPU:{}".format(device_id)): self._clone_model() def to_bytes(self): filelike = BytesIO() try: with h5py.File(filelike, "w") as f: self._model.save(f, save_format="h5") return filelike.getvalue() except NotImplementedError: if not hasattr(self._model, "catalogue_name"): raise ValueError( "Couldn't serialize to h5, and model has no factory " "function for component serialization." ) # Check the factory function and throw ValueError if it doesn't exist keras_model_fns.get(self._model.catalogue_name) return self._model.catalogue_name, self._model.get_weights() def from_bytes(self, data): ops: Ops = get_current_ops() if ops.device_type == "cpu": device = "CPU" else: # pragma: no cover device = tf.test.gpu_device_name() # Plain bytes if isinstance(data, (str, bytes)): tf.keras.backend.clear_session() filelike = BytesIO(data) filelike.seek(0) with h5py.File(filelike, "r") as f: with tf.device(device): self._model = tf.keras.models.load_model(f) return # We only have to create the model if it doesn't already exist. catalogue_name, model_weights = data if self._model is None: model_fn = keras_model_fns.get(catalogue_name) tf.keras.backend.clear_session() with tf.device(device): if hasattr(self._model, "eg_args"): ak: ArgsKwargs = self._model.eg_args new_model = model_fn(*ak.args, **ak.kwargs) else: new_model = model_fn() self._model_initialized = maybe_handshake_model(new_model) self._model.set_weights(model_weights) thinc-release-v9.1.1/thinc/shims/torchscript.py000066400000000000000000000046351467064331700216240ustar00rootroot00000000000000from io import BytesIO from typing import Any, Optional import srsly from ..compat import torch from ..util import get_torch_default_device from .pytorch import PyTorchShim from .pytorch_grad_scaler import PyTorchGradScaler class TorchScriptShim(PyTorchShim): """A Thinc shim that wraps a TorchScript module. model: The TorchScript module. A value of `None` is also possible to construct a shim to deserialize into. mixed_precision: Enable mixed-precision. This changes whitelisted ops to run in half precision for better performance and lower memory use. grad_scaler: The gradient scaler to use for mixed-precision training. If this argument is set to "None" and mixed precision is enabled, a gradient scaler with the default configuration is used. device: The PyTorch device to run the model on. When this argument is set to "None", the default device for the currently active Thinc ops is used. """ def __init__( self, model: Optional["torch.jit.ScriptModule"], config=None, optimizer: Any = None, mixed_precision: bool = False, grad_scaler: Optional[PyTorchGradScaler] = None, device: Optional["torch.device"] = None, ): if model is not None and not isinstance(model, torch.jit.ScriptModule): raise ValueError( "PyTorchScriptShim must be initialized with ScriptModule or None (for deserialization)" ) super().__init__(model, config, optimizer, mixed_precision, grad_scaler, device) def to_bytes(self): filelike = BytesIO() torch.jit.save(self._model, filelike) filelike.seek(0) model_bytes = filelike.getvalue() msg = {"config": self.cfg, "model": model_bytes} return srsly.msgpack_dumps(msg) def from_bytes(self, bytes_data): device = get_torch_default_device() msg = srsly.msgpack_loads(bytes_data) self.cfg = msg["config"] filelike = BytesIO(msg["model"]) filelike.seek(0) # As of Torch 2.0.0, loading TorchScript models directly to # an MPS device is not supported. map_location = torch.device("cpu") if device.type == "mps" else device self._model = torch.jit.load(filelike, map_location=map_location) self._model.to(device) self._grad_scaler.to_(device) return self thinc-release-v9.1.1/thinc/tests/000077500000000000000000000000001467064331700167155ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/__init__.py000066400000000000000000000000001467064331700210140ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/backends/000077500000000000000000000000001467064331700204675ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/backends/__init__.py000066400000000000000000000000001467064331700225660ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/backends/_apple_blas/000077500000000000000000000000001467064331700227305ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/backends/_apple_blas/__init__.py000066400000000000000000000000001467064331700250270ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/backends/_apple_blas/test_gemm.py000066400000000000000000000046231467064331700252730ustar00rootroot00000000000000import numpy import pytest from thinc.compat import has_apple_ops try: import thinc.backends._accelerate as accelerate except: pass @pytest.mark.skipif(not has_apple_ops, reason="Apple ops not available") def test_basic_sgemm(): A = numpy.random.randn(5, 4).astype("f") B = numpy.random.randn(4, 7).astype("f") C = accelerate.gemm(A, B) assert C.shape == (A.shape[0], B.shape[1]) C_out = numpy.empty((5, 7), dtype="f") accelerate.gemm(A, B, out=C_out) numpy.testing.assert_allclose(C, C_out) @pytest.mark.skipif(not has_apple_ops, reason="Apple ops not available") def test_incorrect_output_size(): A = numpy.ndarray((5, 4), dtype="f") B = numpy.ndarray((4, 7), dtype="f") with pytest.raises(ValueError, match=r"Shape mismatch for output matrix"): accelerate.gemm(A, B, out=numpy.ndarray((3, 7), dtype="f")) with pytest.raises(ValueError, match=r"Shape mismatch for output matrix"): accelerate.gemm(A, B, out=numpy.ndarray((5, 3), dtype="f")) @pytest.mark.skipif(not has_apple_ops, reason="Apple ops not available") @pytest.mark.parametrize( "A_shape,B_shape,transA,transB", [ [(0, 0), (0, 0), False, False], [(0, 0), (0, 0), True, False], [(0, 0), (0, 0), False, True], [(0, 0), (0, 0), True, True], [(0, 5), (5, 0), False, False], [(5, 0), (5, 0), False, True], [(5, 0), (5, 0), True, False], ], ) def test_zero_size(A_shape, B_shape, transA, transB): A = numpy.ndarray(A_shape, dtype="f") B = numpy.ndarray(B_shape, dtype="f") if not transA and not transB: C = numpy.dot(A, B) elif transA: C = numpy.dot(A.T, B) elif transB: C = numpy.dot(A, B.T) else: C = numpy.dot(A.T, B.T) C_ = accelerate.gemm(A, B, trans1=transA, trans2=transB) assert C.shape == C_.shape @pytest.mark.skipif(not has_apple_ops, reason="Apple ops not available") @pytest.mark.parametrize( "A_shape,B_shape,transA,transB", [ [(4, 5), (4, 5), False, False], [(5, 4), (4, 5), True, False], [(4, 5), (5, 4), False, True], [(5, 4), (5, 4), True, True], ], ) def test_incorrect_shapes(A_shape, B_shape, transA, transB): A = numpy.ndarray(A_shape, dtype="f") B = numpy.ndarray(B_shape, dtype="f") with pytest.raises(ValueError, match=r"Shape mismatch"): accelerate.gemm(A, B, trans1=transA, trans2=transB) thinc-release-v9.1.1/thinc/tests/backends/test_mem.py000066400000000000000000000005471467064331700226640ustar00rootroot00000000000000import numpy from thinc.backends._param_server import ParamServer def test_param_server_init(): array = numpy.zeros((5,), dtype="f") params = {("a", 1): array, ("b", 2): array} grads = {("a", 1): array, ("c", 3): array} ps = ParamServer(params, grads) assert ps.param_keys == (("a", 1), ("b", 2)) assert ps.grad_keys == (("a", 1),) thinc-release-v9.1.1/thinc/tests/backends/test_mps_ops.py000066400000000000000000000006021467064331700235560ustar00rootroot00000000000000from thinc.api import NumpyOps, get_ops from thinc.compat import has_apple_ops def test_mps_ops_inherits_apple_ops(): ops = get_ops("mps") assert isinstance(ops, NumpyOps) if has_apple_ops: # We can't import AppleOps directly, because its' not # available on non-Darwin systems. assert "AppleOps" in [base.__name__ for base in type(ops).__bases__] thinc-release-v9.1.1/thinc/tests/backends/test_ops.py000066400000000000000000001467351467064331700227210ustar00rootroot00000000000000import inspect import platform from typing import Tuple, cast import numpy import pytest from hypothesis import given, settings from hypothesis.strategies import composite, integers from numpy.testing import assert_allclose from packaging.version import Version from thinc.api import ( LSTM, CupyOps, NumpyOps, Ops, fix_random_seed, get_current_ops, get_ops, use_ops, ) from thinc.backends._custom_kernels import KERNELS, KERNELS_LIST, compile_mmh from thinc.compat import has_cupy_gpu, has_torch, torch_version from thinc.types import Floats2d from thinc.util import torch2xp, xp2torch from .. import strategies from ..strategies import arrays_BI, ndarrays_of_shape MAX_EXAMPLES = 10 VANILLA_OPS = Ops(numpy) # type:ignore NUMPY_OPS = NumpyOps() BLIS_OPS = NumpyOps(use_blis=True) CPU_OPS = [NUMPY_OPS, VANILLA_OPS] XP_OPS = [NUMPY_OPS] if has_cupy_gpu: XP_OPS.append(CupyOps()) ALL_OPS = XP_OPS + [VANILLA_OPS] FLOAT_TYPES = ["float32", "float64"] INT_TYPES = ["int32", "int64"] REDUCTIONS = ["reduce_first", "reduce_last", "reduce_max", "reduce_mean", "reduce_sum"] REDUCE_ZERO_LENGTH_RAISES = [ ("reduce_first", True), ("reduce_last", True), ("reduce_max", True), # From a mathematical perspective we'd want mean reduction to raise for # zero-length sequences, since floating point numbers are not a monoid # under averaging. However, floret relies on reduce_mean to return a # zero-vector in this case. ("reduce_mean", False), ("reduce_sum", False), ] def create_pytorch_funcs(): import math import torch def torch_relu(x): return torch.nn.functional.relu(x) def torch_relu_k(x): return torch.nn.functional.relu6(x) def torch_hard_sigmoid(x): return torch.clip(x * 0.2 + 0.5, 0, 1) def torch_hard_tanh(x): return torch.nn.functional.hardtanh(x) def torch_mish(x): return torch.nn.functional.mish(x) def torch_swish(x): return torch.nn.functional.silu(x) def torch_hard_swish(x): return x * torch_hard_sigmoid(x) def torch_hard_swish_mobilenet(x): return torch.nn.functional.hardswish(x) def torch_sigmoid(x): return torch.sigmoid(x) def torch_dish(x): return 0.5 * x * (x / (1 + x * x).sqrt() + 1) # https://github.com/huggingface/transformers/blob/master/src/transformers/activations.py#L37 def torch_gelu_approx(x): return ( 0.5 * x * ( 1.0 + torch.tanh( math.sqrt(2.0 / math.pi) * (x + 0.044715 * torch.pow(x, 3.0)) ) ) ) def torch_gelu(x): return torch.nn.functional.gelu(x) return [ ("relu", torch_relu), ("relu_k", torch_relu_k), ("hard_sigmoid", torch_hard_sigmoid), ("hard_tanh", torch_hard_tanh), ("mish", torch_mish), ("swish", torch_swish), ("hard_swish", torch_hard_swish), ("hard_swish_mobilenet", torch_hard_swish_mobilenet), ("dish", torch_dish), ("gelu_approx", torch_gelu_approx), ("gelu", torch_gelu), ("sigmoid", torch_sigmoid), ] if has_torch: TORCH_FUNCS = create_pytorch_funcs() else: TORCH_FUNCS = [] @pytest.mark.parametrize("op", [NumpyOps, CupyOps]) def test_ops_consistency(op): """Test that specific ops don't define any methods that are not on the Ops base class and that all ops methods define the exact same arguments.""" attrs = [m for m in dir(op) if not m.startswith("_")] for attr in attrs: assert hasattr(Ops, attr) method = getattr(op, attr) if hasattr(method, "__call__"): sig = inspect.signature(method) params = [p for p in sig.parameters][1:] base_sig = inspect.signature(getattr(Ops, attr)) base_params = [p for p in base_sig.parameters][1:] assert params == base_params, attr defaults = [p.default for p in sig.parameters.values()][1:] base_defaults = [p.default for p in base_sig.parameters.values()][1:] assert defaults == base_defaults, attr # If args are type annotated, their types should be the same annots = [p.annotation for p in sig.parameters.values()][1:] base_annots = [p.annotation for p in base_sig.parameters.values()][1:] for i, (p1, p2) in enumerate(zip(annots, base_annots)): if p1 != inspect.Parameter.empty and p2 != inspect.Parameter.empty: # Need to check string value to handle TypeVars etc. assert str(p1) == str(p2), attr @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.filterwarnings("ignore::RuntimeWarning") def test_adam_incorrect_inputs(ops): one = ops.xp.zeros(1, dtype="f") two = ops.xp.zeros(2, dtype="f") ops.adam(one, one, one, one, 0.0, 0.0, 0.0, 0.0) with pytest.raises(ValueError): ops.adam(two, one, one, one, 0.0, 0.0, 0.0, 0.0) with pytest.raises(ValueError): ops.adam(one, two, one, one, 0.0, 0.0, 0.0, 0.0) with pytest.raises(ValueError): ops.adam(one, one, two, one, 0.0, 0.0, 0.0, 0.0) with pytest.raises(ValueError): ops.adam(one, one, one, two, 0.0, 0.0, 0.0, 0.0) @pytest.mark.parametrize("ops", ALL_OPS) def test_alloc(ops): float_methods = (ops.alloc1f, ops.alloc2f, ops.alloc3f, ops.alloc4f) for i, method in enumerate(float_methods): shape = (1,) * (i + 1) arr = method(*shape) assert arr.dtype == numpy.float32 assert arr.ndim == len(shape) arr = ops.alloc_f(shape) assert arr.dtype == numpy.float32 assert arr.ndim == len(shape) int_methods = (ops.alloc1i, ops.alloc2i, ops.alloc3i, ops.alloc4i) for i, method in enumerate(int_methods): shape = (1,) * (i + 1) arr = method(*shape) assert arr.dtype == numpy.int32 assert arr.ndim == len(shape) arr = ops.alloc_i(shape) assert arr.dtype == numpy.int32 assert arr.ndim == len(shape) assert ops.alloc(1).ndim == 1 @pytest.mark.parametrize("ops", XP_OPS) def test_hash_gives_distinct_keys(ops): ids = ops.alloc1f(5, dtype="uint64") keys = ops.hash(ids, 0) assert keys.shape == (5, 4) assert keys.dtype == "uint32" for i in range(len(ids)): for j in range(keys.shape[1]): assert keys[i, j] != 0 @pytest.mark.parametrize("ops", XP_OPS) def test_get_dropout_empty(ops): shape = (2, 2) drop = 0.0 mask = ops.get_dropout_mask(shape, drop) if drop <= 0.0: assert mask[mask == 1.0].all() else: assert mask[mask != 1.0].all() @pytest.mark.parametrize("ops", XP_OPS) def test_get_dropout_not_empty(ops): shape = (200, 200) drop = 0.5 mask = ops.get_dropout_mask(shape, drop) assert (mask > 1.0).any() assert (mask == 0.0).any() assert mask.shape == shape @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) @pytest.mark.parametrize("index_dtype", ["int32", "uint32"]) def test_gather_add(ops, dtype, index_dtype): table = ops.xp.arange(12, dtype=dtype).reshape(4, 3) indices = ops.xp.array([[0, 2], [3, 1], [0, 1]], dtype=index_dtype) gathered = ops.gather_add(table, indices) ops.xp.testing.assert_allclose( gathered, [[6.0, 8.0, 10.0], [12.0, 14.0, 16.0], [3.0, 5.0, 7.0]] ) @pytest.mark.parametrize("ops", XP_OPS) @given(table=strategies.arrays_BI()) def test_gather_add_against_numpy(ops, table): table = ops.asarray(table) indices = ops.xp.arange(100, dtype="i").reshape(25, 4) % table.shape[0] ops.xp.testing.assert_allclose( ops.gather_add(table, indices), table[indices].sum(1), atol=1e-5, ) @pytest.mark.parametrize("ops", ALL_OPS) def test_gather_add_oob_raises(ops): table = ops.xp.arange(12, dtype="f").reshape(4, 3) indices = ops.xp.array([[0, 2], [3, 1], [5, 1]], dtype="i") with pytest.raises(IndexError): ops.gather_add(table, indices) @pytest.mark.parametrize("ops", CPU_OPS) def test_seq2col_window_one_small(ops): seq = ops.asarray([[1.0], [3.0], [4.0], [5]], dtype="float32") cols = ops.seq2col(seq, 1) if hasattr(cols, "get"): cols = cols.get() assert_allclose(cols[0], [0.0, 1.0, 3.0]) assert_allclose(cols[1], [1.0, 3.0, 4.0]) assert_allclose(cols[2], [3.0, 4.0, 5.0]) assert_allclose(cols[3], [4.0, 5.0, 0.0]) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BOP()) def test_maxout(ops, dtype, X): X = ops.asarray(X, dtype=dtype) expected_best = X.max(axis=-1).astype(dtype) predicted_best, which = ops.maxout(X) assert predicted_best.dtype == dtype ops.xp.testing.assert_allclose( expected_best, predicted_best, rtol=0.001, atol=0.001 ) # Can't compare 'which' directly, as sort order might be different. # So, instead we use 'which' to extract elements from X and then # check the result against the expected output. ops.xp.testing.assert_allclose( ops.xp.take_along_axis(X, ops.xp.expand_dims(which, -1), axis=-1), ops.xp.expand_dims(expected_best, -1), atol=1e-10, ) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_backprop_maxout(ops, dtype): dX = ops.backprop_maxout( ops.asarray2f([[1.0, 2.0], [3.0, 4.0]], dtype=dtype), ops.asarray2i([[1, 0], [2, 1]]), 3, ) assert dX.dtype == dtype ops.xp.testing.assert_allclose( dX, [[[0.0, 1.0, 0.0], [2.0, 0.0, 0.0]], [[0.0, 0.0, 3.0], [0.0, 4.0, 0.0]]], ) with pytest.raises(IndexError): ops.backprop_maxout( ops.asarray2f([[1.0, 2.0], [3.0, 4.0]]), ops.asarray2i([[1, 0], [3, 1]]), 3 ) @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_seq2col_window_one(ops, X): X = ops.asarray(X) base_ops = Ops() base_ops.xp = ops.xp baseX = base_ops.alloc(X.shape) + X target = base_ops.seq2col(base_ops.asarray(baseX), nW=1) predicted = ops.seq2col(X, nW=1) ops.xp.testing.assert_allclose(target, predicted, atol=0.001, rtol=0.001) @pytest.mark.parametrize("ops", XP_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_seq2col_lengths_all_zero(ops, dtype): # Empty batch ops.xp.testing.assert_allclose( ops.alloc((0, 0), dtype=dtype), ops.seq2col( ops.alloc((0, 0), dtype=dtype), 1, lengths=ops.xp.zeros((0,), dtype="int32") ), ) ops.xp.testing.assert_allclose( ops.alloc((0, 0), dtype=dtype), ops.backprop_seq2col( ops.alloc((0, 0), dtype=dtype), 1, lengths=ops.xp.zeros((0,), dtype="int32") ), ) # Zero-length sequence ops.xp.testing.assert_allclose( ops.alloc((0, 0), dtype=dtype), ops.seq2col(ops.alloc((0, 0), dtype=dtype), 1, lengths=ops.asarray1i([0])), ) ops.xp.testing.assert_allclose( ops.alloc((0, 0), dtype=dtype), ops.backprop_seq2col( ops.alloc((0, 0), dtype=dtype), 1, lengths=ops.asarray1i([0]) ), ) # Multiple zero-length sequences ops.xp.testing.assert_allclose( ops.alloc((0, 0), dtype=dtype), ops.seq2col(ops.alloc((0, 0), dtype=dtype), 1, lengths=ops.asarray1i([0, 0])), ) ops.xp.testing.assert_allclose( ops.alloc((0, 0), dtype=dtype), ops.backprop_seq2col( ops.alloc((0, 0), dtype=dtype), 1, lengths=ops.asarray1i([0, 0]) ), ) @pytest.mark.parametrize("ops", XP_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_seq2col_lengths_zero_first_last(ops, dtype): cols_check = ops.asarray2f( [ [0, 0, 0, 1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6, 7, 8, 9], [4, 5, 6, 7, 8, 9, 10, 11, 12], [7, 8, 9, 10, 11, 12, 13, 14, 15], [10, 11, 12, 13, 14, 15, 0, 0, 0], ], dtype=dtype, ) grad_check = ops.asarray2f( [[2, 4, 6], [12, 15, 18], [21, 24, 27], [30, 33, 36], [26, 28, 30]], dtype=dtype ) # Initial zero-length sequence ops.xp.testing.assert_allclose( cols_check, ops.seq2col( ops.xp.arange(1.0, 16.0, dtype=dtype).reshape(5, 3), 1, lengths=ops.asarray1i([0, 5]), ), ) ops.xp.testing.assert_allclose( grad_check, ops.backprop_seq2col( cols_check, 1, lengths=ops.asarray1i([0, 5]), ), ) # Final zero-length sequence. ops.xp.testing.assert_allclose( cols_check, ops.seq2col( ops.xp.arange(1.0, 16.0, dtype=dtype).reshape(5, 3), 1, lengths=ops.asarray1i([5, 0]), ), ) @pytest.mark.parametrize("ops", XP_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_seq2col_lengths_zero_between(ops, dtype): cols_check = ops.asarray2f( [ [0, 0, 0, 1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6, 7, 8, 9], [4, 5, 6, 7, 8, 9, 10, 11, 12], [7, 8, 9, 10, 11, 12, 13, 14, 15], [10, 11, 12, 13, 14, 15, 0, 0, 0], [0, 0, 0, 16, 17, 18, 19, 20, 21], [16, 17, 18, 19, 20, 21, 0, 0, 0], ], dtype=dtype, ) grad_check = ops.asarray2f( [ [2, 4, 6], [12, 15, 18], [21, 24, 27], [30, 33, 36], [26, 28, 30], [32, 34, 36], [38, 40, 42], ], dtype=dtype, ) # Zero-length between. ops.xp.testing.assert_allclose( cols_check, ops.seq2col( ops.xp.arange(1.0, 22.0, dtype=dtype).reshape(7, 3), 1, lengths=ops.asarray1i([5, 0, 2]), ), ) ops.xp.testing.assert_allclose( grad_check, ops.backprop_seq2col( cols_check, 1, lengths=ops.asarray1i([5, 0, 2]), ), ) # Zero-length between twice. ops.xp.testing.assert_allclose( cols_check, ops.seq2col( ops.xp.arange(1.0, 22.0, dtype=dtype).reshape(7, 3), 1, lengths=ops.asarray1i([5, 0, 0, 2]), ), ) ops.xp.testing.assert_allclose( grad_check, ops.backprop_seq2col( cols_check, 1, lengths=ops.asarray1i([5, 0, 0, 2]), ), ) @pytest.mark.parametrize("ops", XP_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_seq2col_window_one_lengths(ops, dtype): X = ops.xp.arange(1.0, 16.0, dtype=dtype).reshape(5, 3) lengths = ops.asarray1i([1, 3, 1]) cols = ops.seq2col(X, 1, lengths=lengths) ops.xp.testing.assert_allclose( ops.asarray2f( [ [0, 0, 0, 1, 2, 3, 0, 0, 0], [0, 0, 0, 4, 5, 6, 7, 8, 9], [4, 5, 6, 7, 8, 9, 10, 11, 12], [7, 8, 9, 10, 11, 12, 0, 0, 0], [0, 0, 0, 13, 14, 15, 0, 0, 0], ], dtype=dtype, ), cols, ) @pytest.mark.parametrize("ops", XP_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_seq2col_window_two_lengths(ops, dtype): X = ops.xp.arange(1.0, 16.0, dtype=dtype).reshape(5, 3) lengths = ops.asarray1i([1, 3, 1]) cols = ops.seq2col(X, 2, lengths=lengths) ops.xp.testing.assert_allclose( ops.asarray2f( [ [0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12], [0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 0], [4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 13, 14, 15, 0, 0, 0, 0, 0, 0], ], dtype=dtype, ), cols, ) @pytest.mark.parametrize("ops", XP_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_backprop_seq2col_window_one_small(ops, dtype): cols = ops.asarray( [[0.0, 0.0, 0.0], [-1.0, 0.0, 1.0], [2.0, 0.0, 0.0]], dtype=dtype ) expected = [[-1.0], [2.0], [1.0]] seq = ops.backprop_seq2col(cols, 1) if not isinstance(seq, numpy.ndarray): seq = seq.get() assert_allclose(seq, expected, atol=0.001, rtol=0.001) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_backprop_seq2col_window_one(ops, dtype, X): if X.shape[1] % 3: return None X = ops.asarray(X, dtype=dtype) if ops.xp.abs(X).max() >= 30: return None base_ops = Ops() base_ops.xp = ops.xp target = base_ops.backprop_seq2col(X, nW=1) predicted = ops.backprop_seq2col(X, nW=1) for row in range(target.shape[0]): diff = target[row].sum() - predicted[row].sum() if diff < -0.1 or diff > 0.1: print(row, diff) print(target[row]) print(predicted[row]) ops.xp.testing.assert_allclose(target, predicted, atol=0.001, rtol=0.001) @pytest.mark.parametrize("ops", XP_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_backprop_seq2col_window_one_lengths(ops, dtype): d_y = ops.xp.arange(0.1, 4.6, step=0.1, dtype=dtype).reshape(5, 9) lengths = ops.asarray1i([1, 3, 1]) d_seqs = ops.backprop_seq2col(d_y, 1, lengths=lengths) ops.xp.testing.assert_allclose( ops.asarray2f( [ [0.4, 0.5, 0.6], [3.2, 3.4, 3.6], [6.6, 6.9, 7.2], [5.6, 5.8, 6.0], [4.0, 4.1, 4.2], ], dtype=dtype, ), d_seqs, atol=1e-6, ) @pytest.mark.parametrize("ops", XP_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_seq2col_window_two(ops, dtype): seq = ops.asarray([[1.0], [2.0], [3.0], [4]], dtype=dtype) cols = ops.seq2col(seq, 2) if not isinstance(cols, numpy.ndarray): cols = cols.get() assert_allclose(cols[0], [0.0, 0.0, 1.0, 2.0, 3.0]) assert_allclose(cols[1], [0.0, 1.0, 2.0, 3.0, 4.0]) assert_allclose(cols[2], [1.0, 2.0, 3.0, 4.0, 0.0]) assert_allclose(cols[3], [2.0, 3.0, 4.0, 0.0, 0.0]) @pytest.mark.parametrize("ops", XP_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_backprop_seq2col_window_two_lengths(ops, dtype): d_y = ops.xp.arange(0.1, 7.6, step=0.1, dtype=dtype).reshape(5, 15) lengths = ops.asarray1i([1, 3, 1]) d_seqs = ops.backprop_seq2col(d_y, 2, lengths=lengths) ops.xp.testing.assert_allclose( ops.asarray2f( [ [0.7, 0.8, 0.9], [10.2, 10.5, 10.8], [11.1, 11.4, 11.7], [12.0, 12.3, 12.6], [6.7, 6.8, 6.9], ], dtype=dtype, ), d_seqs, ) @pytest.mark.parametrize("ops", XP_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_backprop_seq2col_window_two(ops, dtype): cols = ops.asarray( [ [0.0, 0.0, 1.0, 2.0, 3.0], [0.0, 1.0, 2.0, 3.0, 4.0], [1.0, 2.0, 3.0, 4.0, 0.0], [2.0, 3.0, 4.0, 0.0, 0.0], ], dtype=dtype, ) # We're summing the values that each row # was used as a feature. So row 0 had a # gradient of 1 in row 0, 1 in row 2, and # 1 in row 3. expected = ops.asarray( [ [1 + 1 + 1.0 + 0.0], [2.0 + 2.0 + 2.0 + 2.0], [3.0 + 3.0 + 3.0 + 3.0], [0.0 + 4.0 + 4.0 + 4.0], ], dtype=dtype, ) seq = ops.backprop_seq2col(cols, 2) ops.xp.testing.assert_allclose(seq, expected, atol=0.001, rtol=0.001) @pytest.mark.skipif(not has_cupy_gpu, reason="needs GPU/CuPy") @pytest.mark.parametrize("nW", [1, 2]) def test_large_seq2col_gpu_against_cpu(nW): cupy_ops = CupyOps() numpy_ops = NumpyOps() # Use array with a large enough batch to require multiple # CUDA grids. batch_size = 128 * 128 * 2 # threads per block * blocks * 2 X = numpy_ops.xp.random.randn(batch_size * 2).astype("float32").reshape(-1, 2) X_gpu = cupy_ops.asarray2f(X) # Use somewhat interesting sequence lengths. lengths = numpy_ops.asarray1i([1, 4, 2, 1] * (batch_size // 8)) lengths_gpu = cupy_ops.asarray1i(lengths) cols = numpy_ops.seq2col(X, nW=nW, lengths=lengths) cols_gpu = cupy_ops.seq2col(X_gpu, nW=nW, lengths=lengths_gpu) assert_allclose(cols, cols_gpu.get()) @pytest.mark.skipif(not has_cupy_gpu, reason="needs GPU/CuPy") @pytest.mark.parametrize("nW", [1, 2]) def test_large_backprop_seq2col_gpu_against_cpu(nW): cupy_ops = CupyOps() numpy_ops = NumpyOps() # Use array with a large enough batch to require multiple # CUDA grids. batch_size = 128 * 128 * 2 # threads per block * blocks * 2 nF = 2 * nW + 1 d_cols = ( numpy_ops.xp.random.randn(batch_size * nF).astype("float32").reshape(-1, nF) ) d_cols_gpu = cupy_ops.asarray2f(d_cols) # Use somewhat interesting sequence lengths. lengths = numpy_ops.asarray1i([1, 4, 2, 1] * (batch_size // 8)) lengths_gpu = cupy_ops.asarray1i(lengths) d_seqs = numpy_ops.backprop_seq2col(d_cols, nW=nW, lengths=lengths) d_seqs_gpu = cupy_ops.backprop_seq2col(d_cols_gpu, nW=nW, lengths=lengths_gpu) assert_allclose(d_seqs, d_seqs_gpu.get()) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_backprop_reduce_sum(ops, dtype, X): X = ops.asarray(X, dtype=dtype) if ops.xp.abs(X).max() >= 5: return None lengths = ops.asarray([3] * len(X), dtype="i") out = ops.backprop_reduce_sum(X, lengths) assert out.dtype == dtype assert out.shape == (sum(lengths), X.shape[1]) start = 0 for i, length in enumerate(lengths): ops.xp.testing.assert_allclose( out[start : start + length].sum(axis=0), X[i] * length, rtol=0.01, atol=0.01 ) start += length @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_softmax_sums_to_one(ops, X): y = ops.softmax(ops.asarray(X)) for row in y: assert 0.99999 <= row.sum() <= 1.0001 @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_softmax_works_inplace(ops, X): X = ops.asarray(X) X = ops.softmax(X, inplace=True) for row in X: assert 0.99999 <= row.sum() <= 1.00001 def torch_softmax_with_temperature( X: Floats2d, dY: Floats2d, temperature: float ) -> Tuple[Floats2d, Floats2d]: import torch Xt = xp2torch(X, requires_grad=True) dYt = xp2torch(dY) Xt_temp = Xt / temperature Yt = torch.nn.functional.softmax(Xt_temp, dim=-1) Yt.backward(dYt) return cast(Floats2d, torch2xp(Yt)), cast( Floats2d, torch2xp(cast(torch.Tensor, Xt.grad)) ) @pytest.mark.skipif(not has_torch, reason="needs PyTorch") @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("temperature", [0.5, 1.0, 2.0]) def test_softmax_temperature(ops, temperature): X = ops.xp.arange(-10, 10, 0.2, dtype="f").reshape(10, 10) dY = ops.xp.eye(10, dtype="f") Y = ops.softmax(X, temperature=temperature) dX = ops.backprop_softmax(Y, dY, temperature=temperature) Yt, dXt = torch_softmax_with_temperature(X, dY, temperature) ops.xp.testing.assert_allclose(Y, Yt, atol=1e-6) ops.xp.testing.assert_allclose(dX, dXt, atol=1e-6) @pytest.mark.parametrize("cpu_ops", [*CPU_OPS, BLIS_OPS]) def test_gemm_computes_correctly(cpu_ops): W = numpy.zeros((3, 2), dtype="f") X = numpy.zeros((4, 2), dtype="f") W += numpy.random.uniform(size=W.size).reshape(W.shape) X += numpy.random.uniform(size=X.size).reshape(X.shape) Y = cpu_ops.gemm(X, W, trans2=True) expected = numpy.dot(X, W.T) assert_allclose(expected, Y, atol=1e-4, rtol=1e-4) W = numpy.zeros((2, 3), dtype="f") X = numpy.zeros((2, 4), dtype="f") W += numpy.random.uniform(size=W.size).reshape(W.shape) X += numpy.random.uniform(size=X.size).reshape(X.shape) Y = cpu_ops.gemm(X, W, trans1=True) expected = numpy.dot(X.T, W) assert_allclose(expected, Y, atol=1e-4, rtol=1e-4) cpu_ops.gemm(X, W, trans1=True, out=Y) @pytest.mark.parametrize("cpu_ops", [*CPU_OPS, BLIS_OPS]) def test_gemm_out_used(cpu_ops): a = b = numpy.zeros((2, 2), dtype="f") c = numpy.ones((2, 2), dtype="f") cpu_ops.gemm(a, b, out=c) assert numpy.array_equal(c, numpy.zeros((2, 2))) @pytest.mark.parametrize("cpu_ops", CPU_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_flatten_unflatten_roundtrip(cpu_ops, X): flat = cpu_ops.flatten([x for x in X]) assert flat.ndim == 1 unflat = cpu_ops.unflatten(flat, [len(x) for x in X]) assert_allclose(X, unflat) flat2 = cpu_ops.flatten([x for x in X], pad=1, dtype="f") assert len(flat2) > len(flat) unflat2 = cpu_ops.unflatten(flat2, [len(x) for x in X], pad=1) assert_allclose(X, unflat2) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES + INT_TYPES) def test_pad(ops, dtype): X = [ops.xp.arange(1, 3, dtype=dtype), ops.xp.arange(1, 5, dtype=dtype)] ops.xp.testing.assert_allclose(ops.pad(X), [[1, 2, 0, 0], [1, 2, 3, 4]]) ops.xp.testing.assert_allclose( ops.pad(X, round_to=8), [[1, 2, 0, 0, 0, 0, 0, 0], [1, 2, 3, 4, 0, 0, 0, 0]] ) X = [ ops.xp.arange(1, 5, dtype=dtype).reshape(2, 2), ops.xp.arange(1, 9, dtype=dtype).reshape(4, 2), ] ops.xp.testing.assert_allclose( ops.pad(X), [ [[1, 2], [3, 4], [0, 0], [0, 0]], [[1, 2], [3, 4], [5, 6], [7, 8]], ], ) ops.xp.testing.assert_allclose( ops.pad(X, round_to=5), [ [[1, 2], [3, 4], [0, 0], [0, 0], [0, 0]], [[1, 2], [3, 4], [5, 6], [7, 8], [0, 0]], ], ) with pytest.raises(ValueError, match=r"Rounding for padding must at least be 1"): ops.pad(X, round_to=0) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_reduce_sum(ops, dtype): X = ops.asarray2f( [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [1.0, 2.0], [3.0, 4.0]], dtype=dtype ) lengths = ops.asarray1i([3, 2]) ops.xp.testing.assert_allclose( ops.reduce_sum(X, lengths), [[9.0, 12.0], [4.0, 6.0]] ) # Zero-length array lengths = ops.asarray1i([3, 0, 2]) ops.xp.testing.assert_allclose( ops.reduce_sum(X, lengths), [[9.0, 12.0], [0.0, 0.0], [4.0, 6.0]] ) with pytest.raises(IndexError): ops.reduce_sum(X, ops.xp.array([5, 5, 5, 5], dtype="i")) with pytest.raises(ValueError): ops.reduce_sum(X, ops.xp.array([-1, 10, 5, 5], dtype="i")) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_backprop_fails_with_incorrect_length(ops, dtype): with pytest.raises(ValueError, match=r"lengths must be"): ops.backprop_reduce_sum( ops.xp.arange(1, 7, dtype=dtype).reshape(2, 3), ops.xp.array([-1, 2], dtype="int32"), ) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_reduce_first(ops, dtype): X = ops.asarray2f( [[1.0, 6.0], [2.0, 7.0], [3.0, 8.0], [4.0, 9.0], [5.0, 10.0]], dtype=dtype ) lengths = ops.asarray1i([3, 2]) Y, starts_ends = ops.reduce_first(X, lengths) ops.xp.testing.assert_array_equal(starts_ends, ops.asarray1i([0, 3, 5])) ops.xp.testing.assert_allclose(Y, [[1.0, 6.0], [4.0, 9.0]]) lengths = ops.asarray1i([3, 0, 2]) with pytest.raises(ValueError, match=r"all sequence lengths must be > 0"): ops.reduce_last(X, lengths) lengths = ops.asarray1i([3, 2, 1]) with pytest.raises(IndexError, match=r"lengths must sum up to the number of rows"): ops.reduce_last(X, lengths) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_backprop_reduce_first(ops, dtype): dY = ops.asarray2f([[1.0, 3.0], [2.0, 4.0]], dtype=dtype) starts_ends = ops.asarray1i([0, 3, 5]) dX = ops.backprop_reduce_first(dY, starts_ends) ops.xp.testing.assert_allclose( dX, [[1.0, 3.0], [0.0, 0.0], [0.0, 0.0], [2.0, 4.0], [0.0, 0.0]] ) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_reduce_last(ops, dtype): X = ops.asarray2f( [[1.0, 6.0], [2.0, 7.0], [3.0, 8.0], [4.0, 9.0], [5.0, 10.0]], dtype=dtype ) lengths = ops.asarray1i([3, 2]) Y, lasts = ops.reduce_last(X, lengths) ops.xp.testing.assert_array_equal(lasts, ops.asarray1i([2, 4])) ops.xp.testing.assert_allclose(Y, [[3.0, 8.0], [5.0, 10.0]]) lengths = ops.asarray1i([3, 0, 2]) with pytest.raises(ValueError, match=r"all sequence lengths must be > 0"): ops.reduce_last(X, lengths) lengths = ops.asarray1i([3, 2, 1]) with pytest.raises(IndexError, match=r"lengths must sum up to the number of rows"): ops.reduce_last(X, lengths) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_backprop_reduce_last(ops, dtype): dY = ops.asarray2f([[1.0, 3.0], [2.0, 4.0]], dtype=dtype) lasts = ops.asarray1i([2, 4]) dX = ops.backprop_reduce_last(dY, lasts) ops.xp.testing.assert_allclose( dX, [[0.0, 0.0], [0.0, 0.0], [1.0, 3.0], [0.0, 0.0], [2.0, 4.0]] ) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_reduce_max_sm(ops, dtype): X = ops.xp.zeros((6, 3), dtype=dtype) X += ops.xp.random.uniform(-1, 1, X.shape) lengths = ops.xp.array([2, 2, 2], dtype="i") maxes, which = ops.reduce_max(X, lengths) assert maxes.dtype == dtype assert ops.xp.all(which >= 0) assert ops.xp.all(which < X.shape[0]) start = 0 for i, length in enumerate(lengths): truth = X[start : start + length].max(axis=0) ops.xp.testing.assert_allclose(maxes[i], truth) start += length @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_reduce_max(ops, dtype): m = ops.xp.zeros((19, 5), dtype=dtype) m += ops.xp.random.uniform(-1, 1, m.shape) lengths = ops.xp.array([5, 5, 3, 6], dtype="i") # m[4, 0] = 1 # m[0, 1] = 2 # m[1, 3] = 3 maxes, which = ops.reduce_max(m, lengths) assert maxes.dtype == dtype assert ops.xp.all(which >= 0) assert ops.xp.all(which < m.shape[0]) start = 0 for i, length in enumerate(lengths): truth = m[start : start + length].max(axis=0) ops.xp.testing.assert_allclose(maxes[i], truth) start += length with pytest.raises(IndexError): ops.reduce_max(m, ops.xp.array([5, 5, 5, 5], dtype="i")) with pytest.raises(ValueError): ops.reduce_max(m, ops.xp.array([-1, 10, 5, 5], dtype="i")) with pytest.raises(ValueError): ops.reduce_max(m, ops.xp.array([5, 5, 0, 3, 6], dtype="i")) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_backprop_reduce_max(ops, dtype): dX = ops.backprop_reduce_max( ops.xp.arange(1, 7, dtype=dtype).reshape(2, 3), ops.xp.array([[2, 1, 0], [1, 0, 1]]).astype("int32"), ops.xp.array([3, 2], dtype="int32"), ) assert dX.dtype == dtype ops.xp.testing.assert_allclose( dX, [ [0.0, 0.0, 3.0], [0.0, 2.0, 0.0], [1.0, 0.0, 0.0], [0.0, 5.0, 0.0], [4.0, 0.0, 6.0], ], ) with pytest.raises(IndexError): ops.backprop_reduce_max( ops.xp.arange(1, 7, dtype="f").reshape(2, 3), ops.xp.array([[2, 3, 0], [1, 0, 1]]).astype("int32"), ops.xp.array([3, 2], dtype="int32"), ) with pytest.raises(ValueError): ops.backprop_reduce_max( ops.xp.arange(1, 7, dtype=dtype).reshape(2, 3), ops.xp.array([[2, 1, 0], [1, 0, 1]]).astype("int32"), ops.xp.array([-3, 2], dtype="int32"), ) with pytest.raises(ValueError): ops.backprop_reduce_max( ops.xp.arange(1, 7, dtype=dtype).reshape(2, 3), ops.xp.array([[2, 1, 0], [1, 0, 1], [1, 0, 1]]).astype("int32"), ops.xp.array([3, 0, 2], dtype="int32"), ) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_reduce_mean(ops, dtype): X = ops.asarray2f( [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [1.0, 2.0], [3.0, 4.0]], dtype=dtype ) lengths = ops.asarray1i([3, 2]) ops.xp.testing.assert_allclose( ops.reduce_mean(X, lengths), [[3.0, 4.0], [2.0, 3.0]] ) # Zero-length array lengths = ops.asarray1i([3, 0, 2]) ops.xp.testing.assert_allclose( ops.reduce_mean(X, lengths), [[3.0, 4.0], [0.0, 0.0], [2.0, 3.0]] ) # Zero-length array last. X = ops.asarray2f([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]], dtype=dtype) lengths = ops.asarray1i([3, 0]) ops.xp.testing.assert_allclose( ops.reduce_mean(X, lengths), [[3.0, 4.0], [0.0, 0.0]] ) with pytest.raises(IndexError): ops.reduce_mean(X, ops.xp.array([3, 3], dtype="i")) with pytest.raises(ValueError): ops.reduce_mean(X, ops.xp.array([-1, 5], dtype="i")) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) def test_backprop_reduce_mean(ops, dtype): dX = ops.backprop_reduce_mean( ops.xp.arange(1, 7, dtype=dtype).reshape(2, 3), ops.xp.array([4, 2], dtype="int32"), ) assert dX.dtype == dtype ops.xp.testing.assert_allclose( dX, [ [0.25, 0.5, 0.75], [0.25, 0.5, 0.75], [0.25, 0.5, 0.75], [0.25, 0.5, 0.75], [2.0, 2.5, 3.0], [2.0, 2.5, 3.0], ], ) with pytest.raises(ValueError, match=r"lengths must be"): ops.backprop_reduce_mean( ops.xp.arange(1, 7, dtype=dtype).reshape(2, 3), ops.xp.array([-1, 2], dtype="int32"), ) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) @pytest.mark.parametrize("reduction", REDUCTIONS) def test_reduce_empty_batch(ops, dtype, reduction): func = getattr(ops, reduction) backprop_func = getattr(ops, f"backprop_{reduction}") lengths = ops.asarray1i([]) Y = func(ops.alloc((0, 10), dtype=dtype), lengths) if reduction == "reduce_max": Y, which = Y dX = backprop_func(Y, which, lengths) elif isinstance(Y, tuple): Y, extra = Y dX = backprop_func(Y, extra) else: dX = backprop_func(Y, lengths) assert Y.shape == (0, 10) assert dX.shape == (0, 10) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) @pytest.mark.parametrize("reduction", REDUCTIONS) def test_reduce_empty_hidden(ops, dtype, reduction): func = getattr(ops, reduction) backprop_func = getattr(ops, f"backprop_{reduction}") lengths = ops.asarray1i([2, 3]) Y = func(ops.alloc((5, 0), dtype=dtype), lengths) if reduction == "reduce_max": Y, which = Y dX = backprop_func(Y, which, lengths) elif isinstance(Y, tuple): Y, extra = Y dX = backprop_func(Y, extra) else: dX = backprop_func(Y, lengths) assert Y.shape == (2, 0) assert dX.shape == (5, 0) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) @pytest.mark.parametrize("reduction_raises", REDUCE_ZERO_LENGTH_RAISES) def test_reduce_zero_seq_length(ops, dtype, reduction_raises): reduction_str, raises = reduction_raises reduction = getattr(ops, reduction_str) X = ops.asarray2f( [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [1.0, 2.0], [3.0, 4.0]], dtype=dtype ) lengths = ops.asarray1i([3, 0, 2]) if raises: with pytest.raises(ValueError): reduction(X, lengths) else: # All non-raising reductions have zero as their identity element. ops.xp.testing.assert_allclose(reduction(X, lengths)[1], [0.0, 0.0]) @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_mish(ops, X): X = ops.asarray(X) Y = ops.mish(X) assert Y.shape == X.shape assert not ops.xp.isnan(Y).any() @pytest.mark.parametrize("ops", XP_OPS) @pytest.mark.parametrize("dtype", FLOAT_TYPES) @pytest.mark.parametrize( "op", [ "backprop_clipped_linear", "backprop_dish", "backprop_gelu", "backprop_gelu_approx", "backprop_hard_sigmoid", "backprop_hard_swish", "backprop_hard_swish_mobilenet", "backprop_hard_tanh", "backprop_mish", "backprop_relu", "backprop_relu_k", "backprop_softmax", "backprop_swish", ], ) def test_eltwise_backprop_rejects_incorrect_shapes(ops, dtype, op): backprop = getattr(ops, op) positional_args = [ p for p in inspect.signature(backprop).parameters.values() if p.default == inspect.Parameter.empty ] if len(positional_args) == 3: with pytest.raises(ValueError): backprop( ops.xp.zeros(10, dtype=dtype), ops.xp.zeros(5, dtype=dtype), ops.xp.zeros(10, dtype=dtype), ) with pytest.raises(ValueError): backprop( ops.xp.zeros(10, dtype=dtype), ops.xp.zeros(10, dtype=dtype), ops.xp.zeros(5, dtype=dtype), ) else: with pytest.raises(ValueError): backprop( ops.xp.arange(-10, 10, dtype=dtype), ops.xp.arange(5, -5, -1, dtype=dtype), ) @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_relu_k(ops, X): X = ops.asarray(X) Y = ops.relu_k(X) assert Y.shape == X.shape assert not ops.xp.isnan(Y).any() assert (Y >= 0).sum() == Y.size assert (Y <= 6.0).sum() == Y.size @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_swish(ops, X): X = ops.asarray(X) Y = ops.swish(X) assert Y.shape == X.shape assert not ops.xp.isnan(Y).any() @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_hard_sigmoid(ops, X): X = ops.asarray(X) Y = ops.hard_sigmoid(X) assert Y.shape == X.shape assert not ops.xp.isnan(Y).any() assert (Y >= 0).sum() == Y.size assert (Y <= 1.0).sum() == Y.size @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_hard_tanh(ops, X): X = ops.asarray(X) Y = ops.hard_tanh(X) assert Y.shape == X.shape assert not ops.xp.isnan(Y).any() assert (Y >= -1.0).sum() == Y.size assert (Y <= 1.0).sum() == Y.size @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_hard_swish(ops, X): X = ops.asarray(X) Y = ops.hard_swish(X) assert Y.shape == X.shape assert not ops.xp.isnan(Y).any() @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_hard_swish_mobilenet(ops, X): X = ops.asarray(X) Y = ops.hard_swish_mobilenet(X) assert Y.shape == X.shape assert not ops.xp.isnan(Y).any() @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_gelu_approx(ops, X): X = ops.asarray(X) Y = ops.gelu_approx(X) assert Y.shape == X.shape assert not ops.xp.isnan(Y).any() @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_dish(ops, X): X = ops.asarray(X) Y = ops.dish(X) assert Y.shape == X.shape assert not ops.xp.isnan(Y).any() @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_gelu(ops, X): X = ops.asarray(X) Y = ops.gelu(X) assert Y.shape == X.shape assert not ops.xp.isnan(Y).any() @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(X=strategies.arrays_BI()) def test_backprop_mish(ops, X): X = ops.asarray(X) # Test zero gradients result in 0 dX zeros = ops.alloc(X.shape) dX = ops.backprop_mish(zeros, X) assert dX.shape == X.shape assert (dX == 0).all() def get_lstm_args(depth, dirs, nO, batch_size, nI, draw=None): if dirs == 1: n_params = (nO * 4) * nI + nO * 4 + nO * 4 * nO + nO * 4 for _ in range(1, depth): n_params += nO * 4 * nO + nO * 4 + nO * 4 * nO + nO * 4 else: n_params = (nO * 2) * nI + nO * 2 + nO * 2 * (nO // 2) + nO * 2 for _ in range(1, depth): n_params += nO * 2 * nO + nO * 2 + nO * 2 * (nO // 2) + nO * 2 n_params *= 2 lstm = LSTM(nO, nI, depth=depth, bi=dirs >= 2).initialize() assert lstm.get_param("LSTM").size == n_params if draw: params = draw(ndarrays_of_shape(n_params)) # For some reason this is crashing hypothesis? # size_at_t = draw(ndarrays_of_shape(shape=(batch_size,), lo=1, dtype="int32")) size_at_t = numpy.ones(shape=(batch_size,), dtype="int32") X = draw(ndarrays_of_shape((int(size_at_t.sum()), nI))) else: params = numpy.ones((n_params,), dtype="f") size_at_t = numpy.ones(shape=(batch_size,), dtype="int32") X = numpy.zeros(((int(size_at_t.sum()), nI))) H0 = numpy.zeros((depth, dirs, nO // dirs)) C0 = numpy.zeros((depth, dirs, nO // dirs)) return (params, H0, C0, X, size_at_t) @composite def draw_lstm_args(draw): depth = draw(integers(1, 4)) dirs = draw(integers(1, 2)) nO = draw(integers(1, 16)) * dirs batch_size = draw(integers(1, 6)) nI = draw(integers(1, 16)) return get_lstm_args(depth, dirs, nO, batch_size, nI, draw=draw) @pytest.mark.parametrize("ops", XP_OPS) @pytest.mark.parametrize( "depth,dirs,nO,batch_size,nI", [ (1, 1, 1, 1, 1), (1, 1, 2, 1, 1), (1, 1, 2, 1, 2), (2, 1, 1, 1, 1), (2, 1, 2, 2, 2), (1, 2, 2, 1, 1), (2, 2, 2, 2, 2), ], ) def test_lstm_forward_training(ops, depth, dirs, nO, batch_size, nI): reference_ops = Ops() params, H0, C0, X, size_at_t = get_lstm_args(depth, dirs, nO, batch_size, nI) reference = reference_ops.lstm_forward_training(params, H0, C0, X, size_at_t) Y, fwd_state = ops.lstm_forward_training(params, H0, C0, X, size_at_t) assert_allclose(fwd_state[2], reference[1][2], atol=1e-4, rtol=1e-3) assert_allclose(fwd_state[1], reference[1][1], atol=1e-4, rtol=1e-3) assert_allclose(Y, reference[0], atol=1e-4, rtol=1e-3) @pytest.mark.skipif(platform.machine() == "aarch64", reason="Flaky, skip temporarily") @pytest.mark.parametrize("ops", XP_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(args=draw_lstm_args()) def test_lstm_forward_training_fuzz(ops, args): params, H0, C0, X, size_at_t = args reference_ops = Ops() reference = reference_ops.lstm_forward_training(params, H0, C0, X, size_at_t) Y, fwd_state = ops.lstm_forward_training(params, H0, C0, X, size_at_t) assert_allclose(fwd_state[2], reference[1][2], atol=1e-4, rtol=1e-3) assert_allclose(fwd_state[1], reference[1][1], atol=1e-4, rtol=1e-3) assert_allclose(Y, reference[0], atol=1e-4, rtol=1e-3) def test_get_ops(): assert isinstance(get_ops("numpy"), NumpyOps) assert isinstance(get_ops("cupy"), CupyOps) # If Apple ops are available, "cpu" should return AppleOps or # NumpyOps otherwise. try: from thinc.backends.apple_ops import AppleOps assert isinstance(get_ops("cpu"), AppleOps) except ImportError: assert isinstance(get_ops("cpu"), NumpyOps) # If BigEndian ops are available, "cpu" should return BigEndianOps or # NumpyOps otherwise. try: from thinc_bigendian_ops import BigEndianOps assert isinstance(get_ops("cpu"), BigEndianOps) except ImportError: assert isinstance(get_ops("cpu"), NumpyOps) with pytest.raises(ValueError): get_ops("blah") ops = Ops(numpy) assert ops.xp == numpy def test_use_ops(): class_ops = get_current_ops() with use_ops("numpy"): new_ops = get_current_ops() assert new_ops.name == "numpy" with use_ops("cupy"): new_ops = get_current_ops() assert new_ops.name == "cupy" new_ops = get_current_ops() assert class_ops.name == new_ops.name def test_minibatch(): fix_random_seed(0) ops = get_current_ops() items = [1, 2, 3, 4, 5, 6] batches = ops.minibatch(3, items) assert list(batches) == [[1, 2, 3], [4, 5, 6]] batches = ops.minibatch((i for i in (3, 2, 1)), items) assert list(batches) == [[1, 2, 3], [4, 5], [6]] batches = list(ops.minibatch(3, numpy.asarray(items))) assert isinstance(batches[0], numpy.ndarray) assert numpy.array_equal(batches[0], numpy.asarray([1, 2, 3])) assert numpy.array_equal(batches[1], numpy.asarray([4, 5, 6])) batches = list(ops.minibatch((i for i in (3, 2, 1)), items, shuffle=True)) assert batches != [[1, 2, 3], [4, 5], [6]] assert len(batches[0]) == 3 assert len(batches[1]) == 2 assert len(batches[2]) == 1 with pytest.raises(ValueError): ops.minibatch(10, (i for i in range(100))) with pytest.raises(ValueError): ops.minibatch(10, True) def test_multibatch(): fix_random_seed(0) ops = get_current_ops() arr1 = numpy.asarray([1, 2, 3, 4]) arr2 = numpy.asarray([5, 6, 7, 8]) batches = list(ops.multibatch(2, arr1, arr2)) assert numpy.concatenate(batches).tolist() == [[1, 2], [5, 6], [3, 4], [7, 8]] batches = list(ops.multibatch(2, arr1, arr2, shuffle=True)) assert len(batches) == 2 assert len(batches[0]) == 2 assert len(batches[1]) == 2 batches = list(ops.multibatch(2, [1, 2, 3, 4], [5, 6, 7, 8])) assert batches == [[[1, 2], [5, 6]], [[3, 4], [7, 8]]] with pytest.raises(ValueError): ops.multibatch(10, (i for i in range(100)), (i for i in range(100))) with pytest.raises(ValueError): ops.multibatch(10, arr1, (i for i in range(100)), arr2) def test_ngrams(): ops = get_current_ops() arr1 = numpy.asarray([1, 2, 3, 4, 5], dtype=numpy.uint64) for n in range(1, 10): assert len(ops.ngrams(n, arr1)) == max(0, arr1.shape[0] - (n - 1)) assert len(ops.ngrams(-1, arr1)) == 0 assert len(ops.ngrams(arr1.shape[0] + 1, arr1)) == 0 @pytest.mark.skipif(not has_torch, reason="needs PyTorch") @pytest.mark.skipif(torch_version < Version("1.9.0"), reason="needs PyTorch 1.9.0") @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("dtype", ["float32", "float64"]) @pytest.mark.parametrize("torch_func", TORCH_FUNCS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given( x=strategies.floats(min_value=-30, max_value=30), dY=strategies.floats(min_value=-1, max_value=1), ) def test_compare_activations_to_torch(ops, dtype, x, dY, torch_func): import torch func_name, pytorch_func = torch_func forward = getattr(ops, func_name) backward = getattr(ops, "backprop_" + func_name) # The tolerance of isclose is set to 1e-06 instead of # the default 1e-08 due to the GELU x_thinc = ops.asarray([x], dtype=dtype) x_torch = xp2torch(x_thinc, requires_grad=True) y = pytorch_func(x_torch) y_thinc = forward(x_thinc) y.backward() assert x_thinc.dtype == y_thinc.dtype assert y_thinc is not x_thinc y_think_inplace = forward(x_thinc, inplace=True) assert y_think_inplace is x_thinc assert ops.xp.isclose(y_thinc, y_think_inplace, atol=1e-06) assert ops.xp.isclose(y_thinc, y.detach(), atol=1e-05) x_thinc = ops.asarray([x], dtype=dtype) dY_thinc = ops.asarray([dY], dtype=dtype) dY_thinc_inplace = dY_thinc.copy() s = inspect.signature(backward) params = {p for p in s.parameters if p in ["dY", "X", "Y"]} if params == {"dY", "X", "Y"}: dx_thinc = backward(dY_thinc, Y=y_thinc, X=x_thinc) assert dx_thinc.dtype == x_thinc.dtype assert dx_thinc is not dY_thinc dx_thinc_inplace = backward( dY=dY_thinc_inplace, Y=y_thinc, X=x_thinc, inplace=True ) assert dx_thinc_inplace is dY_thinc_inplace assert ops.xp.isclose(dx_thinc, dx_thinc_inplace) assert ops.xp.isclose(x_torch.grad.item() * dY, float(dx_thinc), atol=1e-06) elif params == {"Y", "dY"}: dx_thinc = backward(dY_thinc, Y=y_thinc) assert dx_thinc.dtype == x_thinc.dtype assert ops.xp.isclose( dx_thinc, backward(dY=dY_thinc_inplace, Y=y_thinc, inplace=True), ) assert ops.xp.isclose(x_torch.grad.item() * dY, float(dx_thinc), atol=1e-06) elif params == {"dY", "X"}: dx_thinc = backward(dY_thinc, X=x_thinc) assert dx_thinc.dtype == x_thinc.dtype assert ops.xp.isclose( dx_thinc, backward(dY=dY_thinc_inplace, X=x_thinc, inplace=True) ) assert ops.xp.isclose( x_torch.grad.item() * dY, float(backward(dY_thinc, X=x_thinc)), atol=1e-06 ) else: raise NotImplementedError( f"No PyTorch comparison implemented for parameter set: {params}" ) @pytest.mark.parametrize("ops", ALL_OPS) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(x=strategies.floats(min_value=-10, max_value=10)) def test_clipped_linear(ops, x): x_thinc = ops.xp.asarray([x]) assert ops.xp.isclose(ops.clipped_linear(x_thinc, max_val=6.0), ops.relu_k(x_thinc)) assert ops.xp.isclose( ops.backprop_clipped_linear(ops.asarray1f([1.0]), x_thinc, max_val=6.0), ops.backprop_relu_k(ops.asarray1f([1.0]), x_thinc), ) assert ops.xp.isclose( ops.clipped_linear(x_thinc, slope=0.2, offset=0.5), ops.hard_sigmoid(x_thinc) ) assert ops.xp.isclose( ops.backprop_clipped_linear( ops.asarray1f([1.0]), x_thinc, slope=0.2, offset=0.5 ), ops.backprop_hard_sigmoid(ops.asarray1f([1.0]), x_thinc), ) @pytest.mark.parametrize("ops", ALL_OPS) @pytest.mark.parametrize("byte_order", (">", "<", "=", "|")) @settings(max_examples=MAX_EXAMPLES, deadline=None) @given(x=strategies.floats(min_value=-10, max_value=10)) def test_to_numpy_byteorder(ops, byte_order, x): x = ops.xp.asarray([x]) y = ops.to_numpy(x, byte_order=byte_order) assert numpy.array_equal(ops.to_numpy(x), ops.to_numpy(y)) if byte_order in (">", "<"): # hack from: https://stackoverflow.com/a/49740663 assert y.dtype.newbyteorder("S").newbyteorder("S").byteorder == byte_order else: assert x.dtype.byteorder == y.dtype.byteorder @pytest.mark.skipif(not has_cupy_gpu, reason="needs GPU/CuPy") def test_custom_kernel_compilation(): for kernel_name in KERNELS_LIST: compiled_kernel = KERNELS.get_function(kernel_name) assert compiled_kernel is not None assert compile_mmh() is not None @pytest.mark.parametrize("ops", ALL_OPS) def test_asarray_from_list_uint64(ops): # list contains int values both above and below int64.max uint64_list = [16, 11648197037703959513] assert uint64_list == list(ops.asarray(uint64_list, dtype="uint64")) thinc-release-v9.1.1/thinc/tests/conftest.py000066400000000000000000000042411467064331700211150ustar00rootroot00000000000000import pytest from hypothesis import settings # Functionally disable deadline settings for tests # to prevent spurious test failures in CI builds. settings.register_profile("no_deadlines", deadline=2 * 60 * 1000) # in ms settings.load_profile("no_deadlines") def pytest_sessionstart(session): # If Tensorflow is installed, attempt to enable memory growth # to prevent it from allocating all of the GPU's free memory # to its internal memory pool(s). try: import tensorflow as tf physical_devices = tf.config.list_physical_devices("GPU") for device in physical_devices: try: tf.config.experimental.set_memory_growth(device, True) except: # Invalid device or cannot modify virtual devices once initialized. print(f"failed to enable Tensorflow memory growth on {device}") except ImportError: pass def pytest_addoption(parser): try: parser.addoption("--slow", action="store_true", help="include slow tests") # Options are already added, e.g. if conftest is copied in a build pipeline # and runs twice except ValueError: pass def pytest_runtest_setup(item): def getopt(opt): # When using 'pytest --pyargs thinc' to test an installed copy of # thinc, pytest skips running our pytest_addoption() hook. Later, when # we call getoption(), pytest raises an error, because it doesn't # recognize the option we're asking about. To avoid this, we need to # pass a default value. We default to False, i.e., we act like all the # options weren't given. return item.config.getoption(f"--{opt}", False) for opt in ["slow"]: if opt in item.keywords and not getopt(opt): pytest.skip(f"need --{opt} option to run") @pytest.fixture() def pathy_fixture(): pytest.importorskip("pathy") import shutil import tempfile from pathy import Pathy, use_fs temp_folder = tempfile.mkdtemp(prefix="thinc-pathy") use_fs(temp_folder) root = Pathy("gs://test-bucket") root.mkdir(exist_ok=True) yield root use_fs(False) shutil.rmtree(temp_folder) thinc-release-v9.1.1/thinc/tests/enable_mxnet.py000066400000000000000000000001341467064331700217260ustar00rootroot00000000000000from thinc.compat import enable_mxnet try: enable_mxnet() except ImportError: pass thinc-release-v9.1.1/thinc/tests/enable_tensorflow.py000066400000000000000000000001461467064331700230000ustar00rootroot00000000000000from thinc.compat import enable_tensorflow try: enable_tensorflow() except ImportError: pass thinc-release-v9.1.1/thinc/tests/layers/000077500000000000000000000000001467064331700202145ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/layers/__init__.py000066400000000000000000000000001467064331700223130ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/layers/test_basic_tagger.py000066400000000000000000000045761467064331700242530ustar00rootroot00000000000000import random import pytest from thinc.api import ( Adam, HashEmbed, Model, Relu, Softmax, chain, expand_window, strings2arrays, with_array, ) @pytest.fixture(scope="module") def ancora(): pytest.importorskip("ml_datasets") import ml_datasets return ml_datasets.ud_ancora_pos_tags() def create_embed_relu_relu_softmax(depth, width, vector_length): with Model.define_operators({">>": chain}): model = strings2arrays() >> with_array( HashEmbed(width, vector_length, column=0) >> expand_window(window_size=1) >> Relu(width, width * 3) >> Relu(width, width) >> Softmax(17, width) ) return model @pytest.fixture(params=[create_embed_relu_relu_softmax]) def create_model(request): return request.param def evaluate_tagger(model, dev_X, dev_Y, batch_size): correct = 0.0 total = 0.0 for i in range(0, len(dev_X), batch_size): Yh = model.predict(dev_X[i : i + batch_size]) Y = dev_Y[i : i + batch_size] for j in range(len(Yh)): correct += (Yh[j].argmax(axis=1) == Y[j].argmax(axis=1)).sum() total += Yh[j].shape[0] return correct / total def get_shuffled_batches(Xs, Ys, batch_size): zipped = list(zip(Xs, Ys)) random.shuffle(zipped) for i in range(0, len(zipped), batch_size): batch_X, batch_Y = zip(*zipped[i : i + batch_size]) yield list(batch_X), list(batch_Y) @pytest.mark.parametrize( ("depth", "width", "vector_width", "nb_epoch"), [(2, 32, 16, 5)] ) def test_small_end_to_end(depth, width, vector_width, nb_epoch, create_model, ancora): (train_X, train_Y), (dev_X, dev_Y) = ancora batch_size = 8 model = create_model(depth, width, vector_width).initialize() optimizer = Adam(0.001) losses = [] scores = [] for _ in range(nb_epoch): losses.append(0.0) for X, Y in get_shuffled_batches(train_X, train_Y, batch_size): Yh, backprop = model.begin_update(X) d_loss = [] for i in range(len(Yh)): d_loss.append(Yh[i] - Y[i]) losses[-1] += ((Yh[i] - Y[i]) ** 2).sum() backprop(d_loss) model.finish_update(optimizer) scores.append(evaluate_tagger(model, dev_X, dev_Y, batch_size)) assert losses[-1] < losses[0] assert scores[-1] > scores[0] thinc-release-v9.1.1/thinc/tests/layers/test_combinators.py000066400000000000000000000172241467064331700241530ustar00rootroot00000000000000import numpy import pytest from numpy.testing import assert_allclose from thinc.api import ( Dropout, Linear, Model, NumpyOps, add, clone, concatenate, map_list, noop, ) from thinc.layers import chain, tuplify @pytest.fixture(params=[1, 2, 9]) def nB(request): return request.param @pytest.fixture(params=[1, 6]) def nI(request): return request.param @pytest.fixture(params=[1, 5, 3]) def nH(request): return request.param @pytest.fixture(params=[1, 2, 7, 9]) def nO(request): return request.param @pytest.fixture def model1(nH, nI): return Linear(nH, nI) @pytest.fixture def model2(nO, nH): return Linear(nO, nH) @pytest.fixture def model3(nO): return Linear(nO, nO) def test_tuplify_zero(): with pytest.raises(TypeError): tuplify() def test_tuplify_one(model1): with pytest.raises(TypeError): tuplify(model1) def test_tuplify_two(model1, model2): model = tuplify(model1, model2) assert len(model.layers) == 2 def test_tuplify_operator_two(model1, model2): with Model.define_operators({"&": tuplify}): model = model1 & model2 assert len(model.layers) == 2 def test_tuplify_dulicates_input(): model = tuplify(noop(), noop()) ones = numpy.ones([10]) out = model.predict(ones) assert out == (ones, ones) def test_tuplify_initialize(nI, nO): linear = Linear(nO) model = tuplify(linear, linear) ones = numpy.ones((1, nI), dtype="float") model.initialize(X=ones) def test_tuplify_three(model1, model2, model3): model = tuplify(model1, model2, model3) assert len(model.layers) == 3 def test_tuplify_operator_three(model1, model2, model3): # Previously we 'flattened' these nested calls. We might opt to do so # again, especially for the operators. with Model.define_operators({"&": tuplify}): model = model1 & model2 & model3 assert len(model.layers) == 2 assert len(model.layers[0].layers) == 2 def test_chain_zero(): with pytest.raises(TypeError): chain() def test_chain_one(model1): with pytest.raises(TypeError): chain(model1) def test_chain_two(model1, model2): model = chain(model1, model2) assert len(model.layers) == 2 def test_chain_operator_two(model1, model2): with Model.define_operators({">>": chain}): model = model1 >> model2 assert len(model.layers) == 2 def test_chain_three(model1, model2, model3): model = chain(model1, model2, model3) assert len(model.layers) == 3 def test_chain_operator_three(model1, model2, model3): # Previously we 'flattened' these nested calls. We might opt to do so # again, especially for the operators. with Model.define_operators({">>": chain}): model = model1 >> model2 >> model3 assert len(model.layers) == 2 assert len(model.layers[0].layers) == 2 def test_chain_right_branch(model1, model2, model3): # Previously we 'flattened' these nested calls. We might opt to do so # again, especially for the operators. merge1 = chain(model1, model2) merge2 = chain(merge1, model3) assert len(merge1.layers) == 2 assert len(merge2.layers) == 2 @pytest.mark.parametrize("ops", [NumpyOps(), NumpyOps(use_blis=True)]) def test_chain(ops): data = numpy.asarray([[1, 2, 3, 4]], dtype="f") model = chain(Linear(1), Dropout(), Linear(1)) model.ops = ops model.initialize(data, data) Y, backprop = model(data, is_train=True) backprop(Y) # Layers with and without nO/nI model = chain(Linear(1), Dropout(), Linear(1, 1)) model.initialize(data, data) # Setting dim on model model = chain(Linear(1), Dropout(), Linear(1)) model.set_dim("nO", 1) model.initialize(data, None) model = chain(Linear(1, 1), Dropout(), Linear(1, 1)) model.set_dim("nI", 1) model.initialize(None, data) # Not enough arguments with pytest.raises(TypeError): chain(Linear()) with pytest.raises(TypeError): chain() def test_concatenate_one(model1): model = concatenate(model1) assert isinstance(model, Model) def test_concatenate_two(model1, model2): model = concatenate(model1, model2) assert len(model.layers) == 2 def test_concatenate_operator_two(model1, model2): with Model.define_operators({"|": concatenate}): model = model1 | model2 assert len(model.layers) == 2 def test_concatenate_three(model1, model2, model3): model = concatenate(model1, model2, model3) assert len(model.layers) == 3 def test_concatenate_operator_three(model1, model2, model3): with Model.define_operators({"|": concatenate}): model = model1 | model2 | model3 assert len(model.layers) == 3 def test_clone_changes_predictions(nH, nI): model1 = Linear(nH) model = clone(model1, 10) ones = numpy.ones((10, nI), dtype="f") model.initialize(X=ones) output_from_cloned = model.predict(ones) output_from_orig = model1.predict(ones) assert output_from_cloned.sum() != output_from_orig.sum() def test_clone_gives_distinct_ids(nH, nI): model = clone(Linear(nH), 5) assert len(model.layers) == 5 seen_ids = set() for node in model.walk(): assert node.id not in seen_ids seen_ids.add(node.id) assert len(seen_ids) == 6 def test_clone_noop(): model = clone(Linear(), 0) assert len(model.layers) == 0 assert model.name == "noop" def test_concatenate_noop(): model = concatenate() assert len(model.layers) == 0 assert model.name == "noop" def test_noop(): data = numpy.asarray([1, 2, 3], dtype="f") model = noop(Linear(), Linear()) model.initialize(data, data) Y, backprop = model(data, is_train=True) assert numpy.array_equal(Y, data) dX = backprop(Y) assert numpy.array_equal(dX, data) def test_add(): data = numpy.asarray([[1, 2, 3, 4]], dtype="f") model = add(Linear(), Linear()) model.initialize(data, data) Y, backprop = model(data, is_train=True) Y2 = sum(layer.predict(data) for layer in model.layers) assert numpy.array_equal(Y, Y2) dX = backprop(Y) assert dX.shape == data.shape # Test that nesting works model2 = add(model, Linear()) assert len(model2.layers) == 3 model.initialize(data, data) Y = model2.predict(data) Y2 = sum(layer.predict(data) for layer in model2.layers) assert numpy.array_equal(Y, Y2) def test_add_edge_cases(): data = numpy.asarray([[1, 2, 3, 4]], dtype="f") with pytest.raises(TypeError): add() model = add(Linear(), Linear()) model._layers = [] Y, backprop = model(data, is_train=True) assert numpy.array_equal(data, Y) dX = backprop(Y) assert numpy.array_equal(dX, data) def test_concatenate(): data = numpy.asarray([[1, 2, 3], [4, 5, 6]], dtype="f") model = concatenate(Linear(), Linear()) model.initialize(data, data) Y, backprop = model(data, is_train=True) assert Y.shape[1] == sum([layer.predict(data).shape[1] for layer in model.layers]) dX = backprop(Y) assert dX.shape == data.shape def test_map_list(): nI = 4 nO = 9 Xs = [numpy.zeros((6, nI), dtype="f"), numpy.ones((3, nI), dtype="f")] Y_shapes = [(x.shape[0], nO) for x in Xs] model = map_list(Linear()) model.initialize(X=Xs, Y=[numpy.zeros(shape, dtype="f") for shape in Y_shapes]) Ys, backprop = model(Xs, is_train=True) assert isinstance(Ys, list) assert len(Ys) == len(Xs) layer = model.layers[0] for X, Y in zip(Xs, Ys): assert_allclose(layer.predict(X), Y) dXs = backprop(Ys) assert isinstance(dXs, list) assert len(dXs) == len(Xs) assert dXs[0].shape == Xs[0].shape assert dXs[1].shape == Xs[1].shape thinc-release-v9.1.1/thinc/tests/layers/test_feed_forward.py000066400000000000000000000125011467064331700242530ustar00rootroot00000000000000from functools import partial import numpy import pytest from numpy.testing import assert_allclose from thinc.api import Linear, NumpyOps, Relu, chain @pytest.fixture(params=[1, 2, 9]) def nB(request): return request.param @pytest.fixture(params=[1, 6]) def nI(request): return request.param @pytest.fixture(params=[1, 5, 3]) def nH(request): return request.param @pytest.fixture(params=[1, 2, 7, 9]) def nO(request): return request.param @pytest.fixture def model1(nH, nI): model = Relu(nH, nI).initialize() return model @pytest.fixture def model2(nO, nH): model = Linear(nO, nH).initialize() return model @pytest.fixture def input_data(nB, nI): return numpy.ones((nB, nI), dtype="f") + 1.0 @pytest.fixture def gradient_data(nB, nO): return numpy.zeros((nB, nO), dtype="f") - 1.0 @pytest.fixture def model(model1, model2): return chain(model1, model2).initialize() def get_expected_predict(input_data, Ws, bs): numpy_ops = NumpyOps() X = input_data for i, (W, b) in enumerate(zip(Ws, bs)): X = numpy_ops.asarray(X) if i > 0: X *= X > 0 X = numpy.tensordot(X, W, axes=[[1], [1]]) + b return X def numeric_gradient(predict, weights, epsilon=1e-4): out1 = predict(weights + epsilon) out2 = predict(weights - epsilon) return (out1 - out2) / (2 * epsilon) def test_models_have_shape(model1, model2, nI, nH, nO): assert model1.get_param("W").shape == (nH, nI) assert model1.get_param("b").shape == (nH,) assert model2.get_param("W").shape == (nO, nH) assert model2.get_param("b").shape == (nO,) def test_model_shape(model, model1, model2, nI, nH, nO): assert model.get_dim("nI") == model1.get_dim("nI") assert model.get_dim("nO") == model2.get_dim("nO") def test_infer_output_shape(): model = Relu(dropout=0.2) X = model.ops.alloc2f(4, 5) Y = model.ops.alloc2f(4, 2) assert model.has_dim("nI") is None assert model.has_dim("nO") is None model.initialize(X=X, Y=Y) assert model.get_dim("nI") == 5 assert model.get_dim("nO") == 2 def test_predict_and_begin_update_match(model, model1, model2, input_data): model = chain(model1, model2) via_predict = model.predict(input_data) via_update, _ = model.begin_update(input_data) assert_allclose(via_predict, via_update) expected = get_expected_predict( input_data, [model1.get_param("W"), model2.get_param("W")], [model1.get_param("b"), model2.get_param("b")], ) assert_allclose(via_update, expected, atol=1e-2, rtol=1e-4) def test_init_functions_are_called(): init_was_called = {} def register_init(name, model, X=None, Y=None): init_was_called[name] = True layer1 = Linear(5) layer2 = Linear(5) layer3 = Linear(5) layer1.init = partial(register_init, "one") layer2.init = partial(register_init, "two") layer3.init = partial(register_init, "three") # This is the nesting we'll get from operators. model = chain(layer1, chain(layer2, layer3)) assert not init_was_called model.initialize() assert init_was_called["one"] assert init_was_called["two"] assert init_was_called["three"] class GradientSpy(object): def __init__(self): self.weights = None self.d_weights = None def __call__(self, weights, grad): self.weights = weights self.d_weights = grad # I don't know how to get this working properly after the refactor. It's a numeric # gradient check. I suspect the test is the problem, not the code. @pytest.mark.skip # This is the actual definition -- it's just annoying to see tonnes of skips. # def test_gradient(model, input_data, nB, nH, nI, nO): def test_gradient(): truth = numpy.zeros((nB, nO), dtype="float32") truth[0] = 1.0 guess, backprop = model.begin_update(input_data) backprop(guess - truth) for layer in model.layers: for name in layer.param_names: agrad = layer.get_grad(name).ravel() # Should have grads for all params. predict = get_predict(layer, name, input_data) ngrad = get_numeric_gradient(predict, agrad.size, truth) assert_allclose(agrad, ngrad, atol=0.2, rtol=0.2) def get_predict(layer, param_name, inputs): """Helper for gradient check. To do the numeric gradient check, we have to be able to wiggle one value in a parameter, and check the prediction before and after. So we need to get a callback that gives an output given a change to one weight. """ def predict(i, epsilon): param = layer.get_param(param_name) shape = param.shape param = param.ravel() param[i] += epsilon layer.set_param(param_name, param.reshape(shape)) outputs = layer.predict(inputs) param[i] -= epsilon layer.set_param(param_name, param.reshape(shape)) return outputs.reshape(shape) return predict def get_numeric_gradient(predict, n, target): gradient = numpy.zeros(n) for i in range(n): out1 = predict(i, 1e-4) out2 = predict(i, -1e-4) err1 = _get_loss(out1, target) err2 = _get_loss(out2, target) gradient[i] = (err1 - err2) / (2 * 1e-4) print("NGrad", i, err1, err2) return gradient def _get_loss(truth, guess): return numpy.sum(numpy.sum(0.5 * numpy.square(truth - guess), 1)) thinc-release-v9.1.1/thinc/tests/layers/test_hash_embed.py000066400000000000000000000010251467064331700237020ustar00rootroot00000000000000import numpy from thinc.api import HashEmbed def test_init(): model = HashEmbed(64, 1000).initialize() assert model.get_dim("nV") == 1000 assert model.get_dim("nO") == 64 assert model.get_param("E").shape == (1000, 64) def test_seed_changes_bucket(): model1 = HashEmbed(64, 1000, seed=2).initialize() model2 = HashEmbed(64, 1000, seed=1).initialize() arr = numpy.ones((1,), dtype="uint64") vector1 = model1.predict(arr) vector2 = model2.predict(arr) assert vector1.sum() != vector2.sum() thinc-release-v9.1.1/thinc/tests/layers/test_layers_api.py000066400000000000000000000233661467064331700237670ustar00rootroot00000000000000from typing import List, Optional import numpy import pytest import srsly from numpy.testing import assert_almost_equal from thinc.api import Dropout, Model, NumpyOps, registry, with_padded from thinc.backends import NumpyOps from thinc.compat import has_torch from thinc.types import Array2d, Floats2d, FloatsXd, Padded, Ragged, Shape from thinc.util import data_validation, get_width OPS = NumpyOps() class NoDropoutOps(NumpyOps): def get_dropout_mask(self, shape: Shape, drop: Optional[float]) -> FloatsXd: if drop is None or drop <= 0: return self.xp.ones(shape, dtype="f") else: raise ValueError("During prediction, dropout should not be applied") array1d = OPS.xp.asarray([1, 2, 3], dtype="f") array1dint = OPS.xp.asarray([1, 2, 3], dtype="i") array2d = OPS.xp.asarray([[4, 2, 3, 4], [1, 5, 3, 1], [9, 8, 5, 7]], dtype="f") array2dint = OPS.xp.asarray([[1, 2, 3], [4, 5, 6]], dtype="i") array3d = OPS.xp.zeros((3, 3, 3), dtype="f") ragged = Ragged(array2d, OPS.xp.asarray([2, 1], dtype="i")) padded = Padded( array3d, array1d, OPS.asarray1i([1, 2, 3, 4]), OPS.asarray1i([1, 2, 3, 4]) ) width = array2d.shape[1] vectors = numpy.zeros((array2dint.max(), 1), dtype="f") def assert_data_match(Y, out_data): assert type(Y) == type(out_data) if isinstance(out_data, OPS.xp.ndarray): assert isinstance(Y, OPS.xp.ndarray) assert out_data.ndim == Y.ndim elif isinstance(out_data, Ragged): assert isinstance(Y, Ragged) assert out_data.data.ndim == Y.data.ndim assert out_data.lengths.ndim == Y.lengths.ndim elif isinstance(out_data, Padded): assert isinstance(Y, Padded) assert out_data.data.ndim == Y.data.ndim assert out_data.size_at_t.ndim == Y.size_at_t.ndim assert len(out_data.lengths) == len(Y.lengths) assert len(out_data.indices) == len(Y.indices) elif isinstance(out_data, (list, tuple)): assert isinstance(Y, (list, tuple)) assert all(isinstance(x, numpy.ndarray) for x in Y) else: pytest.fail(f"wrong output of {type(Y)}: {Y}") TEST_CASES_SUMMABLE = [ # Array to array ("Dish.v1", {}, array2d, array2d), ("Dish.v1", {"nO": 4, "nI": 4}, array2d, array2d), ("Dropout.v1", {}, array2d, array2d), ("LayerNorm.v1", {}, array2d, array2d), ("Linear.v1", {}, array2d, array2d), ("Logistic.v1", {}, array2d, array2d), ("Maxout.v1", {}, array2d, array2d), ("Maxout.v1", {"normalize": True, "dropout": 0.2}, array2d, array2d), ("Maxout.v1", {"nO": 4, "nI": 4}, array2d, array2d), ("Mish.v1", {}, array2d, array2d), ("Mish.v1", {"nO": 4, "nI": 4}, array2d, array2d), ("Mish.v1", {"normalize": True, "dropout": 0.2}, array2d, array2d), ("Relu.v1", {}, array2d, array2d), ("Relu.v1", {"normalize": True, "dropout": 0.2}, array2d, array2d), ("Sigmoid.v1", {}, array2d, array2d), ("Sigmoid.v1", {"nO": 4, "nI": 4}, array2d, array2d), ("ClippedLinear.v1", {}, array2d, array2d), ("ClippedLinear.v1", {"nO": 4, "nI": 4}, array2d, array2d), ("ReluK.v1", {}, array2d, array2d), ("ReluK.v1", {"nO": 4, "nI": 4}, array2d, array2d), ("HardSigmoid.v1", {}, array2d, array2d), ("HardSigmoid.v1", {"nO": 4, "nI": 4}, array2d, array2d), ("HardTanh.v1", {}, array2d, array2d), ("HardTanh.v1", {"nO": 4, "nI": 4}, array2d, array2d), ("HardSwish.v1", {}, array2d, array2d), ("HardSwish.v1", {"nO": 4, "nI": 4}, array2d, array2d), ("HardSwishMobilenet.v1", {}, array2d, array2d), ("HardSwishMobilenet.v1", {"nO": 4, "nI": 4}, array2d, array2d), ("Swish.v1", {}, array2d, array2d), ("Swish.v1", {"nO": 4, "nI": 4}, array2d, array2d), ("Gelu.v1", {}, array2d, array2d), ("Gelu.v1", {"nO": 4, "nI": 4}, array2d, array2d), ("sigmoid_activation.v1", {}, array2d, array2d), ("softmax_activation.v1", {}, array2d, array2d), ("Softmax.v1", {}, array2d, array2d), ("Softmax.v1", {"nO": 4, "nI": 4}, array2d, array2d), ("Softmax.v2", {}, array2d, array2d), ("Softmax.v2", {"nO": 4, "nI": 4}, array2d, array2d), # fmt: off # List to list ("LSTM.v1", {"bi": False}, [array2d, array2d], [array2d, array2d]), pytest.param("PyTorchLSTM.v1", {"bi": False, "nO": width, "nI": width}, [array2d, array2d], [array2d, array2d], marks=pytest.mark.skipif(not has_torch, reason="needs PyTorch")), # fmt: on ] TEST_CASES = [ *TEST_CASES_SUMMABLE, pytest.param( "PyTorchLSTM.v1", {"bi": True, "nO": width * 2, "nI": width}, [array2d, array2d], [array2d, array2d], marks=pytest.mark.skipif(not has_torch, reason="needs PyTorch"), ), ("LSTM.v1", {"bi": True}, [array2d, array2d], [array2d, array2d]), # Ragged to array ("reduce_max.v1", {}, ragged, array2d), ("reduce_mean.v1", {}, ragged, array2d), ("reduce_sum.v1", {}, ragged, array2d), # fmt: off # Other ("expand_window.v1", {}, array2d, array2d), ("expand_window.v1", {}, ragged, ragged), ("Embed.v1", {"nO": 4, "nV": int(array2dint.max() + 1), "column": 0, "dropout": 0.2}, array2dint, array2d), ("Embed.v1", {"nO": 4, "nV": int(array1dint.max() + 1)}, array1dint, array2d), ("HashEmbed.v1", {"nO": 1, "nV": int(array2dint.max()), "column": 0, "dropout": 0.2}, array2dint, array2d), ("HashEmbed.v1", {"nO": 1, "nV": 2}, array1dint, array2d), ("MultiSoftmax.v1", {"nOs": (1, 3)}, array2d, array2d), # ("CauchySimilarity.v1", {}, (array2d, array2d), array1d), ("ParametricAttention.v1", {}, ragged, ragged), ("ParametricAttention.v2", {}, ragged, ragged), ("ParametricAttention.v2", {"key_transform": {"@layers": "Gelu.v1"}}, ragged, ragged), ("SparseLinear.v1", {}, (numpy.asarray([1, 2, 3], dtype="uint64"), array1d, numpy.asarray([1, 1], dtype="i")), array2d), ("SparseLinear.v2", {}, (numpy.asarray([1, 2, 3], dtype="uint64"), array1d, numpy.asarray([1, 1], dtype="i")), array2d), ("remap_ids.v1", {"dtype": "f"}, ["a", 1, 5.0], array2dint), ("remap_ids.v2", {"mapping_table": {}, "column": 1}, numpy.array([[1, 2, 3], [4, 5, 6]]).T, array2dint), ("premap_ids.v1", {"mapping_table": {}, "column": 1}, numpy.array([[1, 2, 3], [4, 5, 6]]).T, array2dint), # fmt: on ] @pytest.mark.parametrize("name,kwargs,in_data,out_data", TEST_CASES) def test_layers_from_config(name, kwargs, in_data, out_data): cfg = {"@layers": name, **kwargs} filled_cfg = registry.fill({"config": cfg}) assert srsly.is_json_serializable(filled_cfg) model = registry.resolve({"config": cfg})["config"] if "LSTM" in name: model = with_padded(model) valid = True with data_validation(valid): model.initialize(in_data, out_data) Y, backprop = model(in_data, is_train=True) if model.has_dim("nO"): assert get_width(Y) == model.get_dim("nO") assert_data_match(Y, out_data) dX = backprop(Y) assert_data_match(dX, in_data) # Test that during predictions, no dropout is applied model._to_ops(NoDropoutOps()) model.predict(in_data) @pytest.mark.parametrize("name,kwargs,in_data,out_data", TEST_CASES_SUMMABLE) def test_layers_with_residual(name, kwargs, in_data, out_data): cfg = {"@layers": "residual.v1", "layer": {"@layers": name, **kwargs}} model = registry.resolve({"config": cfg})["config"] if "LSTM" in name: model = with_padded(model) model.initialize(in_data, out_data) Y, backprop = model(in_data, is_train=True) assert_data_match(Y, out_data) dX = backprop(Y) assert_data_match(dX, in_data) @pytest.mark.parametrize("data", [array2d, ragged, padded, [array2d, array2d]]) def test_dropout(data): model = Dropout(0.2) model.initialize(data, data) Y, backprop = model(data, is_train=False) assert_data_match(Y, data) dX = backprop(Y) assert_data_match(dX, data) @pytest.mark.parametrize("name,kwargs,in_data,out_data", TEST_CASES) def test_layers_batching_all(name, kwargs, in_data, out_data): cfg = {"@layers": name, **kwargs} model = registry.resolve({"config": cfg})["config"] if "expand_window" in name: return if "LSTM" in name: model = with_padded(model) util_batch_unbatch_list(model, in_data, out_data) else: if isinstance(in_data, OPS.xp.ndarray) and in_data.ndim == 2: if isinstance(out_data, OPS.xp.ndarray) and out_data.ndim == 2: util_batch_unbatch_array(model, in_data, out_data) if isinstance(in_data, Ragged): if isinstance(out_data, OPS.xp.ndarray) and out_data.ndim == 2: util_batch_unbatch_ragged(model, in_data, out_data) def util_batch_unbatch_array( model: Model[Floats2d, Array2d], in_data: Floats2d, out_data: Array2d ): unbatched = [model.ops.reshape2f(a, 1, -1) for a in in_data] with data_validation(True): model.initialize(in_data, out_data) Y_batched = model.predict(in_data).tolist() Y_not_batched = [model.predict(u)[0].tolist() for u in unbatched] assert_almost_equal(Y_batched, Y_not_batched, decimal=4) def util_batch_unbatch_list( model: Model[List[Array2d], List[Array2d]], in_data: List[Array2d], out_data: List[Array2d], ): with data_validation(True): model.initialize(in_data, out_data) Y_batched = model.predict(in_data) Y_not_batched = [model.predict([u])[0] for u in in_data] assert_almost_equal(Y_batched, Y_not_batched, decimal=4) # type: ignore def util_batch_unbatch_ragged( model: Model[Ragged, Array2d], in_data: Ragged, out_data: Array2d ): with data_validation(True): model.initialize(in_data, out_data) Y_batched = model.predict(in_data) Y_not_batched = [model.predict(in_data[i])[0] for i in range(len(in_data))] assert_almost_equal(Y_batched, Y_not_batched, decimal=4) # type: ignore thinc-release-v9.1.1/thinc/tests/layers/test_linear.py000066400000000000000000000162561467064331700231110ustar00rootroot00000000000000import numpy import pytest from hypothesis import given, settings from mock import MagicMock from numpy.testing import assert_allclose from thinc.api import SGD, Dropout, Linear, chain from ..strategies import arrays_OI_O_BI from ..util import get_model, get_shape @pytest.fixture def model(): model = Linear() return model def test_linear_default_name(model): assert model.name == "linear" def test_linear_dimensions_on_data(): X = MagicMock(shape=(5, 10), spec=numpy.ndarray) X.ndim = 2 X.dtype = "float32" y = MagicMock(shape=(8,), spec=numpy.ndarray) y.ndim = 2 y.dtype = "float32" y.max = MagicMock() model = Linear() model.initialize(X, y) assert model.get_dim("nI") is not None y.max.assert_called_with() @given(arrays_OI_O_BI(max_batch=8, max_out=8, max_in=8)) def test_begin_update_matches_predict(W_b_input): model = get_model(W_b_input) nr_batch, nr_out, nr_in = get_shape(W_b_input) W, b, input_ = W_b_input fwd_via_begin_update, finish_update = model.begin_update(input_) fwd_via_predict_batch = model.predict(input_) assert_allclose(fwd_via_begin_update, fwd_via_predict_batch) @given(arrays_OI_O_BI(max_batch=8, max_out=8, max_in=8)) def test_finish_update_calls_optimizer_with_weights(W_b_input): model = get_model(W_b_input) nr_batch, nr_out, nr_in = get_shape(W_b_input) W, b, input_ = W_b_input output, finish_update = model.begin_update(input_) seen_keys = set() def sgd(key, data, gradient, **kwargs): seen_keys.add(key) assert data.shape == gradient.shape return data, gradient grad_BO = numpy.ones((nr_batch, nr_out), dtype="f") grad_BI = finish_update(grad_BO) # noqa: F841 model.finish_update(sgd) for name in model.param_names: assert (model.id, name) in seen_keys @settings(max_examples=100) @given(arrays_OI_O_BI(max_batch=8, max_out=8, max_in=8)) def test_predict_small(W_b_input): W, b, input_ = W_b_input nr_out, nr_in = W.shape model = Linear(nr_out, nr_in) model.set_param("W", W) model.set_param("b", b) einsummed = numpy.einsum( "oi,bi->bo", numpy.asarray(W, dtype="float64"), numpy.asarray(input_, dtype="float64"), optimize=False, ) expected_output = einsummed + b predicted_output = model.predict(input_) assert_allclose(predicted_output, expected_output, rtol=0.01, atol=0.01) @given(arrays_OI_O_BI(max_batch=20, max_out=30, max_in=30)) @settings(deadline=None) def test_predict_extensive(W_b_input): W, b, input_ = W_b_input nr_out, nr_in = W.shape model = Linear(nr_out, nr_in) model.set_param("W", W) model.set_param("b", b) einsummed = numpy.einsum( "bi,oi->bo", numpy.asarray(input_, dtype="float32"), numpy.asarray(W, dtype="float32"), optimize=False, ) expected_output = einsummed + b predicted_output = model.predict(input_) assert_allclose(predicted_output, expected_output, rtol=1e-04, atol=0.0001) @given(arrays_OI_O_BI(max_batch=8, max_out=8, max_in=8)) def test_dropout_gives_zero_activations(W_b_input): model = chain(get_model(W_b_input), Dropout(1.0)) nr_batch, nr_out, nr_in = get_shape(W_b_input) W, b, input_ = W_b_input fwd_dropped, _ = model.begin_update(input_) assert all(val == 0.0 for val in fwd_dropped.flatten()) @given(arrays_OI_O_BI(max_batch=8, max_out=8, max_in=8)) def test_dropout_gives_zero_gradients(W_b_input): model = chain(get_model(W_b_input), Dropout(1.0)) nr_batch, nr_out, nr_in = get_shape(W_b_input) W, b, input_ = W_b_input for node in model.walk(): if node.name == "dropout": node.attrs["dropout_rate"] = 1.0 fwd_dropped, finish_update = model.begin_update(input_) grad_BO = numpy.ones((nr_batch, nr_out), dtype="f") grad_BI = finish_update(grad_BO) assert all(val == 0.0 for val in grad_BI.flatten()) @pytest.fixture def model2(): model = Linear(2, 2).initialize() return model def test_init(model2): assert model2.get_dim("nO") == 2 assert model2.get_dim("nI") == 2 assert model2.get_param("W") is not None assert model2.get_param("b") is not None def test_predict_bias(model2): input_ = model2.ops.alloc2f(1, model2.get_dim("nI")) target_scores = model2.ops.alloc2f(1, model2.get_dim("nI")) scores = model2.predict(input_) assert_allclose(scores[0], target_scores[0]) # Set bias for class 0 model2.get_param("b")[0] = 2.0 target_scores[0, 0] = 2.0 scores = model2.predict(input_) assert_allclose(scores, target_scores) # Set bias for class 1 model2.get_param("b")[1] = 5.0 target_scores[0, 1] = 5.0 scores = model2.predict(input_) assert_allclose(scores, target_scores) @pytest.mark.parametrize( "X,expected", [ (numpy.asarray([0.0, 0.0], dtype="f"), [0.0, 0.0]), (numpy.asarray([1.0, 0.0], dtype="f"), [1.0, 0.0]), (numpy.asarray([0.0, 1.0], dtype="f"), [0.0, 1.0]), (numpy.asarray([1.0, 1.0], dtype="f"), [1.0, 1.0]), ], ) def test_predict_weights(X, expected): W = numpy.asarray([1.0, 0.0, 0.0, 1.0], dtype="f").reshape((2, 2)) bias = numpy.asarray([0.0, 0.0], dtype="f") model = Linear(W.shape[0], W.shape[1]) model.set_param("W", W) model.set_param("b", bias) scores = model.predict(X.reshape((1, -1))) assert_allclose(scores.ravel(), expected) def test_update(): W = numpy.asarray([1.0, 0.0, 0.0, 1.0], dtype="f").reshape((2, 2)) bias = numpy.asarray([0.0, 0.0], dtype="f") model = Linear(2, 2) model.set_param("W", W) model.set_param("b", bias) sgd = SGD(1.0, L2=0.0, grad_clip=0.0) sgd.averages = None ff = numpy.asarray([[0.0, 0.0]], dtype="f") tf = numpy.asarray([[1.0, 0.0]], dtype="f") ft = numpy.asarray([[0.0, 1.0]], dtype="f") # noqa: F841 tt = numpy.asarray([[1.0, 1.0]], dtype="f") # noqa: F841 # ff, i.e. 0, 0 scores, backprop = model.begin_update(ff) assert_allclose(scores[0, 0], scores[0, 1]) # Tell it the answer was 'f' gradient = numpy.asarray([[-1.0, 0.0]], dtype="f") backprop(gradient) for key, (param, d_param) in model.get_gradients().items(): param, d_param = sgd(key, param, d_param) model.set_param(key[1], param) model.set_grad(key[1], d_param) b = model.get_param("b") W = model.get_param("W") assert b[0] == 1.0 assert b[1] == 0.0 # Unchanged -- input was zeros, so can't get gradient for weights. assert W[0, 0] == 1.0 assert W[0, 1] == 0.0 assert W[1, 0] == 0.0 assert W[1, 1] == 1.0 # tf, i.e. 1, 0 scores, finish_update = model.begin_update(tf) # Tell it the answer was 'T' gradient = numpy.asarray([[0.0, -1.0]], dtype="f") finish_update(gradient) for key, (W, dW) in model.get_gradients().items(): sgd(key, W, dW) b = model.get_param("b") W = model.get_param("W") assert b[0] == 1.0 assert b[1] == 1.0 # Gradient for weights should have been outer(gradient, input) # so outer([0, -1.], [1., 0.]) # = [[0., 0.], [-1., 0.]] assert W[0, 0] == 1.0 - 0.0 assert W[0, 1] == 0.0 - 0.0 assert W[1, 0] == 0.0 - -1.0 assert W[1, 1] == 1.0 - 0.0 thinc-release-v9.1.1/thinc/tests/layers/test_lstm.py000066400000000000000000000130221467064331700226020ustar00rootroot00000000000000import timeit import numpy import pytest from thinc.api import LSTM, NumpyOps, Ops, PyTorchLSTM, fix_random_seed, with_padded from thinc.compat import has_torch @pytest.fixture(params=[1, 6]) def nI(request): return request.param @pytest.fixture(params=[1, 2, 7, 9]) def nO(request): return request.param def test_list2padded(): ops = NumpyOps() seqs = [numpy.zeros((5, 4)), numpy.zeros((8, 4)), numpy.zeros((2, 4))] padded = ops.list2padded(seqs) arr = padded.data size_at_t = padded.size_at_t assert arr.shape == (8, 3, 4) assert size_at_t[0] == 3 assert size_at_t[1] == 3 assert size_at_t[2] == 2 assert size_at_t[3] == 2 assert size_at_t[4] == 2 assert size_at_t[5] == 1 assert size_at_t[6] == 1 assert size_at_t[7] == 1 unpadded = ops.padded2list(padded) assert unpadded[0].shape == (5, 4) assert unpadded[1].shape == (8, 4) assert unpadded[2].shape == (2, 4) @pytest.mark.parametrize("ops", [Ops(), NumpyOps()]) @pytest.mark.parametrize("nO,nI", [(1, 2), (2, 2), (100, 200), (9, 6)]) def test_LSTM_init_with_sizes(ops, nO, nI): model = with_padded(LSTM(nO, nI, depth=1)).initialize() for node in model.walk(): model.ops = ops # Check no unallocated params. assert node.has_param("LSTM") is not None assert node.has_param("HC0") is not None for node in model.walk(): # Check param sizes. if node.has_param("LSTM"): params = node.get_param("LSTM") assert params.shape == ( ((nO * 4 * nI)) + (nO * 4) + (nO * 4 * nO + nO * 4), ) if node.has_param("HC0"): params = node.get_param("HC0") assert params.shape == (2, 1, 1, nO) @pytest.mark.parametrize("ops", [Ops(), NumpyOps()]) def test_LSTM_fwd_bwd_shapes_simple(ops, nO, nI): nO = 1 nI = 2 X = numpy.asarray([[0.1, 0.1], [-0.1, -0.1], [1.0, 1.0]], dtype="f") model = with_padded(LSTM(nO, nI)).initialize(X=[X]) for node in model.walk(): node.ops = ops ys, backprop_ys = model([X], is_train=True) dXs = backprop_ys(ys) assert numpy.vstack(dXs).shape == numpy.vstack([X]).shape @pytest.mark.parametrize("ops", [Ops(), NumpyOps()]) @pytest.mark.parametrize( "nO,nI,depth,bi,lengths", [ (1, 1, 1, False, [1]), (12, 32, 1, False, [3, 1]), (2, 2, 1, True, [2, 5, 7]), (2, 2, 2, False, [7, 2, 4]), (2, 2, 2, True, [1]), (32, 16, 1, True, [5, 1, 10, 2]), (32, 16, 2, True, [3, 3, 5]), (32, 16, 3, True, [9, 2, 4]), ], ) def test_BiLSTM_fwd_bwd_shapes(ops, nO, nI, depth, bi, lengths): Xs = [numpy.ones((length, nI), dtype="f") for length in lengths] model = with_padded(LSTM(nO, nI, depth=depth, bi=bi)).initialize(X=Xs) for node in model.walk(): node.ops = ops ys, backprop_ys = model(Xs, is_train=True) dXs = backprop_ys(ys) assert numpy.vstack(dXs).shape == numpy.vstack(Xs).shape def test_LSTM_learns(): fix_random_seed(0) nO = 2 nI = 2 def sgd(key, weights, gradient): weights -= 0.001 * gradient return weights, gradient * 0 model = with_padded(LSTM(nO, nI)) X = [[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]] Y = [[0.2, 0.2], [0.3, 0.3], [0.4, 0.4]] X = [model.ops.asarray(x, dtype="f").reshape((1, -1)) for x in X] Y = [model.ops.asarray(y, dtype="f").reshape((1, -1)) for y in Y] model = model.initialize(X, Y) Yhs, bp_Yhs = model.begin_update(X) loss1 = sum([((yh - y) ** 2).sum() for yh, y in zip(Yhs, Y)]) Yhs, bp_Yhs = model.begin_update(X) dYhs = [yh - y for yh, y in zip(Yhs, Y)] dXs = bp_Yhs(dYhs) model.finish_update(sgd) Yhs, bp_Yhs = model.begin_update(X) dYhs = [yh - y for yh, y in zip(Yhs, Y)] dXs = bp_Yhs(dYhs) # noqa: F841 loss2 = sum([((yh - y) ** 2).sum() for yh, y in zip(Yhs, Y)]) assert loss1 > loss2, (loss1, loss2) @pytest.mark.skip def test_benchmark_LSTM_fwd(): nO = 128 nI = 128 n_batch = 1000 batch_size = 30 seq_len = 30 lengths = numpy.random.normal(scale=10, loc=30, size=n_batch * batch_size) lengths = numpy.maximum(lengths, 1) batches = [] uniform_lengths = False model = with_padded(LSTM(nO, nI)).initialize() for batch_lengths in model.ops.minibatch(batch_size, lengths): batch_lengths = list(batch_lengths) if uniform_lengths: seq_len = max(batch_lengths) batch = [ numpy.asarray( numpy.random.uniform(0.0, 1.0, (int(seq_len), nI)), dtype="f" ) for _ in batch_lengths ] else: batch = [ numpy.asarray( numpy.random.uniform(0.0, 1.0, (int(seq_len), nI)), dtype="f" ) for seq_len in batch_lengths ] batches.append(batch) start = timeit.default_timer() for Xs in batches: ys, bp_ys = model.begin_update(list(Xs)) # _ = bp_ys(ys) end = timeit.default_timer() n_samples = n_batch * batch_size print( "--- %i samples in %s seconds (%f samples/s, %.7f s/sample) ---" % (n_samples, end - start, n_samples / (end - start), (end - start) / n_samples) ) def test_lstm_init(): model = with_padded(LSTM(2, 2, bi=True)).initialize() model.initialize() @pytest.mark.skipif(not has_torch, reason="needs PyTorch") def test_pytorch_lstm_init(): model = with_padded(PyTorchLSTM(2, 2, depth=0)).initialize() assert model.name == "with_padded(noop)" thinc-release-v9.1.1/thinc/tests/layers/test_mappers.py000066400000000000000000000031621467064331700232760ustar00rootroot00000000000000import numpy import pytest from thinc.layers import premap_ids, remap_ids, remap_ids_v2 @pytest.fixture def keys(): return numpy.array([4, 2, 6, 1, 8, 7, 9, 3, 30]) @pytest.fixture def mapper(keys): return {int(k): int(v) for v, k in enumerate(keys)} def test_premap(keys, mapper): premap = premap_ids(mapper, default=99) values, _ = premap(keys, False) numpy.testing.assert_equal(values.squeeze(), numpy.asarray(range(len(keys)))) def test_remap(keys, mapper): remap = remap_ids(mapper, default=99) values, _ = remap(keys, False) numpy.testing.assert_equal(values.squeeze(), numpy.asarray(range(len(keys)))) def test_remap_v2(keys, mapper): remap = remap_ids_v2(mapper, default=99) values, _ = remap(keys, False) numpy.testing.assert_equal(values.squeeze(), numpy.asarray(range(len(keys)))) def test_remap_premap_eq(keys, mapper): remap = remap_ids(mapper, default=99) remap_v2 = remap_ids_v2(mapper, default=99) premap = premap_ids(mapper, default=99) values1, _ = remap(keys, False) values2, _ = remap_v2(keys, False) values3, _ = premap(keys, False) numpy.testing.assert_equal(values1, values2) numpy.testing.assert_equal(values2, values3) def test_column(keys, mapper): idx = numpy.zeros((len(keys), 4), dtype="int") idx[:, 3] = keys remap_v2 = remap_ids_v2(mapper, column=3) premap = premap_ids(mapper, column=3) numpy.testing.assert_equal( remap_v2(idx, False)[0].squeeze(), numpy.asarray(range(len(keys))) ) numpy.testing.assert_equal( premap(idx, False)[0].squeeze(), numpy.asarray(range(len(keys))) ) thinc-release-v9.1.1/thinc/tests/layers/test_mnist.py000066400000000000000000000071251467064331700227640ustar00rootroot00000000000000import pytest from thinc.api import ( Adam, PyTorchWrapper, Relu, Softmax, TensorFlowWrapper, chain, clone, get_current_ops, ) from thinc.compat import has_tensorflow, has_torch @pytest.fixture(scope="module") def mnist(limit=5000): pytest.importorskip("ml_datasets") import ml_datasets (train_X, train_Y), (dev_X, dev_Y) = ml_datasets.mnist() return (train_X[:limit], train_Y[:limit]), (dev_X[:limit], dev_Y[:limit]) def create_relu_softmax(width, dropout, nI, nO): return chain(clone(Relu(nO=width, dropout=dropout), 2), Softmax(10, width)) def create_wrapped_pytorch(width, dropout, nI, nO): import torch import torch.nn import torch.nn.functional as F class PyTorchModel(torch.nn.Module): def __init__(self, width, nO, nI, dropout): super(PyTorchModel, self).__init__() self.dropout1 = torch.nn.Dropout2d(dropout) self.dropout2 = torch.nn.Dropout2d(dropout) self.fc1 = torch.nn.Linear(nI, width) self.fc2 = torch.nn.Linear(width, nO) def forward(self, x): x = F.relu(x) x = self.dropout1(x) x = self.fc1(x) x = F.relu(x) x = self.dropout2(x) x = self.fc2(x) output = F.log_softmax(x, dim=1) return output return PyTorchWrapper(PyTorchModel(width, nO, nI, dropout)) def create_wrapped_tensorflow(width, dropout, nI, nO): from tensorflow.keras.layers import Dense, Dropout from tensorflow.keras.models import Sequential tf_model = Sequential() tf_model.add(Dense(width, activation="relu", input_shape=(nI,))) tf_model.add(Dropout(dropout)) tf_model.add(Dense(width, activation="relu")) tf_model.add(Dropout(dropout)) tf_model.add(Dense(nO, activation=None)) return TensorFlowWrapper(tf_model) @pytest.fixture( # fmt: off params=[ create_relu_softmax, pytest.param(create_wrapped_pytorch, marks=pytest.mark.skipif(not has_torch, reason="needs PyTorch")), pytest.param(create_wrapped_tensorflow, marks=pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow")) ] # fmt: on ) def create_model(request): return request.param @pytest.mark.slow @pytest.mark.parametrize(("width", "nb_epoch", "min_score"), [(32, 20, 0.8)]) def test_small_end_to_end(width, nb_epoch, min_score, create_model, mnist): batch_size = 128 dropout = 0.2 (train_X, train_Y), (dev_X, dev_Y) = mnist model = create_model(width, dropout, nI=train_X.shape[1], nO=train_Y.shape[1]) model.initialize(X=train_X[:5], Y=train_Y[:5]) optimizer = Adam(0.001) losses = [] scores = [] ops = get_current_ops() for i in range(nb_epoch): for X, Y in model.ops.multibatch(batch_size, train_X, train_Y, shuffle=True): Yh, backprop = model.begin_update(X) # Ensure that the tensor is type-compatible with the current backend. Yh = ops.asarray(Yh) backprop(Yh - Y) model.finish_update(optimizer) losses.append(((Yh - Y) ** 2).sum()) correct = 0 total = 0 for X, Y in model.ops.multibatch(batch_size, dev_X, dev_Y): Yh = model.predict(X) Yh = ops.asarray(Yh) correct += (Yh.argmax(axis=1) == Y.argmax(axis=1)).sum() total += Yh.shape[0] score = correct / total scores.append(score) assert losses[-1] < losses[0], losses if scores[0] < 1.0: assert scores[-1] > scores[0], scores assert any([score > min_score for score in scores]), scores thinc-release-v9.1.1/thinc/tests/layers/test_mxnet_wrapper.py000066400000000000000000000142241467064331700245230ustar00rootroot00000000000000from typing import cast import numpy import pytest from thinc.api import ( Adam, ArgsKwargs, Model, MXNetWrapper, Ops, get_current_ops, mxnet2xp, xp2mxnet, ) from thinc.compat import has_cupy_gpu, has_mxnet from thinc.types import Array1d, Array2d, IntsXd from thinc.util import to_categorical from ..util import check_input_converters, make_tempdir @pytest.fixture def n_hidden() -> int: return 12 @pytest.fixture def input_size() -> int: return 784 @pytest.fixture def n_classes() -> int: return 10 @pytest.fixture def answer() -> int: return 1 @pytest.fixture def X(input_size: int) -> Array2d: ops: Ops = get_current_ops() return cast(Array2d, ops.alloc(shape=(1, input_size))) @pytest.fixture def Y(answer: int, n_classes: int) -> Array2d: ops: Ops = get_current_ops() return cast( Array2d, to_categorical(cast(IntsXd, ops.asarray([answer])), n_classes=n_classes), ) @pytest.fixture def mx_model(n_hidden: int, input_size: int, X: Array2d): import mxnet as mx mx_model = mx.gluon.nn.Sequential() mx_model.add( mx.gluon.nn.Dense(n_hidden), mx.gluon.nn.LayerNorm(), mx.gluon.nn.Dense(n_hidden, activation="relu"), mx.gluon.nn.LayerNorm(), mx.gluon.nn.Dense(10, activation="softrelu"), ) mx_model.initialize() return mx_model @pytest.fixture def model(mx_model) -> Model[Array2d, Array2d]: return MXNetWrapper(mx_model) @pytest.mark.skipif(not has_mxnet, reason="needs MXNet") def test_mxnet_wrapper_roundtrip_conversion(): import mxnet as mx xp_tensor = numpy.zeros((2, 3), dtype="f") mx_tensor = xp2mxnet(xp_tensor) assert isinstance(mx_tensor, mx.nd.NDArray) new_xp_tensor = mxnet2xp(mx_tensor) assert numpy.array_equal(xp_tensor, new_xp_tensor) @pytest.mark.skipif(not has_mxnet, reason="needs MXNet") def test_mxnet_wrapper_gluon_sequential(): import mxnet as mx mx_model = mx.gluon.nn.Sequential() mx_model.add(mx.gluon.nn.Dense(12)) wrapped = MXNetWrapper(mx_model) assert isinstance(wrapped, Model) @pytest.mark.skipif(not has_mxnet, reason="needs MXNet") def test_mxnet_wrapper_built_model( model: Model[Array2d, Array2d], X: Array2d, Y: Array1d ): # built models are validated more and can perform useful operations: assert model.predict(X) is not None # They can de/serialized assert model.from_bytes(model.to_bytes()) is not None @pytest.mark.skipif(not has_mxnet, reason="needs MXNet") def test_mxnet_wrapper_predict(model: Model[Array2d, Array2d], X: Array2d): model.predict(X) @pytest.mark.skipif(not has_mxnet, reason="needs MXNet") def test_mxnet_wrapper_train_overfits( model: Model[Array2d, Array2d], X: Array2d, Y: Array1d, answer: int ): optimizer = Adam() for i in range(100): guesses, backprop = model(X, is_train=True) d_guesses = (guesses - Y) / guesses.shape[0] backprop(d_guesses) model.finish_update(optimizer) predicted = model.predict(X).argmax() assert predicted == answer @pytest.mark.skipif(not has_mxnet, reason="needs MXNet") def test_mxnet_wrapper_can_copy_model(model: Model[Array2d, Array2d], X: Array2d): model.predict(X) copy: Model[Array2d, Array2d] = model.copy() assert copy is not None @pytest.mark.skipif(not has_mxnet, reason="needs MXNet") def test_mxnet_wrapper_to_bytes(model: Model[Array2d, Array2d], X: Array2d): model.predict(X) # And can be serialized model_bytes = model.to_bytes() assert model_bytes is not None model.from_bytes(model_bytes) @pytest.mark.skipif(not has_mxnet, reason="needs MXNet") def test_mxnet_wrapper_to_from_disk(model: Model[Array2d, Array2d], X: Array2d): model.predict(X) with make_tempdir() as tmp_path: model_file = tmp_path / "model.bytes" model.to_disk(model_file) another_model = model.from_disk(model_file) assert another_model is not None @pytest.mark.skipif(not has_mxnet, reason="needs MXNet") def test_mxnet_wrapper_from_bytes(model: Model[Array2d, Array2d], X: Array2d): model.predict(X) model_bytes = model.to_bytes() another_model = model.from_bytes(model_bytes) assert another_model is not None @pytest.mark.skipif(not has_mxnet, reason="needs MXNet") def test_mxnet_wrapper_to_cpu(mx_model, X: Array2d): model = MXNetWrapper(mx_model) model.predict(X) model.to_cpu() @pytest.mark.skipif(not has_mxnet, reason="needs MXNet") @pytest.mark.skipif(not has_cupy_gpu, reason="needs GPU/cupy") def test_mxnet_wrapper_to_gpu(model: Model[Array2d, Array2d], X: Array2d): model.predict(X) model.to_gpu(0) @pytest.mark.skipif(not has_mxnet, reason="needs MXNet") @pytest.mark.parametrize( "data,n_args,kwargs_keys", [ # fmt: off (numpy.zeros((2, 3), dtype="f"), 1, []), ([numpy.zeros((2, 3), dtype="f"), numpy.zeros((2, 3), dtype="f")], 2, []), ((numpy.zeros((2, 3), dtype="f"), numpy.zeros((2, 3), dtype="f")), 2, []), ({"a": numpy.zeros((2, 3), dtype="f"), "b": numpy.zeros((2, 3), dtype="f")}, 0, ["a", "b"]), (ArgsKwargs((numpy.zeros((2, 3), dtype="f"), numpy.zeros((2, 3), dtype="f")), {"c": numpy.zeros((2, 3), dtype="f")}), 2, ["c"]), # fmt: on ], ) def test_mxnet_wrapper_convert_inputs(data, n_args, kwargs_keys): import mxnet as mx mx_model = mx.gluon.nn.Sequential() mx_model.add(mx.gluon.nn.Dense(12)) mx_model.initialize() model = MXNetWrapper(mx_model) convert_inputs = model.attrs["convert_inputs"] Y, backprop = convert_inputs(model, data, is_train=True) check_input_converters(Y, backprop, data, n_args, kwargs_keys, mx.nd.NDArray) @pytest.mark.skipif(not has_mxnet, reason="needs MXNet") def test_mxnet_wrapper_thinc_model_subclass(mx_model): class CustomModel(Model): def fn(self) -> int: return 1337 model = MXNetWrapper(mx_model, model_class=CustomModel) assert isinstance(model, CustomModel) assert model.fn() == 1337 @pytest.mark.skipif(not has_mxnet, reason="needs MXNet") def test_mxnet_wrapper_thinc_set_model_name(mx_model): model = MXNetWrapper(mx_model, model_name="cool") assert model.name == "cool" thinc-release-v9.1.1/thinc/tests/layers/test_parametric_attention_v2.py000066400000000000000000000004351467064331700264520ustar00rootroot00000000000000from thinc.layers.gelu import Gelu from thinc.layers.parametricattention_v2 import ( KEY_TRANSFORM_REF, ParametricAttention_v2, ) def test_key_transform_used(): attn = ParametricAttention_v2(key_transform=Gelu()) assert attn.get_ref(KEY_TRANSFORM_REF).name == "gelu" thinc-release-v9.1.1/thinc/tests/layers/test_pytorch_wrapper.py000066400000000000000000000154471467064331700250700ustar00rootroot00000000000000import numpy import pytest from thinc.api import ( SGD, ArgsKwargs, CupyOps, Linear, MPSOps, NumpyOps, PyTorchWrapper, PyTorchWrapper_v2, PyTorchWrapper_v3, Relu, chain, get_current_ops, torch2xp, use_ops, xp2torch, ) from thinc.backends import context_pools from thinc.compat import has_cupy_gpu, has_torch, has_torch_amp, has_torch_mps_gpu from thinc.layers.pytorchwrapper import PyTorchWrapper_v3 from thinc.shims.pytorch import ( default_deserialize_torch_model, default_serialize_torch_model, ) from thinc.shims.pytorch_grad_scaler import PyTorchGradScaler from thinc.util import get_torch_default_device from ..util import check_input_converters, make_tempdir XP_OPS = [NumpyOps()] if has_cupy_gpu: XP_OPS.append(CupyOps()) if has_torch_mps_gpu: XP_OPS.append(MPSOps()) if has_torch_amp: TORCH_MIXED_PRECISION = [False, True] else: TORCH_MIXED_PRECISION = [False] XP_OPS_MIXED = [ (ops, mixed) for ops in XP_OPS for mixed in TORCH_MIXED_PRECISION if not mixed or isinstance(ops, CupyOps) ] def check_learns_zero_output(model, sgd, X, Y): """Check we can learn to output a zero vector""" Yh, get_dX = model.begin_update(X) dYh = (Yh - Y) / Yh.shape[0] dX = get_dX(dYh) model.finish_update(sgd) prev = numpy.abs(Yh.sum()) for i in range(100): Yh, get_dX = model.begin_update(X) total = numpy.abs(Yh.sum()) dX = get_dX(Yh - Y) # noqa: F841 model.finish_update(sgd) assert total < prev @pytest.mark.skipif(not has_torch, reason="needs PyTorch") @pytest.mark.parametrize("nN,nI,nO", [(2, 3, 4)]) def test_pytorch_unwrapped(nN, nI, nO): model = Linear(nO, nI).initialize() X = numpy.zeros((nN, nI), dtype="f") X += numpy.random.uniform(size=X.size).reshape(X.shape) sgd = SGD(0.01) Y = numpy.zeros((nN, nO), dtype="f") check_learns_zero_output(model, sgd, X, Y) @pytest.mark.skipif(not has_torch, reason="needs PyTorch") @pytest.mark.parametrize("nN,nI,nO", [(2, 3, 4)]) def test_pytorch_wrapper(nN, nI, nO): import torch.nn model = PyTorchWrapper(torch.nn.Linear(nI, nO)).initialize() sgd = SGD(0.001) X = numpy.zeros((nN, nI), dtype="f") X += numpy.random.uniform(size=X.size).reshape(X.shape) Y = numpy.zeros((nN, nO), dtype="f") Yh, get_dX = model.begin_update(X) assert isinstance(Yh, numpy.ndarray) assert Yh.shape == (nN, nO) dYh = (Yh - Y) / Yh.shape[0] dX = get_dX(dYh) model.finish_update(sgd) assert dX.shape == (nN, nI) check_learns_zero_output(model, sgd, X, Y) assert isinstance(model.predict(X), numpy.ndarray) @pytest.mark.skipif(not has_torch, reason="needs PyTorch") @pytest.mark.parametrize("ops_mixed", XP_OPS_MIXED) @pytest.mark.parametrize("nN,nI,nO", [(2, 3, 4)]) def test_pytorch_wrapper_thinc_input(ops_mixed, nN, nI, nO): import torch.nn ops, mixed_precision = ops_mixed with use_ops(ops.name): ops = get_current_ops() pytorch_layer = torch.nn.Linear(nO, nO) # Initialize with large weights to trigger overflow of FP16 in # mixed-precision training. torch.nn.init.uniform_(pytorch_layer.weight, 9.0, 11.0) device = get_torch_default_device() model = chain( Relu(), PyTorchWrapper_v2( pytorch_layer.to(device), mixed_precision=mixed_precision, grad_scaler=PyTorchGradScaler( enabled=mixed_precision, init_scale=2.0**16 ), ).initialize(), ) # pytorch allocator is set in PyTorchShim if isinstance(ops, CupyOps): assert "pytorch" in context_pools.get() sgd = SGD(0.001) X = ops.xp.zeros((nN, nI), dtype="f") X += ops.xp.random.uniform(size=X.size).reshape(X.shape) Y = ops.xp.zeros((nN, nO), dtype="f") model.initialize(X, Y) Yh, get_dX = model.begin_update(X) assert isinstance(Yh, ops.xp.ndarray) assert Yh.shape == (nN, nO) dYh = (Yh - Y) / Yh.shape[0] dX = get_dX(dYh) model.finish_update(sgd) assert dX.shape == (nN, nI) check_learns_zero_output(model, sgd, X, Y) assert isinstance(model.predict(X), ops.xp.ndarray) @pytest.mark.skipif(not has_torch, reason="needs PyTorch") def test_pytorch_roundtrip_conversion(): import torch xp_tensor = numpy.zeros((2, 3), dtype="f") torch_tensor = xp2torch(xp_tensor) assert isinstance(torch_tensor, torch.Tensor) new_xp_tensor = torch2xp(torch_tensor) assert numpy.array_equal(xp_tensor, new_xp_tensor) @pytest.mark.skipif(not has_torch, reason="needs PyTorch") def test_pytorch_wrapper_roundtrip(): import torch.nn model = PyTorchWrapper(torch.nn.Linear(2, 3)) model_bytes = model.to_bytes() PyTorchWrapper(torch.nn.Linear(2, 3)).from_bytes(model_bytes) with make_tempdir() as path: model_path = path / "model" model.to_disk(model_path) new_model = PyTorchWrapper(torch.nn.Linear(2, 3)).from_bytes(model_bytes) new_model.from_disk(model_path) @pytest.mark.skipif(not has_torch, reason="needs PyTorch") @pytest.mark.parametrize( "data,n_args,kwargs_keys", [ # fmt: off (numpy.zeros((2, 3), dtype="f"), 1, []), ([numpy.zeros((2, 3), dtype="f"), numpy.zeros((2, 3), dtype="f")], 2, []), ((numpy.zeros((2, 3), dtype="f"), numpy.zeros((2, 3), dtype="f")), 2, []), ({"a": numpy.zeros((2, 3), dtype="f"), "b": numpy.zeros((2, 3), dtype="f")}, 0, ["a", "b"]), (ArgsKwargs((numpy.zeros((2, 3), dtype="f"), numpy.zeros((2, 3), dtype="f")), {"c": numpy.zeros((2, 3), dtype="f")}), 2, ["c"]), # fmt: on ], ) def test_pytorch_convert_inputs(data, n_args, kwargs_keys): import torch.nn model = PyTorchWrapper(torch.nn.Linear(3, 4)) convert_inputs = model.attrs["convert_inputs"] Y, backprop = convert_inputs(model, data, is_train=True) check_input_converters(Y, backprop, data, n_args, kwargs_keys, torch.Tensor) @pytest.mark.skipif(not has_torch, reason="needs PyTorch") def test_pytorch_wrapper_custom_serde(): import torch.nn def serialize(model): return default_serialize_torch_model(model) def deserialize(model, state_bytes, device): return default_deserialize_torch_model(model, state_bytes, device) def get_model(): return PyTorchWrapper_v3( torch.nn.Linear(2, 3), serialize_model=serialize, deserialize_model=deserialize, ) model = get_model() model_bytes = model.to_bytes() get_model().from_bytes(model_bytes) with make_tempdir() as path: model_path = path / "model" model.to_disk(model_path) new_model = get_model().from_bytes(model_bytes) new_model.from_disk(model_path) thinc-release-v9.1.1/thinc/tests/layers/test_reduce.py000066400000000000000000000071571467064331700231060ustar00rootroot00000000000000import numpy import pytest from thinc.api import reduce_first, reduce_last, reduce_max, reduce_mean, reduce_sum from thinc.types import Ragged @pytest.fixture def Xs(): seqs = [numpy.zeros((10, 8), dtype="f"), numpy.zeros((4, 8), dtype="f")] for x in seqs: x[0] = 1 x[1] = 2 # so max != first x[-1] = -1 return seqs def test_init_reduce_first(): model = reduce_first() def test_init_reduce_last(): model = reduce_last() def test_init_reduce_mean(): model = reduce_mean() def test_init_reduce_max(): model = reduce_max() def test_init_reduce_sum(): model = reduce_sum() def test_reduce_first(Xs): model = reduce_first() lengths = model.ops.asarray([x.shape[0] for x in Xs], dtype="i") X = Ragged(model.ops.flatten(Xs), lengths) Y, backprop = model(X, is_train=True) assert isinstance(Y, numpy.ndarray) assert Y.shape == (len(Xs), Xs[0].shape[1]) assert Y.dtype == Xs[0].dtype assert list(Y[0]) == list(Xs[0][0]) assert list(Y[1]) == list(Xs[1][0]) dX = backprop(Y) assert dX.dataXd.shape == X.dataXd.shape def test_reduce_last(Xs): model = reduce_last() lengths = model.ops.asarray([x.shape[0] for x in Xs], dtype="i") X = Ragged(model.ops.flatten(Xs), lengths) Y, backprop = model(X, is_train=True) assert isinstance(Y, numpy.ndarray) assert Y.shape == (len(Xs), Xs[0].shape[1]) assert Y.dtype == Xs[0].dtype assert list(Y[0]) == list(Xs[0][-1]) assert list(Y[1]) == list(Xs[1][-1]) dX = backprop(Y) assert dX.dataXd.shape == X.dataXd.shape def test_reduce_max(Xs): model = reduce_max() lengths = model.ops.asarray([x.shape[0] for x in Xs], dtype="i") X = Ragged(model.ops.flatten(Xs), lengths) Y, backprop = model(X, is_train=True) assert isinstance(Y, numpy.ndarray) assert Y.shape == (len(Xs), Xs[0].shape[1]) assert Y.dtype == Xs[0].dtype assert list(Y[0]) == list(Xs[0][1]) assert list(Y[1]) == list(Xs[1][1]) dX = backprop(Y) assert dX.dataXd.shape == X.dataXd.shape def test_reduce_mean(Xs): Xs = [x * 1000 for x in Xs] # use large numbers for numeric stability model = reduce_mean() lengths = model.ops.asarray([x.shape[0] for x in Xs], dtype="i") X = Ragged(model.ops.flatten(Xs), lengths) Y, backprop = model(X, is_train=True) assert isinstance(Y, numpy.ndarray) assert Y.shape == (len(Xs), Xs[0].shape[1]) assert Y.dtype == Xs[0].dtype assert numpy.all(Y[0] == Y[0][0]) # all values in row should be equal assert Y[0][0] == Xs[0].mean() assert numpy.all(Y[1] == Y[1][0]) assert Y[1][0] == Xs[1].mean() dX = backprop(Y) assert dX.dataXd.shape == X.dataXd.shape def test_reduce_sum(Xs): model = reduce_sum() lengths = model.ops.asarray([x.shape[0] for x in Xs], dtype="i") X = Ragged(model.ops.flatten(Xs), lengths) Y, backprop = model(X, is_train=True) assert isinstance(Y, numpy.ndarray) assert Y.shape == (len(Xs), Xs[0].shape[1]) assert Y.dtype == Xs[0].dtype assert Y[0][0] == Xs[0][:, 0].sum() assert numpy.all(Y[0] == Y[0][0]) assert Y[1][-1] == Xs[1][:, 0].sum() assert numpy.all(Y[1] == Y[1][0]) dX = backprop(Y) assert dX.dataXd.shape == X.dataXd.shape def test_size_mismatch(Xs): for reduce in [reduce_first, reduce_last, reduce_max, reduce_mean, reduce_sum]: model = reduce() lengths = model.ops.asarray([x.shape[0] for x in Xs], dtype="i") X = Ragged(model.ops.flatten(Xs), lengths) Y, backprop = model(X, is_train=True) Y_bad = Y[:-1] with pytest.raises(ValueError): backprop(Y_bad) thinc-release-v9.1.1/thinc/tests/layers/test_resizable.py000066400000000000000000000015521467064331700236100ustar00rootroot00000000000000from functools import partial import pytest from thinc.api import Linear, resizable from thinc.layers.resizable import resize_linear_weighted, resize_model @pytest.fixture def model(): output_layer = Linear(nO=None, nI=None) fill_defaults = {"b": 0, "W": 0} model = resizable( output_layer, resize_layer=partial(resize_linear_weighted, fill_defaults=fill_defaults), ) return model def test_resizable_linear_default_name(model): assert model.name == "resizable(linear)" def test_resize_model(model): """Test that resizing the model doesn't cause an exception.""" resize_model(model, new_nO=10) resize_model(model, new_nO=11) model.set_dim("nO", 0, force=True) resize_model(model, new_nO=10) model.set_dim("nI", 10, force=True) model.set_dim("nO", 0, force=True) resize_model(model, new_nO=10) thinc-release-v9.1.1/thinc/tests/layers/test_shim.py000066400000000000000000000016611467064331700225710ustar00rootroot00000000000000from typing import List from thinc.shims.shim import Shim from ..util import make_tempdir class MockShim(Shim): def __init__(self, data: List[int]): super().__init__(None, config=None, optimizer=None) self.data = data def to_bytes(self): return bytes(self.data) def from_bytes(self, data: bytes) -> "MockShim": return MockShim(data=list(data)) def test_shim_can_roundtrip_with_path(): with make_tempdir() as path: shim_path = path / "cool_shim.data" shim = MockShim([1, 2, 3]) shim.to_disk(shim_path) copy_shim = shim.from_disk(shim_path) assert copy_shim.to_bytes() == shim.to_bytes() def test_shim_can_roundtrip_with_path_subclass(pathy_fixture): shim_path = pathy_fixture / "cool_shim.data" shim = MockShim([1, 2, 3]) shim.to_disk(shim_path) copy_shim = shim.from_disk(shim_path) assert copy_shim.to_bytes() == shim.to_bytes() thinc-release-v9.1.1/thinc/tests/layers/test_softmax.py000066400000000000000000000054651467064331700233200ustar00rootroot00000000000000from typing import Tuple, cast import numpy import pytest from numpy.testing import assert_allclose from thinc.api import Model, NumpyOps, Softmax_v2 from thinc.types import Floats2d, Ints1d from thinc.util import has_torch, torch2xp, xp2torch OPS = NumpyOps() inputs = OPS.xp.asarray([[4, 2, 3, 4], [1, 5, 3, 1], [9, 8, 5, 7]], dtype="f") outputs = OPS.xp.asarray( [ [0.39948627, 0.05406459, 0.14696279, 0.39948627], [0.01562812, 0.8532666, 0.11547707, 0.01562812], [0.657233, 0.24178252, 0.01203764, 0.08894681], ], dtype="f", ) def test_unnormalized_softmax_backprop(): model = Softmax_v2(normalize_outputs=False) model.initialize(inputs, outputs) _, backprop = model(inputs, is_train=False) with pytest.raises(ValueError, match="backprop is not supported"): backprop(OPS.xp.zeros_like(outputs)) # Backprop should not fail when training. _, backprop = model(inputs, is_train=True) dX = backprop(OPS.xp.zeros_like(outputs)) assert OPS.xp.all(dX == 0.0) def torch_softmax_with_temperature( model: Model, X: Floats2d, targets: Ints1d ) -> Tuple[Floats2d, Floats2d]: import torch Wt = xp2torch(model.get_param("W")) bt = xp2torch(model.get_param("b")) temperature = model.attrs["softmax_temperature"] Xt = xp2torch(X, requires_grad=True) Yt_gold = xp2torch(targets).long() XWbt = (Xt @ Wt) + bt XWbt_temp = XWbt / temperature loss = torch.nn.CrossEntropyLoss() output = loss(XWbt_temp, Yt_gold) output.backward() return cast( Floats2d, torch2xp(torch.nn.functional.softmax(XWbt_temp, dim=-1)) ), cast(Floats2d, torch2xp(cast(torch.Tensor, Xt.grad))) @pytest.mark.skipif(not has_torch, reason="needs PyTorch") @pytest.mark.parametrize("temperature", [0.5, 1.0, 2.0]) def test_softmax_temperature(temperature): model = Softmax_v2( temperature=temperature, init_W=lambda ops, shape: ops.xp.eye(shape[1], dtype="f"), init_b=lambda ops, shape: ops.xp.zeros(shape, dtype="f"), ) X = OPS.xp.arange(-1, 1, 0.2, dtype="f").reshape(1, 10) targets = OPS.asarray1i([4]) Y_gold = OPS.xp.eye(10, dtype="f")[targets] model.initialize(X, Y_gold) Yt, dXt = torch_softmax_with_temperature(model, X, targets) Y, backprop = model(X, is_train=True) dX = backprop(Y - Y_gold) assert_allclose(Y, Yt, atol=1e-4) assert_allclose(dX, dXt, atol=1e-4) def test_reject_incorrect_temperature(): with pytest.raises(ValueError, match=r"softmax temperature.*zero"): Softmax_v2(normalize_outputs=False, temperature=0.0) model = Softmax_v2(normalize_outputs=False) model.attrs["softmax_temperature"] = 0.0 model.initialize(inputs, outputs) with pytest.raises(ValueError, match=r"softmax temperature.*zero"): model(inputs, is_train=False) thinc-release-v9.1.1/thinc/tests/layers/test_sparse_linear.py000066400000000000000000000043631467064331700244620ustar00rootroot00000000000000import math import numpy import pytest from thinc.api import SGD, SparseLinear, SparseLinear_v2, to_categorical @pytest.fixture def instances(): lengths = numpy.asarray([5, 4], dtype="int32") keys = numpy.arange(9, dtype="uint64") values = numpy.ones(9, dtype="float32") X = (keys, values, lengths) y = numpy.asarray([0, 2], dtype="int32") return X, to_categorical(y, n_classes=3) @pytest.fixture def sgd(): return SGD(0.001) def test_basic(instances, sgd): X, y = instances nr_class = 3 model = SparseLinear(nr_class).initialize() yh, backprop = model.begin_update(X) loss1 = ((yh - y) ** 2).sum() backprop(yh - y) model.finish_update(sgd) yh, backprop = model.begin_update(X) loss2 = ((yh - y) ** 2).sum() assert loss2 < loss1 def test_init(): model = SparseLinear(3).initialize() keys = numpy.ones((5,), dtype="uint64") values = numpy.ones((5,), dtype="f") lengths = numpy.zeros((2,), dtype="int32") lengths[0] = 3 lengths[1] = 2 scores, backprop = model.begin_update((keys, values, lengths)) assert scores.shape == (2, 3) d_feats = backprop(scores) assert len(d_feats) == 3 def test_distribution(): n_class = 10 length = 2**18 model = SparseLinear_v2(nO=n_class, length=length).initialize() ii64 = numpy.iinfo(numpy.uint64) lengths = numpy.zeros((2,), dtype="int32") for p_nonzero in range(1, 12): # Clear gradients from the previous iterarion. model.set_grad("W", 0.0) n = 2**p_nonzero keys = numpy.random.randint(ii64.min, ii64.max, size=(n,), dtype=numpy.uint64) values = numpy.ones((n,), dtype="f") lengths[0] = n // 2 lengths[1] = n // 2 # Probability that a bit is set (2 because we use 2 hashes). p_nonzero = 1 - math.exp(-2 * n / length) Y, backprop = model.begin_update((keys, values, lengths)) backprop(numpy.ones_like(Y)) # Check that for each class we have the expected rate of non-zeros. dW = model.get_grad("W").reshape(n_class, -1) nonzero_empirical = numpy.count_nonzero(dW, axis=1) / dW.shape[1] numpy.testing.assert_allclose( nonzero_empirical, p_nonzero, rtol=1e-4, atol=1e-4 ) thinc-release-v9.1.1/thinc/tests/layers/test_tensorflow_wrapper.py000066400000000000000000000314671467064331700256020ustar00rootroot00000000000000import numpy import pytest from thinc.api import ( Adam, ArgsKwargs, Linear, Model, TensorFlowWrapper, get_current_ops, keras_subclass, tensorflow2xp, xp2tensorflow, ) from thinc.compat import has_cupy_gpu, has_tensorflow from thinc.util import to_categorical from ..util import check_input_converters, make_tempdir @pytest.fixture def n_hidden(): return 12 @pytest.fixture def input_size(): return 784 @pytest.fixture def n_classes(): return 10 @pytest.fixture def answer(): return 1 @pytest.fixture def X(input_size): ops = get_current_ops() return ops.alloc(shape=(1, input_size)) @pytest.fixture def Y(answer, n_classes): ops = get_current_ops() return to_categorical(ops.asarray1i([answer]), n_classes=n_classes) @pytest.fixture def tf_model(n_hidden, input_size): import tensorflow as tf tf_model = tf.keras.Sequential( [ tf.keras.layers.Dense(n_hidden, input_shape=(input_size,)), tf.keras.layers.LayerNormalization(), tf.keras.layers.Dense(n_hidden, activation="relu"), tf.keras.layers.LayerNormalization(), tf.keras.layers.Dense(10, activation="softmax"), ] ) return tf_model @pytest.fixture def model(tf_model): return TensorFlowWrapper(tf_model) @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_roundtrip_conversion(): import tensorflow as tf ops = get_current_ops() xp_tensor = ops.alloc2f(2, 3, zeros=True) tf_tensor = xp2tensorflow(xp_tensor) assert isinstance(tf_tensor, tf.Tensor) new_xp_tensor = tensorflow2xp(tf_tensor, ops=ops) assert ops.xp.array_equal(xp_tensor, new_xp_tensor) @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_construction_requires_keras_model(): import tensorflow as tf keras_model = tf.keras.Sequential([tf.keras.layers.Dense(12, input_shape=(12,))]) assert isinstance(TensorFlowWrapper(keras_model), Model) with pytest.raises(ValueError): TensorFlowWrapper(Linear(2, 3)) @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_built_model(model, X, Y): # built models are validated more and can perform useful operations: assert model.predict(X) is not None # Can print a keras summary assert str(model.shims[0]) != "" # They can de/serialized assert model.from_bytes(model.to_bytes()) is not None @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_predict(model, X): model.predict(X) @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_train_overfits(model, X, Y, answer): optimizer = Adam() ops = get_current_ops() for i in range(100): guesses, backprop = model(X, is_train=True) # Ensure that the tensor is type-compatible with the current backend. guesses = ops.asarray(guesses) d_guesses = (guesses - Y) / guesses.shape[0] backprop(d_guesses) model.finish_update(optimizer) predicted = model.predict(X).argmax() assert predicted == answer @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_accumulate_gradients(model, X, Y, answer): import tensorflow as tf optimizer = Adam() gradients = [] ops = get_current_ops() for i in range(3): guesses, backprop = model(X, is_train=True) # Ensure that the tensor is type-compatible with the current backend. guesses = ops.asarray(guesses) d_guesses = (guesses - Y) / guesses.shape[0] backprop(d_guesses) shim_grads = [tf.identity(var) for var in model.shims[0].gradients] gradients.append(shim_grads) # Apply the gradients model.finish_update(optimizer) assert model.shims[0].gradients is None # Compare prev/next pairs and ensure their gradients have changed for i in range(len(gradients)): # Skip the first one if i == 0: continue found_diff = False curr_grads = gradients[i] prev_grads = gradients[i - 1] for curr, prev in zip(curr_grads, prev_grads): if (prev != curr).numpy().any(): found_diff = True assert found_diff is True @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_serialize_model_subclass( X, Y, input_size, n_classes, answer ): import tensorflow as tf input_shape = (1, input_size) ops = get_current_ops() @keras_subclass( "foo.v1", X=ops.alloc2f(*input_shape), Y=to_categorical(ops.asarray1i([1]), n_classes=n_classes), input_shape=input_shape, ) class CustomKerasModel(tf.keras.Model): def __init__(self, **kwargs): super(CustomKerasModel, self).__init__(**kwargs) self.in_dense = tf.keras.layers.Dense( 12, name="in_dense", input_shape=input_shape ) self.out_dense = tf.keras.layers.Dense( n_classes, name="out_dense", activation="softmax" ) def call(self, inputs) -> tf.Tensor: x = self.in_dense(inputs) return self.out_dense(x) model = TensorFlowWrapper(CustomKerasModel()) # Train the model to predict the right single answer optimizer = Adam() for i in range(50): guesses, backprop = model(X, is_train=True) # Ensure that the tensor is type-compatible with the current backend. guesses = ops.asarray(guesses) d_guesses = (guesses - Y) / guesses.shape[0] backprop(d_guesses) model.finish_update(optimizer) predicted = model.predict(X).argmax() assert predicted == answer # Save then Load the model from bytes model.from_bytes(model.to_bytes()) # The from_bytes model gets the same answer assert model.predict(X).argmax() == answer @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_keras_subclass_decorator_compile_args(): import tensorflow as tf class UndecoratedModel(tf.keras.Model): def call(self, inputs): return inputs # Can't wrap an undecorated keras subclass model with pytest.raises(ValueError): TensorFlowWrapper(UndecoratedModel()) @keras_subclass( "TestModel", X=numpy.array([0.0, 0.0]), Y=numpy.array([0.5]), input_shape=(2,), compile_args={"loss": "binary_crossentropy"}, ) class TestModel(tf.keras.Model): def call(self, inputs): return inputs model = TensorFlowWrapper(TestModel()) model = model.from_bytes(model.to_bytes()) assert model.shims[0]._model.loss == "binary_crossentropy" assert isinstance(model, Model) @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_keras_subclass_decorator(): import tensorflow as tf class UndecoratedModel(tf.keras.Model): def call(self, inputs): return inputs # Can't wrap an undecorated keras subclass model with pytest.raises(ValueError): TensorFlowWrapper(UndecoratedModel()) @keras_subclass( "TestModel", X=numpy.array([0.0, 0.0]), Y=numpy.array([0.5]), input_shape=(2,) ) class TestModel(tf.keras.Model): def call(self, inputs): return inputs # Can wrap an decorated keras subclass model assert isinstance(TensorFlowWrapper(TestModel()), Model) @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_keras_subclass_decorator_capture_args_kwargs( X, Y, input_size, n_classes, answer ): import tensorflow as tf @keras_subclass( "TestModel", X=numpy.array([0.0, 0.0]), Y=numpy.array([0.5]), input_shape=(2,) ) class TestModel(tf.keras.Model): def __init__(self, custom=False, **kwargs): super().__init__(self) # This is to force the mode to pass the captured arguments # or fail. assert custom is True assert kwargs.get("other", None) is not None def call(self, inputs): return inputs # Can wrap an decorated keras subclass model model = TensorFlowWrapper(TestModel(True, other=1337)) assert hasattr(model.shims[0]._model, "eg_args") args_kwargs = model.shims[0]._model.eg_args assert True in args_kwargs.args assert "other" in args_kwargs.kwargs # Raises an error if the args/kwargs is not serializable obj = {} obj["key"] = obj with pytest.raises(ValueError): TensorFlowWrapper(TestModel(True, other=obj)) # Provides the same arguments when copying a capture model model = model.from_bytes(model.to_bytes()) @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_can_copy_model(model): copy = model.copy() assert copy is not None @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_print_summary(model, X): summary = str(model.shims[0]) # Summary includes the layers of our model assert "layer_normalization" in summary assert "dense" in summary # And counts of params assert "Total params" in summary assert "Trainable params" in summary assert "Non-trainable params" in summary @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_to_bytes(model, X): # And can be serialized model_bytes = model.to_bytes() assert model_bytes is not None model.from_bytes(model_bytes) @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_to_from_disk(model, X, Y, answer): with make_tempdir() as tmp_path: model_file = tmp_path / "model.h5" model.to_disk(model_file) another_model = model.from_disk(model_file) assert another_model is not None @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_from_bytes(model, X): model.predict(X) model_bytes = model.to_bytes() another_model = model.from_bytes(model_bytes) assert another_model is not None @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_use_params(model, X, Y, answer): optimizer = Adam() ops = get_current_ops() with model.use_params(optimizer.averages): assert model.predict(X).argmax() is not None for i in range(10): guesses, backprop = model.begin_update(X) # Ensure that the tensor is type-compatible with the current backend. guesses = ops.asarray(guesses) d_guesses = (guesses - Y) / guesses.shape[0] backprop(d_guesses) model.finish_update(optimizer) with model.use_params(optimizer.averages): predicted = model.predict(X).argmax() assert predicted == answer @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_to_cpu(tf_model): model = TensorFlowWrapper(tf_model) model.to_cpu() @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") @pytest.mark.skipif(not has_cupy_gpu, reason="needs GPU/cupy") def test_tensorflow_wrapper_to_gpu(model, X): model.to_gpu(0) @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") @pytest.mark.parametrize( "data,n_args,kwargs_keys", [ # fmt: off (numpy.zeros((2, 3), dtype="f"), 1, []), ([numpy.zeros((2, 3), dtype="f"), numpy.zeros((2, 3), dtype="f")], 2, []), ((numpy.zeros((2, 3), dtype="f"), numpy.zeros((2, 3), dtype="f")), 2, []), ({"a": numpy.zeros((2, 3), dtype="f"), "b": numpy.zeros((2, 3), dtype="f")}, 0, ["a", "b"]), (ArgsKwargs((numpy.zeros((2, 3), dtype="f"), numpy.zeros((2, 3), dtype="f")), {"c": numpy.zeros((2, 3), dtype="f")}), 2, ["c"]), # fmt: on ], ) def test_tensorflow_wrapper_convert_inputs(data, n_args, kwargs_keys): import tensorflow as tf keras_model = tf.keras.Sequential([tf.keras.layers.Dense(12, input_shape=(12,))]) model = TensorFlowWrapper(keras_model) convert_inputs = model.attrs["convert_inputs"] Y, backprop = convert_inputs(model, data, is_train=True) check_input_converters(Y, backprop, data, n_args, kwargs_keys, tf.Tensor) @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_thinc_model_subclass(tf_model): class CustomModel(Model): def fn(self): return 1337 model = TensorFlowWrapper(tf_model, model_class=CustomModel) assert isinstance(model, CustomModel) assert model.fn() == 1337 @pytest.mark.skipif(not has_tensorflow, reason="needs TensorFlow") def test_tensorflow_wrapper_thinc_set_model_name(tf_model): model = TensorFlowWrapper(tf_model, model_name="cool") assert model.name == "cool" thinc-release-v9.1.1/thinc/tests/layers/test_torchscriptwrapper.py000066400000000000000000000014461467064331700255770ustar00rootroot00000000000000import numpy import pytest from thinc.api import ( PyTorchWrapper_v2, TorchScriptWrapper_v1, pytorch_to_torchscript_wrapper, ) from thinc.compat import has_torch, torch @pytest.mark.skipif(not has_torch, reason="needs PyTorch") @pytest.mark.parametrize("nN,nI,nO", [(2, 3, 4)]) def test_pytorch_script(nN, nI, nO): model = PyTorchWrapper_v2(torch.nn.Linear(nI, nO)).initialize() script_model = pytorch_to_torchscript_wrapper(model) X = numpy.random.randn(nN, nI).astype("f") Y = model.predict(X) Y_script = script_model.predict(X) numpy.testing.assert_allclose(Y, Y_script) serialized = script_model.to_bytes() script_model2 = TorchScriptWrapper_v1() script_model2.from_bytes(serialized) numpy.testing.assert_allclose(Y, script_model2.predict(X)) thinc-release-v9.1.1/thinc/tests/layers/test_transforms.py000066400000000000000000000036701467064331700240310ustar00rootroot00000000000000import numpy import pytest from thinc.api import NumpyOps, Ragged, registry, strings2arrays from ..util import get_data_checker @pytest.fixture(params=[[], [(10, 2)], [(5, 3), (1, 3)], [(2, 3), (0, 3), (1, 3)]]) def shapes(request): return request.param @pytest.fixture def ops(): return NumpyOps() @pytest.fixture def list_data(shapes): return [numpy.zeros(shape, dtype="f") for shape in shapes] @pytest.fixture def ragged_data(ops, list_data): lengths = numpy.array([len(x) for x in list_data], dtype="i") if not list_data: return Ragged(ops.alloc2f(0, 0), lengths) else: return Ragged(ops.flatten(list_data), lengths) @pytest.fixture def padded_data(ops, list_data): return ops.list2padded(list_data) @pytest.fixture def array_data(ragged_data): return ragged_data.data def check_transform(transform, in_data, out_data): model = registry.resolve({"config": {"@layers": transform}})["config"] input_checker = get_data_checker(in_data) output_checker = get_data_checker(out_data) model.initialize(in_data, out_data) Y, backprop = model(in_data, is_train=True) output_checker(Y, out_data) dX = backprop(Y) input_checker(dX, in_data) def test_list2array(list_data, array_data): check_transform("list2array.v1", list_data, array_data) def test_list2ragged(list_data, ragged_data): check_transform("list2ragged.v1", list_data, ragged_data) def test_list2padded(list_data, padded_data): check_transform("list2padded.v1", list_data, padded_data) def test_ragged2list(ragged_data, list_data): check_transform("ragged2list.v1", ragged_data, list_data) def test_padded2list(padded_data, list_data): check_transform("padded2list.v1", padded_data, list_data) def test_strings2arrays(): strings = ["hello", "world"] model = strings2arrays() Y, backprop = model.begin_update(strings) assert len(Y) == len(strings) assert backprop([]) == [] thinc-release-v9.1.1/thinc/tests/layers/test_uniqued.py000066400000000000000000000043141467064331700233010ustar00rootroot00000000000000import numpy import pytest from hypothesis import given, settings from hypothesis.strategies import composite, integers, lists from numpy.testing import assert_allclose from thinc.layers import Embed from thinc.layers.uniqued import uniqued ROWS = 10 # This test uses a newer hypothesis feature than the skanky flatmap-style # I used previously. This is much nicer, although it still takes some getting # used to. The key feature is this composite decorator. It injects a function, # 'draw'. @composite def lists_of_integers(draw, columns=2, lo=0, hi=ROWS - 1): # We call draw to get example values, which we can manipulate. # Here we get a list of integers, where each member of the list # should be between a min and max value. int_list = draw(lists(integers(min_value=lo, max_value=hi))) # Now we can use this int list to make an array, and it'll be the arrays # that our functions receive. # We trim the list, so we're of length divisible by columns. int_list = int_list[len(int_list) % columns :] # And make the array and reshape it. array = numpy.array(int_list, dtype="uint64") return array.reshape((-1, columns)) @pytest.fixture(scope="module") def model(nO=128): return Embed(nO, ROWS, column=0).initialize() def test_uniqued_calls_init(): calls = [] embed = Embed(5, 5, column=0) embed.init = lambda *args, **kwargs: calls.append(True) embed.initialize() assert calls == [True] uembed = uniqued(embed) uembed.initialize() assert calls == [True, True] @given(X=lists_of_integers(lo=0, hi=ROWS - 1)) @settings(deadline=None) def test_uniqued_doesnt_change_result(model, X): umodel = uniqued(model, column=model.attrs["column"]).initialize() Y, bp_Y = model(X, is_train=True) Yu, bp_Yu = umodel(X, is_train=True) assert_allclose(Y, Yu) dX = bp_Y(Y) dXu = bp_Yu(Yu) assert_allclose(dX, dXu) if X.size: pass # TODO: This test is a problem, because we exceed the embedding table. # Fix it with a better cap. # Check that different inputs do give different results # Z, bp_Z = model(X + 1, is_train=True) # with pytest.raises(AssertionError): # assert_allclose(Y, Z) thinc-release-v9.1.1/thinc/tests/layers/test_with_debug.py000066400000000000000000000014421467064331700237470ustar00rootroot00000000000000from mock import MagicMock from thinc.api import Linear, with_debug def test_with_debug(): on_init = MagicMock() on_forward = MagicMock() on_backprop = MagicMock() model = with_debug( Linear(), on_init=on_init, on_forward=on_forward, on_backprop=on_backprop ) on_init.assert_not_called() on_forward.assert_not_called() on_backprop.assert_not_called() X = model.ops.alloc2f(1, 1) Y = model.ops.alloc2f(1, 1) model.initialize(X=X, Y=Y) on_init.assert_called_once_with(model, X, Y) on_forward.assert_not_called() on_backprop.assert_not_called() Yh, backprop = model(X, is_train=True) on_forward.assert_called_once_with(model, X, True) on_backprop.assert_not_called() backprop(Y) on_backprop.assert_called_once_with(Y) thinc-release-v9.1.1/thinc/tests/layers/test_with_flatten.py000066400000000000000000000015471467064331700243240ustar00rootroot00000000000000from typing import List from thinc.api import Model, with_flatten_v2 INPUT = [[1, 2, 3], [4, 5], [], [6, 7, 8]] INPUT_FLAT = [1, 2, 3, 4, 5, 6, 7, 8] OUTPUT = [[2, 3, 4], [5, 6], [], [7, 8, 9]] BACKPROP_OUTPUT = [[3, 4, 5], [6, 7], [], [8, 9, 10]] def _memoize_input() -> Model[List[int], List[int]]: return Model(name="memoize_input", forward=_memoize_input_forward) def _memoize_input_forward( model: Model[List[int], List[int]], X: List[int], is_train: bool ): model.attrs["last_input"] = X def backprop(dY: List[int]): return [v + 2 for v in dY] return [v + 1 for v in X], backprop def test_with_flatten(): model = with_flatten_v2(_memoize_input()) Y, backprop = model(INPUT, is_train=True) assert Y == OUTPUT assert model.layers[0].attrs["last_input"] == INPUT_FLAT assert backprop(INPUT) == BACKPROP_OUTPUT thinc-release-v9.1.1/thinc/tests/layers/test_with_transforms.py000066400000000000000000000236711467064331700250670ustar00rootroot00000000000000import numpy import numpy.testing import pytest from thinc.api import ( Linear, Model, NumpyOps, noop, with_array, with_array2d, with_getitem, with_list, with_padded, with_ragged, ) from thinc.types import Padded, Ragged from ..util import get_data_checker @pytest.fixture(params=[[], [(10, 2)], [(5, 3), (1, 3)], [(2, 3), (0, 3), (1, 3)]]) def shapes(request): return request.param @pytest.fixture def ops(): return NumpyOps() @pytest.fixture def list_input(shapes): data = [numpy.zeros(shape, dtype="f") for shape in shapes] for i, x in enumerate(data): # Give values that make it easy to see where rows or columns mismatch. x += i * 100 x += numpy.arange(x.shape[0]).reshape((-1, 1)) * 10 x += numpy.arange(x.shape[1]).reshape((1, -1)) return data @pytest.fixture def ragged_input(ops, list_input): lengths = numpy.array([len(x) for x in list_input], dtype="i") if not list_input: return Ragged(ops.alloc2f(0, 0), lengths) else: return Ragged(ops.flatten(list_input), lengths) @pytest.fixture def padded_input(ops, list_input): return ops.list2padded(list_input) @pytest.fixture def array_input(ragged_input): return ragged_input.data @pytest.fixture def padded_data_input(padded_input): x = padded_input return (x.data, x.size_at_t, x.lengths, x.indices) @pytest.fixture def ragged_data_input(ragged_input): return (ragged_input.data, ragged_input.lengths) @pytest.fixture def noop_models(): return [ with_padded(noop()), with_array(noop()), with_array2d(noop()), with_list(noop()), with_ragged(noop()), ] # As an example operation, lets just trim the last dimension. That # should catch stuff that confuses the input and output. def get_array_model(): def _trim_array_forward(model, X, is_train): def backprop(dY): return model.ops.alloc2f(dY.shape[0], dY.shape[1] + 1) return X[:, :-1], backprop return with_array2d(Model("trimarray", _trim_array_forward)) def get_list_model(): def _trim_list_forward(model, Xs, is_train): def backprop(dYs): dXs = [] for dY in dYs: dXs.append(model.ops.alloc2f(dY.shape[0], dY.shape[1] + 1)) return dXs Ys = [X[:, :-1] for X in Xs] return Ys, backprop return with_list(Model("trimlist", _trim_list_forward)) def get_padded_model(): def _trim_padded_forward(model, Xp, is_train): def backprop(dYp): dY = dYp.data dX = model.ops.alloc3f(dY.shape[0], dY.shape[1], dY.shape[2] + 1) return Padded(dX, dYp.size_at_t, dYp.lengths, dYp.indices) assert isinstance(Xp, Padded) X = Xp.data X = X.reshape((X.shape[0] * X.shape[1], X.shape[2])) X = X[:, :-1] X = X.reshape((Xp.data.shape[0], Xp.data.shape[1], X.shape[1])) return Padded(X, Xp.size_at_t, Xp.lengths, Xp.indices), backprop return with_padded(Model("trimpadded", _trim_padded_forward)) def get_ragged_model(): def _trim_ragged_forward(model, Xr, is_train): def backprop(dYr): dY = dYr.data dX = model.ops.alloc2f(dY.shape[0], dY.shape[1] + 1) return Ragged(dX, dYr.lengths) return Ragged(Xr.data[:, :-1], Xr.lengths), backprop return with_ragged(Model("trimragged", _trim_ragged_forward)) def check_initialize(model, inputs): # Just check that these run and don't hit errors. I guess we should add a # spy and check that model.layers[0].initialize gets called, but shrug? model.initialize() model.initialize(X=inputs) model.initialize(X=inputs, Y=model.predict(inputs)) def check_transform_produces_correct_output_type_forward(model, inputs, checker): # It's pretty redundant to check these three assertions, so if the tests # get slow this could be removed. I think it should be fine though? outputs = model.predict(inputs) assert checker(inputs, outputs) outputs, _ = model(inputs, is_train=True) assert checker(inputs, outputs) outputs, _ = model(inputs, is_train=False) assert checker(inputs, outputs) def check_transform_produces_correct_output_type_backward(model, inputs, checker): # It's pretty redundant to check these three assertions, so if the tests # get slow this could be removed. I think it should be fine though? outputs, backprop = model.begin_update(inputs) d_inputs = backprop(outputs) assert checker(inputs, d_inputs) def check_transform_doesnt_change_noop_values(model, inputs, d_outputs): # Check that if we're wrapping a noop() layer in the transform, we don't # change the output values. outputs, backprop = model.begin_update(inputs) d_inputs = backprop(d_outputs) if isinstance(outputs, list): for i in range(len(outputs)): numpy.testing.assert_equal(inputs[i], outputs[i]) numpy.testing.assert_equal(d_outputs[i], d_inputs[i]) elif isinstance(outputs, numpy.ndarray): numpy.testing.assert_equal(inputs, outputs) numpy.testing.assert_equal(d_outputs, d_inputs) elif isinstance(outputs, Ragged): numpy.testing.assert_equal(inputs.data, outputs.data) numpy.testing.assert_equal(d_outputs.data, d_inputs.data) elif isinstance(outputs, Padded): numpy.testing.assert_equal(inputs.data, outputs.data) numpy.testing.assert_equal(d_inputs.data, d_inputs.data) def test_noop_transforms(noop_models, ragged_input, padded_input, list_input): # Make distinct backprop values, # to check that the gradients get passed correctly d_ragged = Ragged(ragged_input.data + 1, ragged_input.lengths) d_padded = padded_input.copy() d_padded.data += 1 d_list = [dx + 1 for dx in list_input] for model in noop_models: print(model.name) check_transform_doesnt_change_noop_values(model, padded_input, d_padded) check_transform_doesnt_change_noop_values(model, list_input, d_list) check_transform_doesnt_change_noop_values(model, ragged_input, d_ragged) def test_with_array_initialize(ragged_input, padded_input, list_input, array_input): for inputs in (ragged_input, padded_input, list_input, array_input): check_initialize(get_array_model(), inputs) def test_with_padded_initialize( ragged_input, padded_input, list_input, padded_data_input ): for inputs in (ragged_input, padded_input, list_input, padded_data_input): check_initialize(get_padded_model(), inputs) def test_with_list_initialize(ragged_input, padded_input, list_input): for inputs in (ragged_input, padded_input, list_input): check_initialize(get_list_model(), inputs) def test_with_ragged_initialize( ragged_input, padded_input, list_input, ragged_data_input ): for inputs in (ragged_input, padded_input, list_input, ragged_data_input): check_initialize(get_ragged_model(), inputs) def test_with_array_forward(ragged_input, padded_input, list_input, array_input): for inputs in (ragged_input, padded_input, list_input, array_input): checker = get_data_checker(inputs) model = get_array_model() check_transform_produces_correct_output_type_forward(model, inputs, checker) def test_with_list_forward(ragged_input, padded_input, list_input): for inputs in (ragged_input, padded_input, list_input): checker = get_data_checker(inputs) model = get_list_model() check_transform_produces_correct_output_type_forward(model, inputs, checker) def test_with_padded_forward(ragged_input, padded_input, list_input, padded_data_input): for inputs in (ragged_input, padded_input, list_input, padded_data_input): checker = get_data_checker(inputs) model = get_padded_model() check_transform_produces_correct_output_type_forward(model, inputs, checker) def test_with_ragged_forward(ragged_input, padded_input, list_input, ragged_data_input): for inputs in (ragged_input, padded_input, list_input, ragged_data_input): checker = get_data_checker(inputs) model = get_ragged_model() check_transform_produces_correct_output_type_forward(model, inputs, checker) def test_with_array_backward(ragged_input, padded_input, list_input, array_input): for inputs in (ragged_input, padded_input, list_input, array_input): checker = get_data_checker(inputs) model = get_array_model() check_transform_produces_correct_output_type_backward(model, inputs, checker) def test_with_list_backward(ragged_input, padded_input, list_input): for inputs in (ragged_input, padded_input, list_input): checker = get_data_checker(inputs) model = get_list_model() check_transform_produces_correct_output_type_backward(model, inputs, checker) def test_with_ragged_backward( ragged_input, padded_input, list_input, ragged_data_input ): for inputs in (ragged_input, padded_input, list_input, ragged_data_input): checker = get_data_checker(inputs) model = get_ragged_model() check_transform_produces_correct_output_type_backward(model, inputs, checker) def test_with_padded_backward( ragged_input, padded_input, list_input, padded_data_input ): for inputs in (ragged_input, padded_input, list_input, padded_data_input): checker = get_data_checker(inputs) model = get_padded_model() check_transform_produces_correct_output_type_backward(model, inputs, checker) def test_with_getitem(): data = ( numpy.asarray([[1, 2, 3, 4]], dtype="f"), numpy.asarray([[5, 6, 7, 8]], dtype="f"), ) model = with_getitem(1, Linear()) model.initialize(data, data) Y, backprop = model.begin_update(data) assert len(Y) == len(data) assert numpy.array_equal(Y[0], data[0]) # the other item stayed the same assert not numpy.array_equal(Y[1], data[1]) dX = backprop(Y) assert numpy.array_equal(dX[0], data[0]) assert not numpy.array_equal(dX[1], data[1]) thinc-release-v9.1.1/thinc/tests/model/000077500000000000000000000000001467064331700200155ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/model/__init__.py000066400000000000000000000000001467064331700221140ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/model/test_model.py000066400000000000000000000467161467064331700225440ustar00rootroot00000000000000import threading import time from collections import Counter import numpy import pytest from thinc.api import ( Adam, CupyOps, Dropout, Linear, Model, Relu, Shim, Softmax, chain, change_attr_values, concatenate, set_dropout_rate, use_ops, with_debug, wrap_model_recursive, ) from thinc.compat import has_cupy_gpu from ..util import make_tempdir @pytest.fixture def model_with_no_args(): return Linear() def create_model(name): return Model(name, lambda X: (X, lambda dY: dY)) def test_model_defaults_to_cpu(model_with_no_args): assert not isinstance(model_with_no_args.ops, CupyOps) def test_models_get_different_ids(model_with_no_args): model1 = Linear() model2 = Linear() assert model1.id != model2.id def test_model_init(): class MyShim(Shim): name = "testshim" model_a = create_model("a") model = Model( "test", lambda X: (X, lambda dY: dY), dims={"nI": 10, "nO": None}, params={"W": numpy.zeros((10,)), "b": None}, refs={"a": model_a, "b": None}, attrs={"foo": "bar"}, shims=[MyShim(None)], layers=[model_a, model_a], ) assert model.has_param("W") assert model.get_param("W").shape == (10,) assert model.has_param("b") is None with pytest.raises(KeyError): model.get_param("b") with pytest.raises(KeyError): model.get_param("X") model.set_param("X", numpy.zeros((10,))) assert model.has_param("X") assert model.get_param("X").shape == (10,) with model.use_params({(model.id, "X"): numpy.ones((10,))}): assert numpy.array_equal(model.get_param("X"), numpy.ones((10,))) assert numpy.array_equal(model.get_param("X"), numpy.zeros((10,))) assert not model.has_grad("W") assert not model.has_grad("xyz") with pytest.raises(KeyError): model.get_grad("b") model.set_param("W", model.ops.alloc1f(10)) model.set_grad("W", model.ops.alloc1f(10)) with pytest.raises(ValueError): model.inc_grad("W", numpy.zeros((5, 0))) assert model.has_dim("nI") assert model.get_dim("nI") == 10 with pytest.raises(KeyError): model.get_dim("xyz") with pytest.raises(ValueError): model.get_dim("nO") assert model.has_ref("a") assert model.get_ref("a").name == "a" assert not model.has_ref("xyz") with pytest.raises(KeyError): model.get_ref("xyz") assert model.has_ref("b") is None with pytest.raises(ValueError): model.get_ref("b") model.set_ref("c", model_a) assert model.has_ref("c") assert model.get_ref("c").name == "a" with pytest.raises(ValueError): model.set_ref("c", create_model("c")) assert "foo" in model.attrs assert "bar" not in model.attrs assert model.attrs["foo"] == "bar" with pytest.raises(KeyError): model.attrs["bar"] model.attrs["bar"] = "baz" model_copy = model.copy() assert model_copy.name == "test" def test_model_set_dim(): class MyShim(Shim): name = "testshim" model_a = create_model("a") model = Model( "test", lambda X: (X, lambda dY: dY), dims={"nI": 5, "nO": None}, params={"W": None, "b": None}, refs={"a": model_a, "b": None}, attrs={"foo": "bar"}, shims=[MyShim(None)], layers=[model_a, model_a], ) with pytest.raises(ValueError): model.set_dim("nI", 10) # force can be used before any parameters are set model.set_dim("nI", 10, force=True) model.set_param("W", model.ops.alloc1f(10)) model.set_grad("W", model.ops.alloc1f(10)) assert model.has_dim("nI") assert model.get_dim("nI") == 10 with pytest.raises(KeyError): model.set_dim("xyz", 20) with pytest.raises(ValueError): model.set_dim("nI", 20) # force can't be used after any parameter is set with pytest.raises(ValueError): model.set_dim("nI", 20, force=True) def test_param_names(): model = create_model("tmp") assert model.param_names == tuple() model.set_param("param1", None) assert model.param_names == ("param1",) model.set_param("param2", None) assert model.param_names == ("param1", "param2") def test_grad_names(): model = create_model("tmp") assert model.grad_names == tuple() model.set_param("param1", model.ops.alloc2f(4, 4)) model.set_grad("param1", model.ops.alloc2f(4, 4) + 1) assert model.grad_names == ("param1",) def test_dim_names(): model = Linear(5, 3) assert model.dim_names == ("nO", "nI") def test_model_set_reference(): parent = create_model("parent") child = create_model("child") grandchild = create_model("child") parent.layers.append(child) assert parent.ref_names == tuple() parent.set_ref("kid", child) assert parent.ref_names == ("kid",) assert parent.get_ref("kid") is child child.layers.append(grandchild) with pytest.raises(KeyError): parent.get_ref("grandkid") parent.set_ref("grandkid", grandchild) assert parent.get_ref("grandkid") is grandchild parent.remove_node(grandchild) assert grandchild not in child.layers assert not parent.has_ref("grandkind") def test_maybe_methods(): model = Linear(5) assert model.maybe_get_dim("nI") is None model.set_dim("nI", 4) assert model.maybe_get_dim("nI") == 4 assert model.maybe_get_ref("boo") is None assert model.maybe_get_param("W") is None model.initialize() assert model.maybe_get_param("W") is not None def test_model_can_save_to_disk(model_with_no_args): with make_tempdir() as path: model_with_no_args.to_disk(path / "thinc_model") def test_model_can_load_from_disk(model_with_no_args): with make_tempdir() as path: model_with_no_args.to_disk(path / "thinc_model") m2 = model_with_no_args.from_disk(path / "thinc_model") assert model_with_no_args.to_bytes() == m2.to_bytes() def test_model_can_roundtrip_with_path_subclass(model_with_no_args, pathy_fixture): path = pathy_fixture / "thinc_model" model_with_no_args.to_disk(path) m2 = model_with_no_args.from_disk(path) assert model_with_no_args.to_bytes() == m2.to_bytes() def test_change_attr_values(model_with_no_args): model = model_with_no_args model.name = "target" model.attrs["has_var"] = False change_attr_values(model, {"target": {"has_var": True, "error": True}}) assert model.attrs["has_var"] is True assert "error" not in model.attrs def test_set_dropout(): model = Dropout() assert model.attrs["dropout_rate"] == 0.0 set_dropout_rate(model, 0.2) assert model.attrs["dropout_rate"] == 0.2 def test_set_dropout_2(model_with_no_args): model = model_with_no_args model.name = "dropout" model.attrs["dropout_rate"] = 0.0 set_dropout_rate(model, 0.2) assert model.attrs["dropout_rate"] == 0.2 def test_bind_plus(): with Model.define_operators({"+": lambda a, b: (a.name, b.name)}): m = create_model(name="a") + create_model(name="b") assert m == ("a", "b") def test_plus_chain(): with Model.define_operators({"+": lambda a, b: a}): m = ( create_model(name="a") + create_model(name="b") + create_model(name="c") + create_model(name="d") ) assert m.name == "a" def test_overload_operators_in_subthread(): """Test we can create a model in a child thread with overloaded operators.""" # Worker1 will start and run, while worker 2 sleeps after Model.define_operators. # Without thread-safety, worker2 will find that its operator definitions # have been removed, causing an error. worker1 = threading.Thread(target=_overload_plus, args=("+", 0)) worker2 = threading.Thread(target=_overload_plus, args=("*", 1)) worker2.start() worker1.start() worker1.join() worker2.join() worker1 = threading.Thread(target=_overload_plus, args=("+", 1)) worker2 = threading.Thread(target=_overload_plus, args=("*", 0)) worker2.start() worker1.start() worker1.join() worker2.join() def _overload_plus(operator, sleep): m1 = create_model(name="a") m2 = create_model(name="b") with Model.define_operators({operator: lambda a, b: a.name + b.name}): time.sleep(sleep) if operator == "+": value = m1 + m2 else: value = m1 * m2 assert value == "ab" assert Model._context_operators.get() == {} def test_nested_operator_contexts(): m1 = create_model(name="a") m2 = create_model(name="b") assert Model._context_operators.get() == {} with Model.define_operators({"+": lambda a, b: a.name + b.name}): value = m1 + m2 with pytest.raises(TypeError): value = m1 * m2 with Model.define_operators({"*": lambda a, b: a.name + b.name}): with pytest.raises(TypeError): value = m1 + m2 value = m1 * m2 with Model.define_operators({"-": lambda a, b: a.name + b.name}): with pytest.raises(TypeError): value = m1 + m2 value = m1 - m2 with pytest.raises(TypeError): value = m1 + m2 value = m1 * m2 value = m1 + m2 with pytest.raises(TypeError): value = m1 * m2 assert value == "ab" assert Model._context_operators.get() == {} @pytest.mark.parametrize("op", "+ - * @ / // % ** << >> & ^ |".split()) def test_all_operators(op): m1 = Linear() m2 = Linear() with Model.define_operators({op: lambda a, b: a.name + b.name}): if op == "+": value = m1 + m2 else: with pytest.raises(TypeError): value = m1 + m2 if op == "-": value = m1 - m2 else: with pytest.raises(TypeError): value = m1 - m2 if op == "*": value = m1 * m2 else: with pytest.raises(TypeError): value = m1 * m2 if op == "@": value = m1.__matmul__(m2) # Be kind to Python 2... else: with pytest.raises(TypeError): value = m1.__matmul__(m2) if op == "/": value = m1 / m2 else: with pytest.raises(TypeError): value = m1 / m2 if op == "//": value = m1 // m2 else: with pytest.raises(TypeError): value = m1 // m2 if op == "^": value = m1 ^ m2 else: with pytest.raises(TypeError): value = m1 ^ m2 if op == "%": value = m1 % m2 else: with pytest.raises(TypeError): value = m1 % m2 if op == "**": value = m1**m2 else: with pytest.raises(TypeError): value = m1**m2 if op == "<<": value = m1 << m2 else: with pytest.raises(TypeError): value = m1 << m2 if op == ">>": value = m1 >> m2 else: with pytest.raises(TypeError): value = m1 >> m2 if op == "&": value = m1 & m2 else: with pytest.raises(TypeError): value = m1 & m2 if op == "^": value = m1 ^ m2 else: with pytest.raises(TypeError): value = m1 ^ m2 if op == "|": value = m1 | m2 else: with pytest.raises(TypeError): value = m1 | m2 # noqa: F841 assert Model._context_operators.get() == {} def test_unique_id_multithreading(): """Create a bunch of threads and assert they all get unique IDs""" list_of_ids = [] def get_model_id(id_list, index): id_list.append(create_model(name=f"worker{index}").id) counter = 0 while len(list_of_ids) < 1000: workers = [] for i in range(50): w = threading.Thread(target=get_model_id, args=(list_of_ids, counter)) workers.append(w) counter += 1 for w in workers: w.start() for w in workers: w.join() assert len(list_of_ids) == len(list(set(list_of_ids))) @pytest.mark.skipif(not has_cupy_gpu, reason="needs CuPy GPU") def test_model_gpu(): pytest.importorskip("ml_datasets") import ml_datasets with use_ops("cupy"): n_hidden = 32 dropout = 0.2 (train_X, train_Y), (dev_X, dev_Y) = ml_datasets.mnist() model = chain( Relu(nO=n_hidden, dropout=dropout), Relu(nO=n_hidden, dropout=dropout), Softmax(), ) # make sure the data is on the right device train_X = model.ops.asarray(train_X) train_Y = model.ops.asarray(train_Y) dev_X = model.ops.asarray(dev_X) dev_Y = model.ops.asarray(dev_Y) model.initialize(X=train_X[:5], Y=train_Y[:5]) optimizer = Adam(0.001) batch_size = 128 for i in range(2): batches = model.ops.multibatch(batch_size, train_X, train_Y, shuffle=True) for X, Y in batches: Yh, backprop = model.begin_update(X) backprop(Yh - Y) model.finish_update(optimizer) # Evaluate and print progress correct = 0 total = 0 for X, Y in model.ops.multibatch(batch_size, dev_X, dev_Y): Yh = model.predict(X) correct += (Yh.argmax(axis=1) == Y.argmax(axis=1)).sum() total += Yh.shape[0] def test_replace_node(): relu1 = Relu(5) relu2 = Relu(5) relu_chain = chain(relu1, relu2) relu1_debug = with_debug(relu1) debug = Model( "test", lambda X: (X, lambda dY: dY), layers=[relu1, relu2, relu1, relu_chain], refs={"relu1": relu1, "relu2": relu2, "relu3": relu1}, ) debug.replace_node(relu1, relu1_debug) assert debug.layers[0] == relu1_debug assert debug.layers[1] == relu2 assert debug.layers[2] == relu1_debug assert debug.get_ref("relu1") == relu1_debug assert debug.get_ref("relu2") == relu2 assert debug.get_ref("relu3") == relu1_debug # Check that nodes are replaced recursively assert debug.layers[3] == relu_chain assert debug.layers[3].layers[0] == relu1_debug assert debug.layers[3].layers[1] == relu2 def test_replace_node_with_indirect_node_ref(): # a # / \ # x b[y=y] # | | # y x # | # y def dummy_model(name, layers): return Model(name, lambda model, X, is_train: ..., layers=layers) y = dummy_model("y", []) x = dummy_model("x", [y]) y_debug = with_debug(y) b = dummy_model("b", [x]) b.set_ref("y", y) a = chain(x, b) a.name = "a" a.replace_node(y, y_debug) assert a.layers[0].layers[0] == y_debug assert a.layers[1].layers[0].layers[0] == y_debug assert a.layers[1].get_ref("y") == y_debug def test_with_debug(): pytest.importorskip("ml_datasets") import ml_datasets (train_X, train_Y), (dev_X, dev_Y) = ml_datasets.mnist() counts = Counter() def on_init(*_): counts["init"] += 1 def on_forward(*_): counts["forward"] += 1 def on_backprop(*_): counts["backprop"] += 1 relu = Relu() relu2 = with_debug( Relu(), on_init=on_init, on_forward=on_forward, on_backprop=on_backprop ) chained = chain(relu, relu2, relu2) chained.initialize(X=train_X[:5], Y=train_Y[:5]) _, backprop = chained(X=train_X[:5], is_train=False) # Not real loss gradients, but we don't care for testing. backprop(train_Y[:5]) # Four times forward, because initialization also applies forward for # validation. assert counts == {"init": 2, "forward": 4, "backprop": 2} def test_recursive_wrap(): def dummy_model(name, layers): return Model(name, lambda model, X, is_train: ..., layers=layers) # Check: # # * Recursion: chain -> relu # * Multiple sublayers: chain -> [relu, relu] relu = Relu(5) chained = chain(relu, relu) chained_debug = wrap_model_recursive( chained, lambda model: dummy_model(f"dummy({model.name})", [model]) ) assert chained_debug.name == "dummy(relu>>relu)" assert chained_debug.layers[0] is chained assert chained_debug.layers[0].layers[0].name == "dummy(relu)" assert chained_debug.layers[0].layers[0].layers[0] is relu assert chained_debug.layers[0].layers[1].name == "dummy(relu)" assert chained_debug.layers[0].layers[1].layers[0] is relu def test_recursive_double_wrap(): def dummy_model(name, layers): return Model(name, lambda model, X, is_train: ..., layers=layers) relu = Relu(5) chained = chain(relu, relu) concat = concatenate(chained, chained, relu) concat_wrapped = wrap_model_recursive( concat, lambda model: dummy_model(f"dummy({model.name})", [model]) ) n_debug = 0 for model in concat_wrapped.walk(): if model.name.startswith("dummy"): n_debug += 1 # There should be 3 unique dummy wrappers: # * Around concatenate. # * Around chain. # * Around relu. assert n_debug == 3 assert concat_wrapped.layers[0].layers[0].layers[0].layers[0].name == "dummy(relu)" assert concat_wrapped.layers[0].layers[0].layers[0].layers[1].name == "dummy(relu)" assert concat_wrapped.layers[0].layers[1].layers[0].layers[0].name == "dummy(relu)" assert concat_wrapped.layers[0].layers[1].layers[0].layers[1].name == "dummy(relu)" assert concat_wrapped.layers[0].layers[2].name == "dummy(relu)" def test_wrap_non_child_references(): relu = Relu(5) relu2 = Relu(5) chained = chain(relu, relu) chained2 = chain(relu2, chained) chained2.set_ref("relu", relu) # Fails in case non-child references cannot be set. wrap_model_recursive(chained2, with_debug) def test_walk_dfs(): relu = Relu(5) relu2 = Relu(5) inner_chain = chain(relu, relu2) chained = chain(inner_chain, inner_chain) assert list(chained.walk(order="dfs_pre")) == [chained, inner_chain, relu, relu2] assert list(chained.walk(order="dfs_post")) == [ relu, relu2, inner_chain, chained, ] def test_walk_bfs_post_order_fails(): relu = Relu(5) with pytest.raises(ValueError, match="Invalid order"): relu.walk(order="dfs_post_order") def test_model_copy_with_loop(): class MyShim(Shim): name = "testshim" def to_bytes(self): return test_replace_node_with_indirect_node_ref def from_bytes(self, bytes): pass model_a = create_model("a") working_shim = MyShim(None) layer = Model( "test", lambda X: (X, lambda dY: dY), dims={"nI": 5, "nO": 5}, params={"W": numpy.zeros((10,)), "b": None}, refs={"a": model_a, "b": None}, attrs={"foo": "bar"}, shims=[working_shim], layers=[model_a, model_a], ) layer2 = Model( "test2", lambda X: (X, lambda dY: dY), dims={"nI": 5, "nO": 5}, params={"W": numpy.zeros((10,)), "b": None}, refs={"a": model_a, "b": None}, attrs={"foo": "bar"}, shims=[working_shim], layers=[model_a, model_a], ) relu = Relu(5) model = chain(layer, relu, layer, layer2) model2 = model.copy() model.from_dict(model2.to_dict()) assert model2.name == "test>>relu>>test>>test2" assert model2.layers[0] == model2.layers[2] assert id(model2.layers[0].shims[0]) == id(model2.layers[3].shims[0]) thinc-release-v9.1.1/thinc/tests/model/test_validation.py000066400000000000000000000025521467064331700235640ustar00rootroot00000000000000import pytest from thinc.api import ( ParametricAttention, Relu, Softmax, chain, list2ragged, reduce_max, reduce_sum, with_ragged, ) from thinc.util import DataValidationError, data_validation def test_validation(): model = chain(Relu(10), Relu(10), with_ragged(reduce_max()), Softmax()) with data_validation(True): with pytest.raises(DataValidationError): model.initialize(X=model.ops.alloc2f(1, 10), Y=model.ops.alloc2f(1, 10)) with pytest.raises(DataValidationError): model.initialize(X=model.ops.alloc3f(1, 10, 1), Y=model.ops.alloc2f(1, 10)) with pytest.raises(DataValidationError): model.initialize(X=[model.ops.alloc2f(1, 10)], Y=model.ops.alloc2f(1, 10)) def test_validation_complex(): good_model = chain(list2ragged(), reduce_sum(), Relu(12, dropout=0.5), Relu(1)) X = [good_model.ops.xp.zeros((4, 75), dtype="f")] Y = good_model.ops.xp.zeros((1,), dtype="f") good_model.initialize(X, Y) good_model.predict(X) bad_model = chain( list2ragged(), reduce_sum(), Relu(12, dropout=0.5), # ERROR: Why can't I attach a Relu to an attention layer? ParametricAttention(12), Relu(1), ) with data_validation(True): with pytest.raises(DataValidationError): bad_model.initialize(X, Y) thinc-release-v9.1.1/thinc/tests/mypy/000077500000000000000000000000001467064331700177135ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/mypy/__init__.py000066400000000000000000000000001467064331700220120ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/mypy/configs/000077500000000000000000000000001467064331700213435ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/mypy/configs/mypy-default.ini000066400000000000000000000003031467064331700244600ustar00rootroot00000000000000[mypy] follow_imports = silent strict_optional = True warn_redundant_casts = True warn_unused_ignores = True # disallow_any_generics = True check_untyped_defs = True disallow_untyped_defs = True thinc-release-v9.1.1/thinc/tests/mypy/configs/mypy-plugin.ini000066400000000000000000000003311467064331700243330ustar00rootroot00000000000000[mypy] plugins = thinc.mypy follow_imports = silent strict_optional = True warn_redundant_casts = True warn_unused_ignores = True # disallow_any_generics = True check_untyped_defs = True disallow_untyped_defs = True thinc-release-v9.1.1/thinc/tests/mypy/modules/000077500000000000000000000000001467064331700213635ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/mypy/modules/__init__.py000066400000000000000000000000001467064331700234620ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/mypy/modules/fail_no_plugin.py000066400000000000000000000002471467064331700247250ustar00rootroot00000000000000from thinc.api import Relu, Softmax, add, chain, reduce_max bad_model = chain(Relu(10), reduce_max(), Softmax()) bad_model2 = add(Relu(10), reduce_max(), Softmax()) thinc-release-v9.1.1/thinc/tests/mypy/modules/fail_plugin.py000066400000000000000000000010651467064331700242300ustar00rootroot00000000000000from thinc.api import Relu, Softmax, add, chain, concatenate, reduce_max bad_model = chain(Relu(10), reduce_max(), Softmax()) bad_model2 = add(Relu(10), reduce_max(), Softmax()) bad_model_only_plugin = chain( Relu(10), Relu(10), Relu(10), Relu(10), reduce_max(), Softmax() ) bad_model_only_plugin2 = add( Relu(10), Relu(10), Relu(10), Relu(10), reduce_max(), Softmax() ) reveal_type(bad_model_only_plugin2) bad_model_only_plugin3 = concatenate( Relu(10), Relu(10), Relu(10), Relu(10), reduce_max(), Softmax() ) reveal_type(bad_model_only_plugin3) thinc-release-v9.1.1/thinc/tests/mypy/modules/success_no_plugin.py000066400000000000000000000006541467064331700254640ustar00rootroot00000000000000from thinc.api import Relu, Softmax, add, chain, reduce_max good_model = chain(Relu(10), Relu(10), Softmax()) reveal_type(good_model) good_model2 = add(Relu(10), Relu(10), Softmax()) reveal_type(good_model2) bad_model_undetected = chain(Relu(10), Relu(10), reduce_max(), Softmax()) reveal_type(bad_model_undetected) bad_model_undetected2 = add(Relu(10), Relu(10), reduce_max(), Softmax()) reveal_type(bad_model_undetected2) thinc-release-v9.1.1/thinc/tests/mypy/modules/success_plugin.py000066400000000000000000000014771467064331700247740ustar00rootroot00000000000000from typing import Any, TypeVar from thinc.api import Model, Relu, Softmax, add, chain, reduce_max good_model = chain(Relu(10), Relu(10), Softmax()) reveal_type(good_model) good_model2 = add(Relu(10), Relu(10), Softmax()) reveal_type(good_model2) bad_model_undetected = chain(Relu(10), Relu(10), Relu(10), Relu(10), Softmax()) reveal_type(bad_model_undetected) bad_model_undetected2 = add(Relu(10), Relu(10), Relu(10), Relu(10), Softmax()) reveal_type(bad_model_undetected2) def forward() -> None: pass OtherType = TypeVar("OtherType") def other_function( layer1: Model, layer2: Model, *layers: Model ) -> Model[Any, OtherType]: return Model("some_model", forward) non_combinator_model = other_function( Model("x", forward), Model("y", forward), Model("z", forward) ) reveal_type(non_combinator_model) thinc-release-v9.1.1/thinc/tests/mypy/outputs/000077500000000000000000000000001467064331700214365ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/mypy/outputs/fail-no-plugin.txt000066400000000000000000000001611467064331700250160ustar00rootroot000000000000003: error: Cannot infer type argument 2 of "chain" [misc] 5: error: Cannot infer type argument 1 of "add" [misc]thinc-release-v9.1.1/thinc/tests/mypy/outputs/fail-plugin.txt000066400000000000000000000045601467064331700244130ustar00rootroot000000000000003: error: Cannot infer type argument 2 of "chain" [misc] 3: error: Layer outputs type (thinc.types.Floats2d) but the next layer expects (thinc.types.Ragged) as an input [layer-mismatch-output] 3: error: Layer input type (thinc.types.Ragged) is not compatible with output (thinc.types.Floats2d) from previous layer [layer-mismatch-input] 5: error: Cannot infer type argument 1 of "add" [misc] 5: error: Layer input (thinc.types.Floats2d) not compatible with next layer input (thinc.types.Ragged) [layer-mismatch-input] 5: error: Layer input (thinc.types.Ragged) not compatible with previous layer input (thinc.types.Floats2d) [layer-mismatch-input] 5: error: Layer input (thinc.types.Ragged) not compatible with next layer input (thinc.types.Floats2d) [layer-mismatch-input] 5: error: Layer input (thinc.types.Floats2d) not compatible with previous layer input (thinc.types.Ragged) [layer-mismatch-input] 8: error: Layer outputs type (thinc.types.Floats2d) but the next layer expects (thinc.types.Ragged) as an input [layer-mismatch-output] 8: error: Layer input type (thinc.types.Ragged) is not compatible with output (thinc.types.Floats2d) from previous layer [layer-mismatch-input] 12: error: Layer input (thinc.types.Floats2d) not compatible with next layer input (thinc.types.Ragged) [layer-mismatch-input] 12: error: Layer input (thinc.types.Ragged) not compatible with previous layer input (thinc.types.Floats2d) [layer-mismatch-input] 12: error: Layer input (thinc.types.Ragged) not compatible with next layer input (thinc.types.Floats2d) [layer-mismatch-input] 12: error: Layer input (thinc.types.Floats2d) not compatible with previous layer input (thinc.types.Ragged) [layer-mismatch-input] 14: note: Revealed type is "thinc.model.Model[thinc.types.Floats2d, thinc.types.Floats2d]" 17: error: Layer input (thinc.types.Floats2d) not compatible with next layer input (thinc.types.Ragged) [layer-mismatch-input] 17: error: Layer input (thinc.types.Ragged) not compatible with previous layer input (thinc.types.Floats2d) [layer-mismatch-input] 17: error: Layer input (thinc.types.Ragged) not compatible with next layer input (thinc.types.Floats2d) [layer-mismatch-input] 17: error: Layer input (thinc.types.Floats2d) not compatible with previous layer input (thinc.types.Ragged) [layer-mismatch-input] 20: note: Revealed type is "thinc.model.Model[thinc.types.Floats2d, thinc.types.Floats2d]" thinc-release-v9.1.1/thinc/tests/mypy/outputs/success-no-plugin.txt000066400000000000000000000011001467064331700255450ustar00rootroot000000000000003: error: Need type annotation for "good_model" [var-annotated] 4: note: Revealed type is "thinc.model.Model[thinc.types.Floats2d, Any]" 6: error: Need type annotation for "good_model2" [var-annotated] 7: note: Revealed type is "thinc.model.Model[thinc.types.Floats2d, Any]" 9: error: Need type annotation for "bad_model_undetected" [var-annotated] 10: note: Revealed type is "thinc.model.Model[thinc.types.Floats2d, Any]" 12: error: Need type annotation for "bad_model_undetected2" [var-annotated] 13: note: Revealed type is "thinc.model.Model[thinc.types.Floats2d, Any]"thinc-release-v9.1.1/thinc/tests/mypy/outputs/success-plugin.txt000066400000000000000000000007561467064331700251530ustar00rootroot000000000000006: note: Revealed type is "thinc.model.Model[thinc.types.Floats2d, thinc.types.Floats2d]" 9: note: Revealed type is "thinc.model.Model[thinc.types.Floats2d, thinc.types.Floats2d]" 12: note: Revealed type is "thinc.model.Model[thinc.types.Floats2d, thinc.types.Floats2d]" 15: note: Revealed type is "thinc.model.Model[thinc.types.Floats2d, thinc.types.Floats2d]" 31: error: Need type annotation for "non_combinator_model" [var-annotated] 34: note: Revealed type is "thinc.model.Model[Any, Any]"thinc-release-v9.1.1/thinc/tests/mypy/test_mypy.py000066400000000000000000000060001467064331700223160ustar00rootroot00000000000000import os import re import shutil import sys from pathlib import Path import pytest mypy = pytest.importorskip("mypy") # You can change the following variable to True during development to overwrite expected output with generated output GENERATE = False cases = [ ("mypy-plugin.ini", "success_plugin.py", "success-plugin.txt"), ("mypy-plugin.ini", "fail_plugin.py", "fail-plugin.txt"), ("mypy-default.ini", "success_no_plugin.py", "success-no-plugin.txt"), ("mypy-default.ini", "fail_no_plugin.py", "fail-no-plugin.txt"), ] @pytest.mark.skipif( mypy.__file__.endswith(".py"), reason="Non-compiled mypy is too slow" ) @pytest.mark.parametrize("config_filename,python_filename,output_filename", cases) def test_mypy_results( config_filename, python_filename, output_filename, tmpdir, monkeypatch ): from mypy import api as mypy_api os.chdir(tmpdir) root_dir = Path(__file__).parent thinc_root_dir = Path(__file__).parent.parent.parent.parent if "--pyargs" not in sys.argv: monkeypatch.setenv("MYPYPATH", str(thinc_root_dir)) tmpdir_path = Path(tmpdir) full_config_path: Path = root_dir / f"configs/{config_filename}" full_module_path: Path = root_dir / f"modules/{python_filename}" full_output_path: Path = root_dir / f"outputs/{output_filename}" full_tmp_config_path: Path = tmpdir_path / config_filename full_tmp_module_path: Path = tmpdir_path / python_filename shutil.copy(str(full_config_path), tmpdir) shutil.copy(str(full_module_path), tmpdir) expected_out = "" expected_err = "" expected_returncode = 1 expected_out = full_output_path.read_text() # Specifying a different cache dir for each configuration dramatically speeds up subsequent execution # It also prevents cache-invalidation-related bugs in the tests cache_dir = tmpdir_path / f".mypy_cache/test-{config_filename[:-4]}" command = [ str(full_tmp_module_path), "--config-file", str(full_tmp_config_path), "--cache-dir", str(cache_dir), "--show-error-codes", ] print( f"\nExecuting: mypy {' '.join(command)}" ) # makes it easier to debug as necessary actual_result = mypy_api.run(command) actual_out, actual_err, actual_returncode = actual_result # Need to strip filenames due to differences in formatting by OS actual_out = "\n".join( [".py:".join(line.split(".py:")[1:]) for line in actual_out.split("\n") if line] ).strip() actual_out = re.sub(r"\n\s*\n", r"\n", actual_out) if GENERATE and output_filename is not None: full_output_path.write_text(actual_out) else: assert actual_out.strip() == expected_out.strip(), actual_out assert actual_err == expected_err assert actual_returncode == expected_returncode @pytest.mark.skipif( mypy.__file__.endswith(".py"), reason="Non-compiled mypy is too slow" ) def test_generation_is_disabled(): """ Makes sure we don't accidentally leave generation on """ assert not GENERATE thinc-release-v9.1.1/thinc/tests/regression/000077500000000000000000000000001467064331700210755ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/regression/__init__.py000066400000000000000000000000001467064331700231740ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/regression/issue519/000077500000000000000000000000001467064331700224645ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/regression/issue519/__init__.py000066400000000000000000000000001467064331700245630ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/regression/issue519/program.py000066400000000000000000000007401467064331700245060ustar00rootroot00000000000000from thinc.api import Relu, Softmax, chain, concatenate from thinc.model import Model from thinc.types import Floats2d n_hidden = 32 dropout = 0.2 model1: Model[Floats2d, Floats2d] = chain( Relu(nO=n_hidden, dropout=dropout), Relu(nO=n_hidden, dropout=dropout), Softmax() ) model2: Model[Floats2d, Floats2d] = chain( Relu(nO=n_hidden, dropout=dropout), Relu(nO=n_hidden, dropout=dropout), Softmax() ) model3: Model[Floats2d, Floats2d] = concatenate(*[model1, model2]) thinc-release-v9.1.1/thinc/tests/regression/issue519/test_issue519.py000066400000000000000000000014611467064331700254660ustar00rootroot00000000000000import subprocess import sys try: import importlib.resources as importlib_resources except ImportError: import importlib_resources # type: ignore import pytest @pytest.mark.slow def test_issue519(): """ Test ability of Thinc mypy plugin to handle variadic arguments. This test can take up to 45 seconds, and is thus marked as slow. """ # Determine the name of the parent module (which contains the test program) parent_module_name = __name__[: __name__.rfind(".")] # Load test program that calls a Thinc API with variadic arguments program_text = importlib_resources.read_text(parent_module_name, "program.py") # Ask Mypy to type-check the loaded program text subprocess.run( [sys.executable, "-m", "mypy", "--command", program_text], check=True ) thinc-release-v9.1.1/thinc/tests/regression/test_issue208.py000066400000000000000000000005101467064331700240640ustar00rootroot00000000000000from thinc.api import Linear, chain def test_issue208(): """Test issue that was caused by trying to flatten nested chains.""" layer1 = Linear(nO=9, nI=3) layer2 = Linear(nO=12, nI=9) layer3 = Linear(nO=5, nI=12) model = chain(layer1, chain(layer2, layer3)).initialize() assert model.get_dim("nO") == 5 thinc-release-v9.1.1/thinc/tests/regression/test_issue564.py000066400000000000000000000010101467064331700240650ustar00rootroot00000000000000import pytest from thinc.api import CupyOps from thinc.compat import has_torch, has_torch_cuda_gpu @pytest.mark.skipif(not has_torch, reason="needs PyTorch") @pytest.mark.skipif(not has_torch_cuda_gpu, reason="needs a GPU") def test_issue564(): import torch if CupyOps.xp is not None: ops = CupyOps() t = torch.zeros((10, 2)).cuda() a = ops.asarray(t) assert a.shape == t.shape ops.xp.testing.assert_allclose( a, ops.alloc2f(10, 2), ) thinc-release-v9.1.1/thinc/tests/shims/000077500000000000000000000000001467064331700200405ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/shims/__init__.py000066400000000000000000000000001467064331700221370ustar00rootroot00000000000000thinc-release-v9.1.1/thinc/tests/shims/test_pytorch_grad_scaler.py000066400000000000000000000064251467064331700254760ustar00rootroot00000000000000import pytest from hypothesis import given, settings from hypothesis.strategies import lists, one_of, tuples from thinc.api import PyTorchGradScaler from thinc.compat import has_torch, has_torch_amp, has_torch_cuda_gpu, torch from thinc.util import is_torch_array from ..strategies import ndarrays def tensors(): return ndarrays().map(lambda a: torch.tensor(a).cuda()) @pytest.mark.skipif(not has_torch, reason="needs PyTorch") @pytest.mark.skipif(not has_torch_cuda_gpu, reason="needs a GPU") @pytest.mark.skipif( not has_torch_amp, reason="requires PyTorch with mixed-precision support" ) @given(X=one_of(tensors(), lists(tensors()), tuples(tensors()))) @settings(deadline=None) def test_scale_random_inputs(X): import torch device_id = torch.cuda.current_device() scaler = PyTorchGradScaler(enabled=True) scaler.to_(device_id) if is_torch_array(X): assert torch.allclose(scaler.scale(X), X * 2.0**16) else: scaled1 = scaler.scale(X) scaled2 = [t * 2.0**16 for t in X] for t1, t2 in zip(scaled1, scaled2): assert torch.allclose(t1, t2) @pytest.mark.skipif(not has_torch, reason="needs PyTorch") @pytest.mark.skipif(not has_torch_cuda_gpu, reason="needs a GPU") @pytest.mark.skipif( not has_torch_amp, reason="requires PyTorch with mixed-precision support" ) def test_grad_scaler(): import torch device_id = torch.cuda.current_device() scaler = PyTorchGradScaler(enabled=True) scaler.to_(device_id) # Test that scaling works as expected. t = torch.tensor([1.0], device=device_id) assert scaler.scale([torch.tensor([1.0], device=device_id)]) == [ torch.tensor([2.0**16], device=device_id) ] assert scaler.scale(torch.tensor([1.0], device=device_id)) == torch.tensor( [2.0**16], device=device_id ) with pytest.raises(ValueError): scaler.scale("bogus") with pytest.raises(ValueError): scaler.scale(42) # Test infinity detection. g = [ torch.tensor([2.0**16], device=device_id), torch.tensor([float("Inf")], device=device_id), ] # Check that infinity was found. assert scaler.unscale(g) # Check whether unscale was successful. assert g[0] == torch.tensor([1.0]).cuda() scaler.update() # Since infinity was found, the scale should be halved from 2**16 # to 2**15 for the next step. assert scaler.scale([torch.tensor([1.0], device=device_id)]) == [ torch.tensor([2.0**15], device=device_id) ] @pytest.mark.skipif(not has_torch, reason="needs PyTorch") @pytest.mark.skipif( has_torch_amp, reason="needs PyTorch without gradient scaling support" ) def test_raises_on_old_pytorch(): import torch scaler = PyTorchGradScaler(enabled=True) with pytest.raises(ValueError, match=r"not supported.*1.9.0"): scaler.scale([torch.tensor([1.0], device="cpu")]) @pytest.mark.skipif(not has_torch, reason="needs PyTorch") @pytest.mark.skipif( not has_torch_amp, reason="needs PyTorch with gradient scaling support" ) def test_raises_with_cpu_tensor(): import torch scaler = PyTorchGradScaler(enabled=True) with pytest.raises( ValueError, match=r"Gradient scaling is only supported for CUDA tensors." ): scaler.scale([torch.tensor([1.0], device="cpu")]) thinc-release-v9.1.1/thinc/tests/strategies.py000066400000000000000000000070031467064331700214410ustar00rootroot00000000000000import numpy from hypothesis.extra.numpy import arrays from hypothesis.strategies import floats, integers, just, tuples from thinc.api import Linear, NumpyOps def get_ops(): return NumpyOps() def get_model(W_values, b_values): model = Linear(W_values.shape[0], W_values.shape[1], ops=NumpyOps()) model.initialize() model.set_param("W", W_values) model.set_param("b", b_values) return model def get_output(input_, W_values, b_values): return numpy.einsum("oi,bi->bo", W_values, input_) + b_values def get_input(nr_batch, nr_in): ops = NumpyOps() return ops.alloc2f(nr_batch, nr_in) def lengths(lo=1, hi=10): return integers(min_value=lo, max_value=hi) def shapes(min_rows=1, max_rows=100, min_cols=1, max_cols=100): return tuples(lengths(lo=min_rows, hi=max_rows), lengths(lo=min_cols, hi=max_cols)) def ndarrays_of_shape(shape, lo=-10.0, hi=10.0, dtype="float32", width=32): if dtype.startswith("float"): return arrays( dtype, shape=shape, elements=floats(min_value=lo, max_value=hi, width=width) ) else: return arrays(dtype, shape=shape, elements=integers(min_value=lo, max_value=hi)) def ndarrays(min_len=0, max_len=10, min_val=-10.0, max_val=10.0): return lengths(lo=1, hi=2).flatmap( lambda n: ndarrays_of_shape(n, lo=min_val, hi=max_val) ) def arrays_BI(min_B=1, max_B=10, min_I=1, max_I=100): shapes = tuples(lengths(lo=min_B, hi=max_B), lengths(lo=min_I, hi=max_I)) return shapes.flatmap(ndarrays_of_shape) def arrays_BOP(min_B=1, max_B=10, min_O=1, max_O=100, min_P=1, max_P=5): shapes = tuples( lengths(lo=min_B, hi=max_B), lengths(lo=min_O, hi=max_O), lengths(lo=min_P, hi=max_P), ) return shapes.flatmap(ndarrays_of_shape) def arrays_BOP_BO(min_B=1, max_B=10, min_O=1, max_O=100, min_P=1, max_P=5): shapes = tuples( lengths(lo=min_B, hi=max_B), lengths(lo=min_O, hi=max_O), lengths(lo=min_P, hi=max_P), ) return shapes.flatmap( lambda BOP: tuples(ndarrays_of_shape(BOP), ndarrays_of_shape(BOP[:-1])) ) def arrays_BI_BO(min_B=1, max_B=10, min_I=1, max_I=100, min_O=1, max_O=100): shapes = tuples( lengths(lo=min_B, hi=max_B), lengths(lo=min_I, hi=max_I), lengths(lo=min_O, hi=max_O), ) return shapes.flatmap( lambda BIO: tuples( ndarrays_of_shape((BIO[0], BIO[1])), ndarrays_of_shape((BIO[0], BIO[2])) ) ) def arrays_OI_O_BI( min_batch=1, max_batch=16, min_out=1, max_out=16, min_in=1, max_in=16 ): shapes = tuples( lengths(lo=min_batch, hi=max_batch), lengths(lo=min_in, hi=max_out), lengths(lo=min_in, hi=max_in), ) def W_b_inputs(shape): batch_size, nr_out, nr_in = shape W = ndarrays_of_shape((nr_out, nr_in)) b = ndarrays_of_shape((nr_out,)) input_ = ndarrays_of_shape((batch_size, nr_in)) return tuples(W, b, input_) return shapes.flatmap(W_b_inputs) def arrays_OPFI_BI_lengths(max_B=5, max_P=3, max_F=5, max_I=8): shapes = tuples( lengths(hi=max_B), lengths(hi=max_P), lengths(hi=max_F), lengths(hi=max_I), arrays("int32", shape=(5,), elements=integers(min_value=1, max_value=10)), ) strat = shapes.flatmap( lambda opfi_lengths: tuples( ndarrays_of_shape(opfi_lengths[:-1]), ndarrays_of_shape((sum(opfi_lengths[-1]), opfi_lengths[-2])), just(opfi_lengths[-1]), ) ) return strat thinc-release-v9.1.1/thinc/tests/test_config.py000066400000000000000000000133111467064331700215720ustar00rootroot00000000000000import inspect import pickle from types import GeneratorType from typing import Any, Callable, Dict, Iterable, List, Optional, Union import catalogue import numpy import pytest try: from pydantic.v1 import BaseModel, PositiveInt, StrictBool, StrictFloat, constr except ImportError: from pydantic import BaseModel, PositiveInt, StrictBool, StrictFloat, constr # type: ignore import thinc.config from thinc.api import Config, Model, NumpyOps, RAdam from thinc.config import ConfigValidationError from thinc.types import Generator, Ragged from thinc.util import partial from .util import make_tempdir EXAMPLE_CONFIG = """ [optimizer] @optimizers = "Adam.v1" beta1 = 0.9 beta2 = 0.999 use_averages = true [optimizer.learn_rate] @schedules = "warmup_linear.v1" initial_rate = 0.1 warmup_steps = 10000 total_steps = 100000 [pipeline] [pipeline.parser] name = "parser" factory = "parser" [pipeline.parser.model] @layers = "spacy.ParserModel.v1" hidden_depth = 1 hidden_width = 64 token_vector_width = 128 [pipeline.parser.model.tok2vec] @layers = "Tok2Vec.v1" width = ${pipeline.parser.model:token_vector_width} [pipeline.parser.model.tok2vec.embed] @layers = "spacy.MultiFeatureHashEmbed.v1" width = ${pipeline.parser.model.tok2vec:width} [pipeline.parser.model.tok2vec.embed.hidden] @layers = "MLP.v1" depth = 1 pieces = 3 layer_norm = true outputs = ${pipeline.parser.model.tok2vec.embed:width} [pipeline.parser.model.tok2vec.encode] @layers = "spacy.MaxoutWindowEncoder.v1" depth = 4 pieces = 3 window_size = 1 [pipeline.parser.model.lower] @layers = "spacy.ParserLower.v1" [pipeline.parser.model.upper] @layers = "thinc.Linear.v1" """ OPTIMIZER_CFG = """ [optimizer] @optimizers = "Adam.v1" beta1 = 0.9 beta2 = 0.999 use_averages = true [optimizer.learn_rate] @schedules = "warmup_linear.v1" initial_rate = 0.1 warmup_steps = 10000 total_steps = 100000 """ class my_registry(thinc.config.registry): cats = catalogue.create("thinc", "tests", "cats", entry_points=False) class HelloIntsSchema(BaseModel): hello: int world: int class Config: extra = "forbid" class DefaultsSchema(BaseModel): required: int optional: str = "default value" class Config: extra = "forbid" class ComplexSchema(BaseModel): outer_req: int outer_opt: str = "default value" level2_req: HelloIntsSchema level2_opt: DefaultsSchema = DefaultsSchema(required=1) @my_registry.cats.register("catsie.v1") def catsie_v1(evil: StrictBool, cute: bool = True) -> str: if evil: return "scratch!" else: return "meow" @my_registry.cats.register("catsie.v2") def catsie_v2(evil: StrictBool, cute: bool = True, cute_level: int = 1) -> str: if evil: return "scratch!" else: if cute_level > 2: return "meow <3" return "meow" good_catsie = {"@cats": "catsie.v1", "evil": False, "cute": True} ok_catsie = {"@cats": "catsie.v1", "evil": False, "cute": False} bad_catsie = {"@cats": "catsie.v1", "evil": True, "cute": True} worst_catsie = {"@cats": "catsie.v1", "evil": True, "cute": False} def test_make_config_positional_args_dicts(): cfg = { "hyper_params": {"n_hidden": 512, "dropout": 0.2, "learn_rate": 0.001}, "model": { "@layers": "chain.v1", "*": { "relu1": {"@layers": "Relu.v1", "nO": 512, "dropout": 0.2}, "relu2": {"@layers": "Relu.v1", "nO": 512, "dropout": 0.2}, "softmax": {"@layers": "Softmax.v1"}, }, }, "optimizer": {"@optimizers": "Adam.v1", "learn_rate": 0.001}, } resolved = my_registry.resolve(cfg) model = resolved["model"] X = numpy.ones((784, 1), dtype="f") model.initialize(X=X, Y=numpy.zeros((784, 1), dtype="f")) model.begin_update(X) model.finish_update(resolved["optimizer"]) def test_objects_from_config(): config = { "optimizer": { "@optimizers": "my_cool_optimizer.v1", "beta1": 0.2, "learn_rate": { "@schedules": "my_cool_repetitive_schedule.v1", "base_rate": 0.001, "repeat": 4, }, } } @thinc.registry.optimizers.register("my_cool_optimizer.v1") def make_my_optimizer(learn_rate: List[float], beta1: float): return RAdam(learn_rate, beta1=beta1) @thinc.registry.schedules("my_cool_repetitive_schedule.v1") def decaying(base_rate: float, repeat: int) -> List[float]: return repeat * [base_rate] optimizer = my_registry.resolve(config)["optimizer"] assert optimizer.b1(step=optimizer._step, key=(0, "")) == 0.2 assert optimizer.learn_rate(step=optimizer._step, key=(0, "")) == 0.001 def test_handle_generic_model_type(): """Test that validation can handle checks against arbitrary generic types in function argument annotations.""" @my_registry.layers("my_transform.v1") def my_transform(model: Model[int, int]): model.name = "transformed_model" return model cfg = {"@layers": "my_transform.v1", "model": {"@layers": "Linear.v1"}} model = my_registry.resolve({"test": cfg})["test"] assert isinstance(model, Model) assert model.name == "transformed_model" def test_arg_order_is_preserved(): str_cfg = """ [model] [model.chain] @layers = "chain.v1" [model.chain.*.hashembed] @layers = "HashEmbed.v1" nO = 8 nV = 8 [model.chain.*.expand_window] @layers = "expand_window.v1" window_size = 1 """ cfg = Config().from_str(str_cfg) resolved = my_registry.resolve(cfg) model = resolved["model"]["chain"] # Fails when arguments are sorted, because expand_window # is sorted before hashembed. assert model.name == "hashembed>>expand_window" thinc-release-v9.1.1/thinc/tests/test_examples.py000066400000000000000000000033531467064331700221500ustar00rootroot00000000000000import os from pathlib import Path import pytest @pytest.fixture def test_files(nb_file): pytest.importorskip("nbconvert", exc_type=ImportError) pytest.importorskip("nbformat") import nbconvert import nbformat from nbconvert.preprocessors import ExecutePreprocessor if not Path(nb_file).exists(): return kernel_name = os.environ.get("NOTEBOOK_KERNEL", "python3") with open(nb_file) as f: nb = nbformat.read(f, as_version=4) proc = ExecutePreprocessor(timeout=600, kernel_name=kernel_name) proc.allow_errors = True proc.preprocess(nb, {"metadata": {"path": "/"}}) cells_with_outputs = [c for c in nb.cells if "outputs" in c] for cell in cells_with_outputs: for output in cell["outputs"]: if output.output_type == "error": for l in output.traceback: print(l) raise Exception(f"{output.ename}: {output.evalue}") @pytest.mark.parametrize( "nb_file", ( "examples/01_intro_model_definition_methods.ipynb", "examples/05_benchmarking_layers.ipynb", ), ) def test_ipython_notebooks(test_files: None): ... @pytest.mark.skip(reason="these notebooks need special software or hardware") @pytest.mark.parametrize( "nb_file", ( "examples/00_intro_to_thinc.ipynb", "examples/02_transformers_tagger_bert.ipynb", "examples/03_pos_tagger_basic_cnn.ipynb", "examples/03_textcat_basic_neural_bow.ipynb", "examples/04_configure_gpu_memory.ipynb", "examples/04_parallel_training_ray.ipynb", "examples/05_visualizing_models.ipynb", "examples/06_predicting_like_terms.ipynb", ), ) def test_ipython_notebooks_slow(test_files: None): ... thinc-release-v9.1.1/thinc/tests/test_import__all__.py000066400000000000000000000034101467064331700231230ustar00rootroot00000000000000import ast import importlib from collections import namedtuple from typing import List, Tuple import pytest _Import = namedtuple("_Import", ["module", "name", "alias"]) def get_imports(path: str) -> Tuple[_Import, ...]: """Parse Python file at path, retrieve import statements. Adapted from https://stackoverflow.com/a/9049549. path (str): Path to Python file. RETURNS (Tuple[_Import]): All imports found in file at path. """ with open(path) as fh: root = ast.parse(fh.read(), path) imports: List[_Import] = [] for node in ast.walk(root): if isinstance(node, ast.Import): module: List[str] = [] elif isinstance(node, ast.ImportFrom) and node.module: module = node.module.split(".") else: continue assert isinstance(node, (ast.Import, ast.ImportFrom)) imports.extend( [_Import(module, n.name.split("."), n.asname) for n in node.names] ) return tuple(imports) @pytest.mark.parametrize("module_name", ["thinc.api", "thinc.shims", "thinc.layers"]) def test_import_reexport_equivalency(module_name: str): """Tests whether a module's __all__ is equivalent to its imports. This assumes that this module is supposed to re-export all imported values. module_name (str): Module to load. """ mod = importlib.import_module(module_name) assert set(mod.__all__) == { k for k in set(n for i in get_imports(str(mod.__file__)) for n in i.name) if ( # Ignore all values prefixed with _, as we expect those not to be re-exported. # However, __version__ should be reexported in thinc/__init__.py. (not k.startswith("_") or module_name == "thinc" and k == "__version__") ) } thinc-release-v9.1.1/thinc/tests/test_indexing.py000066400000000000000000000035501467064331700221360ustar00rootroot00000000000000import numpy import pytest from numpy.testing import assert_allclose from thinc.types import Pairs, Ragged @pytest.fixture def ragged(): data = numpy.zeros((20, 4), dtype="f") lengths = numpy.array([4, 2, 8, 1, 4], dtype="i") data[0] = 0 data[1] = 1 data[2] = 2 data[3] = 3 data[4] = 4 data[5] = 5 return Ragged(data, lengths) def test_ragged_empty(): data = numpy.zeros((0, 4), dtype="f") lengths = numpy.array([], dtype="i") ragged = Ragged(data, lengths) assert_allclose(ragged[0:0].data, ragged.data) assert_allclose(ragged[0:0].lengths, ragged.lengths) assert_allclose(ragged[0:2].data, ragged.data) assert_allclose(ragged[0:2].lengths, ragged.lengths) assert_allclose(ragged[1:2].data, ragged.data) assert_allclose(ragged[1:2].lengths, ragged.lengths) def test_ragged_starts_ends(ragged): starts = ragged._get_starts() ends = ragged._get_ends() assert list(starts) == [0, 4, 6, 14, 15] assert list(ends) == [4, 6, 14, 15, 19] def test_ragged_simple_index(ragged, i=1): r = ragged[i] assert_allclose(r.data, ragged.data[4:6]) assert_allclose(r.lengths, ragged.lengths[i : i + 1]) def test_ragged_slice_index(ragged, start=0, end=2): r = ragged[start:end] size = ragged.lengths[start:end].sum() assert r.data.shape == (size, r.data.shape[1]) assert_allclose(r.lengths, ragged.lengths[start:end]) def test_ragged_array_index(ragged): arr = numpy.array([2, 1, 4], dtype="i") r = ragged[arr] assert r.data.shape[0] == ragged.lengths[arr].sum() def test_pairs_arrays(): one = numpy.zeros((128, 45), dtype="f") two = numpy.zeros((128, 12), dtype="f") pairs = Pairs(one, two) assert pairs[:2].one.shape == (2, 45) assert pairs[0].two.shape == (12,) assert pairs[-1:].one.shape == (1, 45) assert pairs[-1:].two.shape == (1, 12) thinc-release-v9.1.1/thinc/tests/test_initializers.py000066400000000000000000000017341467064331700230410ustar00rootroot00000000000000import numpy import pytest from thinc import registry from thinc.api import ( NumpyOps, glorot_uniform_init, normal_init, uniform_init, zero_init, ) @pytest.mark.parametrize( "init_func", [glorot_uniform_init, zero_init, uniform_init, normal_init] ) def test_initializer_func_setup(init_func): ops = NumpyOps() data = numpy.ndarray([1, 2, 3, 4], dtype="f") result = init_func(ops, data.shape) assert not numpy.array_equal(data, result) @pytest.mark.parametrize( "name,kwargs", [ ("glorot_uniform_init.v1", {}), ("zero_init.v1", {}), ("uniform_init.v1", {"lo": -0.5, "hi": 0.5}), ("normal_init.v1", {"mean": 0.1}), ], ) def test_initializer_from_config(name, kwargs): """Test that initializers are loaded and configured correctly from registry (as partials).""" cfg = {"test": {"@initializers": name, **kwargs}} func = registry.resolve(cfg)["test"] func(NumpyOps(), (1, 2, 3, 4)) thinc-release-v9.1.1/thinc/tests/test_loss.py000066400000000000000000000274631467064331700213220ustar00rootroot00000000000000import numpy import pytest from thinc import registry from thinc.api import ( CategoricalCrossentropy, CosineDistance, L2Distance, SequenceCategoricalCrossentropy, ) # some simple arrays scores0 = numpy.zeros((3, 3), dtype="f") labels0 = numpy.asarray([0, 1, 1], dtype="i") # a few more diverse ones to test realistic values guesses1 = numpy.asarray([[0.1, 0.5, 0.6], [0.4, 0.6, 0.3], [1, 1, 1], [0, 0, 0]]) labels1 = numpy.asarray([2, 1, 0, 2]) labels1_full = numpy.asarray([[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 0, 1]]) labels1_strings = ["C", "B", "A", "C"] guesses2 = numpy.asarray([[0.2, 0.3, 0.0]]) labels2 = numpy.asarray([1]) labels2_strings = ["B"] eps = 0.0001 def test_loss(): d_scores = CategoricalCrossentropy().get_grad(scores0, labels0) assert d_scores.dtype == "float32" assert d_scores.shape == scores0.shape d_scores = SequenceCategoricalCrossentropy().get_grad([scores0], [labels0]) assert d_scores[0].dtype == "float32" assert d_scores[0].shape == scores0.shape assert SequenceCategoricalCrossentropy().get_grad([], []) == [] @pytest.mark.parametrize( "dist", [CategoricalCrossentropy(), CosineDistance(ignore_zeros=True), L2Distance()] ) @pytest.mark.parametrize("vect", [scores0, guesses1, guesses2]) def test_equality(dist, vect): assert int(dist.get_grad(vect, vect)[0][0]) == pytest.approx(0, eps) assert dist.get_loss(vect, vect) == pytest.approx(0, eps) @pytest.mark.parametrize( "guesses, labels", [(guesses1, labels1), (guesses1, labels1_full)] ) def test_categorical_crossentropy(guesses, labels): d_scores = CategoricalCrossentropy(normalize=True).get_grad(guesses, labels) assert d_scores.shape == guesses.shape # The normalization divides the difference (e.g. 0.4) by the number of vectors (4) assert d_scores[1][0] == pytest.approx(0.1, eps) assert d_scores[1][1] == pytest.approx(-0.1, eps) # The third vector predicted all labels, but only the first one was correct assert d_scores[2][0] == pytest.approx(0, eps) assert d_scores[2][1] == pytest.approx(0.25, eps) assert d_scores[2][2] == pytest.approx(0.25, eps) # The fourth vector predicted no labels but should have predicted the last one assert d_scores[3][0] == pytest.approx(0, eps) assert d_scores[3][1] == pytest.approx(0, eps) assert d_scores[3][2] == pytest.approx(-0.25, eps) loss = CategoricalCrossentropy(normalize=True).get_loss(guesses, labels) assert loss == pytest.approx(0.239375, eps) def test_crossentropy_incorrect_scores_targets(): labels = numpy.asarray([2]) guesses_neg = numpy.asarray([[-0.1, 0.5, 0.6]]) with pytest.raises(ValueError, match=r"Cannot calculate.*guesses"): CategoricalCrossentropy(normalize=True).get_grad(guesses_neg, labels) guesses_larger_than_one = numpy.asarray([[1.1, 0.5, 0.6]]) with pytest.raises(ValueError, match=r"Cannot calculate.*guesses"): CategoricalCrossentropy(normalize=True).get_grad( guesses_larger_than_one, labels ) guesses_ok = numpy.asarray([[0.1, 0.4, 0.5]]) targets_neg = numpy.asarray([[-0.1, 0.5, 0.6]]) with pytest.raises(ValueError, match=r"Cannot calculate.*truth"): CategoricalCrossentropy(normalize=True).get_grad(guesses_ok, targets_neg) targets_larger_than_one = numpy.asarray([[2.0, 0.5, 0.6]]) with pytest.raises(ValueError, match=r"Cannot calculate.*truth"): CategoricalCrossentropy(normalize=True).get_grad( guesses_ok, targets_larger_than_one ) @pytest.mark.parametrize( "guesses, labels", [(guesses1, [2, 1, 0, 2])], ) def test_categorical_crossentropy_int_list_missing(guesses, labels): d_scores = CategoricalCrossentropy(normalize=True, missing_value=0).get_grad( guesses, labels ) assert d_scores.shape == guesses.shape # The normalization divides the difference (e.g. 0.4) by the number of vectors (4) assert d_scores[1][0] == pytest.approx(0.1, eps) assert d_scores[1][1] == pytest.approx(-0.1, eps) # Label 0 is masked, because it represents the missing value assert d_scores[2][0] == 0.0 assert d_scores[2][1] == 0.0 assert d_scores[2][2] == 0.0 # The fourth vector predicted no labels but should have predicted the last one assert d_scores[3][0] == pytest.approx(0, eps) assert d_scores[3][1] == pytest.approx(0, eps) assert d_scores[3][2] == pytest.approx(-0.25, eps) loss = CategoricalCrossentropy(normalize=True, missing_value=0).get_loss( guesses, labels ) assert loss == pytest.approx(0.114375, eps) @pytest.mark.parametrize( "guesses, labels", [(guesses1, labels1), (guesses1, labels1_full)] ) def test_categorical_crossentropy_missing(guesses, labels): d_scores = CategoricalCrossentropy(normalize=True, missing_value=0).get_grad( guesses, labels ) assert d_scores.shape == guesses.shape # The normalization divides the difference (e.g. 0.4) by the number of vectors (4) assert d_scores[1][0] == pytest.approx(0.1, eps) assert d_scores[1][1] == pytest.approx(-0.1, eps) # Label 0 is masked, because it represents the missing value assert d_scores[2][0] == 0.0 assert d_scores[2][1] == 0.0 assert d_scores[2][2] == 0.0 # The fourth vector predicted no labels but should have predicted the last one assert d_scores[3][0] == pytest.approx(0, eps) assert d_scores[3][1] == pytest.approx(0, eps) assert d_scores[3][2] == pytest.approx(-0.25, eps) loss = CategoricalCrossentropy(normalize=True, missing_value=0).get_loss( guesses, labels ) assert loss == pytest.approx(0.114375, eps) @pytest.mark.parametrize( "guesses, labels, names", [ ([guesses1, guesses2], [labels1, labels2], []), ([guesses1, guesses2], [labels1_full, labels2], []), ([guesses1, guesses2], [labels1_strings, labels2_strings], ["A", "B", "C"]), ], ) def test_sequence_categorical_crossentropy(guesses, labels, names): d_scores = SequenceCategoricalCrossentropy(normalize=False, names=names).get_grad( guesses, labels ) d_scores1 = d_scores[0] d_scores2 = d_scores[1] assert d_scores1.shape == guesses1.shape assert d_scores2.shape == guesses2.shape assert d_scores1[1][0] == pytest.approx(0.4, eps) assert d_scores1[1][1] == pytest.approx(-0.4, eps) # The normalization divides the difference (e.g. 0.4) by the number of seqs d_scores = SequenceCategoricalCrossentropy(normalize=True, names=names).get_grad( guesses, labels ) d_scores1 = d_scores[0] d_scores2 = d_scores[1] assert d_scores1[1][0] == pytest.approx(0.2, eps) assert d_scores1[1][1] == pytest.approx(-0.2, eps) # The third vector predicted all labels, but only the first one was correct assert d_scores1[2][0] == pytest.approx(0, eps) assert d_scores1[2][1] == pytest.approx(0.5, eps) assert d_scores1[2][2] == pytest.approx(0.5, eps) # The fourth vector predicted no labels but should have predicted the last one assert d_scores1[3][0] == pytest.approx(0, eps) assert d_scores1[3][1] == pytest.approx(0, eps) assert d_scores1[3][2] == pytest.approx(-0.5, eps) # Test the second batch assert d_scores2[0][0] == pytest.approx(0.1, eps) assert d_scores2[0][1] == pytest.approx(-0.35, eps) loss = SequenceCategoricalCrossentropy(normalize=True, names=names).get_loss( guesses, labels ) assert loss == pytest.approx(1.09, eps) @pytest.mark.parametrize( "guesses, labels, names", [ ([guesses1], [["A", "!A", "", "!C"]], ["A", "B", "C"]), ], ) def test_sequence_categorical_missing_negative(guesses, labels, names): d_scores = SequenceCategoricalCrossentropy( normalize=False, names=names, neg_prefix="!", missing_value="" ).get_grad(guesses, labels) d_scores0 = d_scores[0] # [0.1, 0.5, 0.6] should be A assert d_scores0[0][0] == pytest.approx(-0.9, eps) assert d_scores0[0][1] == pytest.approx(0.5, eps) assert d_scores0[0][2] == pytest.approx(0.6, eps) # [0.4, 0.6, 0.3] should NOT be A assert d_scores0[1][0] == pytest.approx(0.4, eps) assert d_scores0[1][1] == pytest.approx(0.0, eps) assert d_scores0[1][2] == pytest.approx(0.0, eps) # [1, 1, 1] has missing gold label assert d_scores0[2][0] == pytest.approx(0.0, eps) assert d_scores0[2][1] == pytest.approx(0.0, eps) assert d_scores0[2][2] == pytest.approx(0.0, eps) # [0.0, 0.0, 0.0] should NOT be C assert d_scores0[3][0] == pytest.approx(0.0, eps) assert d_scores0[3][1] == pytest.approx(0.0, eps) assert d_scores0[3][2] == pytest.approx(0.0, eps) def test_L2(): # L2 loss = 2²+4²=20 (or normalized: 1²+2²=5) vec1 = numpy.asarray([[1, 2], [8, 9]]) vec2 = numpy.asarray([[1, 2], [10, 5]]) d_vecs = L2Distance().get_grad(vec1, vec2) assert d_vecs.shape == vec1.shape numpy.testing.assert_allclose( d_vecs[0], numpy.zeros(d_vecs[0].shape), rtol=eps, atol=eps ) loss_not_normalized = L2Distance(normalize=False).get_loss(vec1, vec2) assert loss_not_normalized == pytest.approx(20, eps) loss_normalized = L2Distance(normalize=True).get_loss(vec1, vec2) assert loss_normalized == pytest.approx(5, eps) def test_cosine_orthogonal(): # These are orthogonal, i.e. loss is 1 vec1 = numpy.asarray([[0, 2], [0, 5]]) vec2 = numpy.asarray([[8, 0], [7, 0]]) d_vecs = CosineDistance(normalize=True).get_grad(vec1, vec2) assert d_vecs.shape == vec1.shape assert d_vecs[0][0] < 0 assert d_vecs[0][1] > 0 assert d_vecs[1][0] < 0 assert d_vecs[1][1] > 0 loss_not_normalized = CosineDistance(normalize=False).get_loss(vec1, vec2) assert loss_not_normalized == pytest.approx(2, eps) loss_normalized = CosineDistance(normalize=True).get_loss(vec1, vec2) assert loss_normalized == pytest.approx(1, eps) def test_cosine_equal(): # These 3 vectors are equal when measured with Cosine similarity, i.e. loss is 0 vec1 = numpy.asarray([[1, 2], [8, 9], [3, 3]]) vec2 = numpy.asarray([[1, 2], [80, 90], [300, 300]]) d_vec1 = CosineDistance().get_grad(vec1, vec2) assert d_vec1.shape == vec1.shape numpy.testing.assert_allclose(d_vec1, numpy.zeros(d_vec1.shape), rtol=eps, atol=eps) loss_not_normalized = CosineDistance(normalize=False).get_loss(vec1, vec2) assert loss_not_normalized == pytest.approx(0, eps) loss_normalized = CosineDistance(normalize=True).get_loss(vec1, vec2) assert loss_normalized == pytest.approx(0, eps) def test_cosine_unmatched(): vec1 = numpy.asarray([[1, 2, 3]]) vec2 = numpy.asarray([[1, 2]]) with pytest.raises(ValueError): CosineDistance().get_grad(vec1, vec2) @pytest.mark.parametrize( "name,kwargs,args", [ ("CategoricalCrossentropy.v1", {}, (scores0, labels0)), ("SequenceCategoricalCrossentropy.v1", {}, ([scores0], [labels0])), ("CategoricalCrossentropy.v2", {"neg_prefix": "!"}, (scores0, labels0)), ("CategoricalCrossentropy.v3", {"neg_prefix": "!"}, (scores0, labels0)), ( "SequenceCategoricalCrossentropy.v2", {"neg_prefix": "!"}, ([scores0], [labels0]), ), ( "SequenceCategoricalCrossentropy.v3", {"neg_prefix": "!"}, ([scores0], [labels0]), ), ("L2Distance.v1", {}, (scores0, scores0)), ( "CosineDistance.v1", {"normalize": True, "ignore_zeros": True}, (scores0, scores0), ), ], ) def test_loss_from_config(name, kwargs, args): """Test that losses are loaded and configured correctly from registry (as partials).""" cfg = {"test": {"@losses": name, **kwargs}} func = registry.resolve(cfg)["test"] loss = func.get_grad(*args) if isinstance(loss, (list, tuple)): loss = loss[0] assert loss.ndim == 2 func.get_loss(*args) func(*args) thinc-release-v9.1.1/thinc/tests/test_optimizers.py000066400000000000000000000116051467064331700225360ustar00rootroot00000000000000import numpy import pytest from thinc.api import Optimizer, registry from thinc.optimizers import KeyT, _wrap_generator STUB_KEY: KeyT = (0, "") def _test_schedule_valid(): while True: yield 0.456 def _test_schedule_invalid(): yield from [] @pytest.fixture( params=[ (lambda: 0.123, 0.123, 0.123, 0.123), (lambda: _test_schedule_valid(), 0.456, 0.456, 0.456), (lambda: (i for i in [0.2, 0.1, 0.4, 0.5, 0.6, 0.7, 0.8]), 0.2, 0.1, 0.4), (lambda: (i for i in [0.333, 0.666]), 0.333, 0.666, 0.666), (lambda: [0.9, 0.8, 0.7], 0.9, 0.8, 0.7), (lambda: [0.0, 0.123], 0.0, 0.123, 0.123), ], scope="function", ) def schedule_valid(request): # Use lambda to prevent iterator from being consumed by first test r_func, r1, r2, r3 = request.param return r_func(), r1, r2, r3 @pytest.fixture( params=[ (lambda: 0.123, 0.123, 0.123, 0.123), (lambda: (i for i in [0.2, 0.1, 0.4, 0.5, 0.6, 0.7, 0.8]), 0.2, 0.1, 0.4), (lambda: (i for i in [0.333, 0.666]), 0.333, 0.666, 0.666), (lambda: [0.9, 0.8, 0.7], 0.9, 0.8, 0.7), (lambda: [0.0, 0.123], 0.0, 0.123, 0.123), ], scope="function", ) def schedule_config_valid(request): # Use lambda to prevent iterator from being consumed by first test r_func, r1, r2, r3 = request.param return r_func(), r1, r2, r3 @pytest.fixture( params=[ (lambda: "hello"), (lambda: _test_schedule_invalid()), (lambda: (_ for _ in [])), (lambda: []), ], scope="function", ) def schedule_invalid(request): # Use lambda to prevent iterator from being consumed by first test r_func = request.param return r_func() @pytest.mark.parametrize("name", ["RAdam.v1", "Adam.v1", "SGD.v1"]) def test_optimizers_from_config(name): learn_rate = 0.123 cfg = {"@optimizers": name, "learn_rate": learn_rate} optimizer = registry.resolve({"config": cfg})["config"] assert optimizer.learn_rate(step=optimizer._step, key=STUB_KEY) == learn_rate def test_optimizer_schedules_from_config(schedule_config_valid): lr, lr_next1, lr_next2, lr_next3 = schedule_config_valid cfg = {"@optimizers": "Adam.v1", "learn_rate": lr} optimizer = registry.resolve({"cfg": cfg})["cfg"] assert optimizer.learn_rate(step=optimizer._step, key=STUB_KEY) == lr_next1 optimizer.step_schedules() assert optimizer.learn_rate(step=optimizer._step, key=STUB_KEY) == lr_next2 optimizer.step_schedules() assert optimizer.learn_rate(step=optimizer._step, key=STUB_KEY) == lr_next3 optimizer.learn_rate = lambda *, step, key: 1.0 assert optimizer.learn_rate(step=optimizer._step, key=STUB_KEY) == 1.0 def test_optimizer_schedules_valid(schedule_valid): lr, lr_next1, lr_next2, lr_next3 = schedule_valid optimizer = Optimizer(learn_rate=lr) assert optimizer.learn_rate(step=optimizer._step, key=STUB_KEY) == lr_next1 optimizer.step_schedules() assert optimizer.learn_rate(step=optimizer._step, key=STUB_KEY) == lr_next2 optimizer.step_schedules() assert optimizer.learn_rate(step=optimizer._step, key=STUB_KEY) == lr_next3 optimizer.learn_rate = lambda *, step, key: 1.0 assert optimizer.learn_rate(step=optimizer._step, key=STUB_KEY) == 1.0 def test_optimizer_schedules_invalid(schedule_invalid): with pytest.raises(ValueError): Optimizer(learn_rate=schedule_invalid) def test_optimizer_init(): optimizer = Optimizer( learn_rate=0.123, use_averages=False, use_radam=True, L2=0.1, L2_is_weight_decay=False, ) _, gradient = optimizer((0, "x"), numpy.zeros((1, 2)), numpy.zeros(0)) assert numpy.array_equal(gradient, numpy.zeros(0)) W = numpy.asarray([1.0, 0.0, 0.0, 1.0], dtype="f").reshape((4,)) dW = numpy.asarray([[-1.0, 0.0, 0.0, 1.0]], dtype="f").reshape((4,)) optimizer((0, "x"), W, dW) optimizer = Optimizer(learn_rate=0.123, beta1=0.1, beta2=0.1) optimizer((1, "x"), W, dW) def test_optimizer_last_score(): optimizer = Optimizer( learn_rate=0.123, ) assert optimizer.last_score is None optimizer.last_score = 1.0 assert optimizer.last_score == (0, 1.0) optimizer.step_schedules() optimizer.step_schedules() assert optimizer.last_score == (0, 1.0) optimizer.last_score = 2.0 assert optimizer.last_score == (2, 2.0) def test_generator_schedule(): s = _wrap_generator("test", iter([0.0, 1.0, 2.0, 3.0])) assert s(step=0, key=STUB_KEY, last_score=None) == 0.0 assert s(step=0, key=STUB_KEY, last_score=None) == 0.0 assert s(step=1, key=STUB_KEY, last_score=None) == 1.0 assert s(step=1, key=STUB_KEY, last_score=None) == 1.0 assert s(step=3, key=STUB_KEY, last_score=None) == 3.0 assert s(step=10, key=STUB_KEY, last_score=None) == 3.0 with pytest.raises(ValueError, match=r"must not decrease"): s(step=1, key=STUB_KEY, last_score=None) thinc-release-v9.1.1/thinc/tests/test_schedules.py000066400000000000000000000066171467064331700223170ustar00rootroot00000000000000from itertools import islice import pytest from thinc.api import ( compounding, constant, constant_then, cyclic_triangular, decaying, slanted_triangular, warmup_linear, ) from thinc.schedules import plateau def test_decaying_rate(): rates = decaying(0.001, 1e-4) rate = rates(step=0) assert rate == 0.001 next_rate = rates(step=1) assert next_rate < rate assert next_rate > 0 assert next_rate > rates(step=2) rates_offset = decaying(0.001, 1e-4, t=1.0) assert rates(step=1) == rates_offset(step=0) assert rates(step=2) == rates_offset(step=1) def test_compounding_rate(): rates = compounding(1, 16, 1.01) rate0 = rates(step=0) assert rate0 == 1.0 rate1 = rates(step=1) rate2 = rates(step=2) rate3 = rates(step=3) assert rate3 > rate2 > rate1 > rate0 assert (rate3 - rate2) > (rate2 - rate1) > (rate1 - rate0) rates_offset = compounding(1, 16, 1.01, t=1.0) assert rates(step=1) == rates_offset(step=0) assert rates(step=2) == rates_offset(step=1) def test_slanted_triangular_rate(): rates = slanted_triangular(1.0, 20.0, ratio=10) rate0 = rates(step=0) assert rate0 < 1.0 rate1 = rates(step=1) assert rate1 > rate0 rate2 = rates(step=2) assert rate2 < rate1 rate3 = rates(step=3) assert rate0 < rate3 < rate2 rates_offset = slanted_triangular(1.0, 20.0, ratio=10, t=1.0) assert rates(step=1) == rates_offset(step=0) assert rates(step=2) == rates_offset(step=1) def test_constant_then_schedule(): rates = constant_then(1.0, 2, constant(100)) assert rates(step=0) == 1.0 assert rates(step=1) == 1.0 assert rates(step=2) == 100 assert rates(step=3) == 100 def test_constant(): rates = constant(123) assert rates(step=0, key=(0, "")) == 123 assert rates(step=0, key=(0, "")) == 123 def test_warmup_linear(): rates = warmup_linear(1.0, 2, 10) expected = [0.0, 0.5, 1.0, 0.875, 0.75, 0.625, 0.5, 0.375, 0.25, 0.125, 0.0] for i in range(11): assert rates(step=i, key=(0, "")) == expected[i] def test_cyclic_triangular(): rates = cyclic_triangular(0.1, 1.0, 2) expected = [0.55, 1.0, 0.55, 0.1, 0.55, 1.0, 0.55, 0.1, 0.55, 1.0] for i in range(10): assert rates(step=i, key=(0, "")) == expected[i] def test_plateau(): schedule = plateau(2, 0.5, constant(1.0)) assert schedule(step=0, last_score=None) == 1.0 assert schedule(step=1, last_score=(1, 1.0)) == 1.0 # patience == 0 assert schedule(step=2, last_score=(2, 1.0)) == 1.0 # patience == 1 assert schedule(step=3, last_score=None) == 1.0 # patience == 1 assert schedule(step=4, last_score=(4, 1.0)) == 0.5 # patience == 2, reset assert schedule(step=5, last_score=(4, 1.0)) == 0.5 # patience == 0 assert schedule(step=6, last_score=(6, 0.9)) == 0.5 # patience == 1 assert schedule(step=7, last_score=(7, 2.0)) == 0.5 # patience == 0 assert schedule(step=8, last_score=(8, 1.0)) == 0.5 # patience == 1 assert schedule(step=9, last_score=(9, 2.0)) == 0.25 # patience == 2, reset with pytest.raises(ValueError, match=r"Expected score with step"): schedule(step=1, last_score=(1, 1.0)) == 1.0 def test_to_generator(): rates = warmup_linear(1.0, 2, 10) expected = [0.0, 0.5, 1.0, 0.875, 0.75, 0.625, 0.5, 0.375, 0.25, 0.125, 0.0] assert list(islice(rates.to_generator(), len(expected))) == expected thinc-release-v9.1.1/thinc/tests/test_serialize.py000066400000000000000000000152041467064331700223170ustar00rootroot00000000000000import pytest import srsly from thinc.api import ( Linear, Maxout, Model, Shim, chain, deserialize_attr, serialize_attr, with_array, ) @pytest.fixture def linear(): return Linear(5, 3) class SerializableAttr: value = "foo" def to_bytes(self): return self.value.encode("utf8") def from_bytes(self, data): self.value = f"{data.decode('utf8')} from bytes" return self class SerializableShim(Shim): name = "testshim" value = "shimdata" def to_bytes(self): return self.value.encode("utf8") def from_bytes(self, data): self.value = f"{data.decode('utf8')} from bytes" return self def test_pickle_with_flatten(linear): Xs = [linear.ops.alloc2f(2, 3), linear.ops.alloc2f(4, 3)] model = with_array(linear).initialize() pickled = srsly.pickle_dumps(model) loaded = srsly.pickle_loads(pickled) Ys = loaded.predict(Xs) assert len(Ys) == 2 assert Ys[0].shape == (Xs[0].shape[0], linear.get_dim("nO")) assert Ys[1].shape == (Xs[1].shape[0], linear.get_dim("nO")) def test_simple_model_roundtrip_bytes(): model = Maxout(5, 10, nP=2).initialize() b = model.get_param("b") b += 1 data = model.to_bytes() b = model.get_param("b") b -= 1 model = model.from_bytes(data) assert model.get_param("b")[0, 0] == 1 def test_simple_model_roundtrip_bytes_length(): """Ensure that serialization of non-initialized weight matrices goes fine""" model1 = Maxout(5, 10, nP=2) model2 = Maxout(5, 10, nP=2) data1 = model1.to_bytes() model2 = model2.from_bytes(data1) data2 = model2.to_bytes() assert data1 == data2 assert len(data1) == len(data2) def test_simple_model_roundtrip_bytes_serializable_attrs(): fwd = lambda model, X, is_train: (X, lambda dY: dY) attr = SerializableAttr() assert attr.value == "foo" assert attr.to_bytes() == b"foo" model = Model("test", fwd, attrs={"test": attr}) model.initialize() @serialize_attr.register(SerializableAttr) def serialize_attr_custom(_, value, name, model): return value.to_bytes() @deserialize_attr.register(SerializableAttr) def deserialize_attr_custom(_, value, name, model): return SerializableAttr().from_bytes(value) model_bytes = model.to_bytes() model = model.from_bytes(model_bytes) assert "test" in model.attrs assert model.attrs["test"].value == "foo from bytes" def test_multi_model_roundtrip_bytes(): model = chain(Maxout(5, 10, nP=2), Maxout(2, 3)).initialize() b = model.layers[0].get_param("b") b += 1 b = model.layers[1].get_param("b") b += 2 data = model.to_bytes() b = model.layers[0].get_param("b") b -= 1 b = model.layers[1].get_param("b") b -= 2 model = model.from_bytes(data) assert model.layers[0].get_param("b")[0, 0] == 1 assert model.layers[1].get_param("b")[0, 0] == 2 def test_multi_model_load_missing_dims(): model = chain(Maxout(5, 10, nP=2), Maxout(2, 3)).initialize() b = model.layers[0].get_param("b") b += 1 b = model.layers[1].get_param("b") b += 2 data = model.to_bytes() model2 = chain(Maxout(5, nP=None), Maxout(nP=None)) model2 = model2.from_bytes(data) assert model2.layers[0].get_param("b")[0, 0] == 1 assert model2.layers[1].get_param("b")[0, 0] == 2 def test_serialize_model_shims_roundtrip_bytes(): fwd = lambda model, X, is_train: (X, lambda dY: dY) test_shim = SerializableShim(None) shim_model = Model("shimmodel", fwd, shims=[test_shim]) model = chain(Linear(2, 3), shim_model, Maxout(2, 3)) model.initialize() assert model.layers[1].shims[0].value == "shimdata" model_bytes = model.to_bytes() with pytest.raises(ValueError): Linear(2, 3).from_bytes(model_bytes) test_shim = SerializableShim(None) shim_model = Model("shimmodel", fwd, shims=[test_shim]) new_model = chain(Linear(2, 3), shim_model, Maxout(2, 3)).from_bytes(model_bytes) assert new_model.layers[1].shims[0].value == "shimdata from bytes" def test_serialize_refs_roundtrip_bytes(): fwd = lambda model, X, is_train: (X, lambda dY: dY) model_a = Model("a", fwd) model = Model("test", fwd, refs={"a": model_a, "b": None}).initialize() with pytest.raises(ValueError): # ref not in nodes model.to_bytes() model = Model("test", fwd, refs={"a": model_a, "b": None}, layers=[model_a]) assert model.ref_names == ("a", "b") model_bytes = model.to_bytes() with pytest.raises(ValueError): Model("test", fwd).from_bytes(model_bytes) new_model = Model("test", fwd, layers=[model_a]) new_model.from_bytes(model_bytes) assert new_model.ref_names == ("a", "b") def test_serialize_attrs(): fwd = lambda model, X, is_train: (X, lambda dY: dY) attrs = {"test": "foo"} model1 = Model("test", fwd, attrs=attrs).initialize() bytes_attr = serialize_attr(model1.attrs["test"], attrs["test"], "test", model1) assert bytes_attr == srsly.msgpack_dumps("foo") model2 = Model("test", fwd, attrs={"test": ""}) result = deserialize_attr(model2.attrs["test"], bytes_attr, "test", model2) assert result == "foo" # Test objects with custom serialization functions @serialize_attr.register(SerializableAttr) def serialize_attr_custom(_, value, name, model): return value.to_bytes() @deserialize_attr.register(SerializableAttr) def deserialize_attr_custom(_, value, name, model): return SerializableAttr().from_bytes(value) attrs = {"test": SerializableAttr()} model3 = Model("test", fwd, attrs=attrs) bytes_attr = serialize_attr(model3.attrs["test"], attrs["test"], "test", model3) assert bytes_attr == b"foo" model4 = Model("test", fwd, attrs=attrs) assert model4.attrs["test"].value == "foo" result = deserialize_attr(model4.attrs["test"], bytes_attr, "test", model4) assert result.value == "foo from bytes" def test_simple_model_can_from_dict(): model = Maxout(5, 10, nP=2).initialize() model_dict = model.to_dict() assert model.can_from_dict(model_dict) # Test check without initialize assert Maxout(5, 10, nP=2).can_from_dict(model_dict) # Test not-strict check assert not Maxout(10, 5, nP=2).can_from_dict(model_dict) assert Maxout(5, nP=2).can_from_dict(model_dict) def test_multi_model_can_from_dict(): model = chain(Maxout(5, 10, nP=2), Maxout(2, 3)).initialize() model_dict = model.to_dict() assert model.can_from_dict(model_dict) assert chain(Maxout(5, 10, nP=2), Maxout(2, 3)).can_from_dict(model_dict) resized = chain(Maxout(5, 10, nP=3), Maxout(2, 3)) assert not resized.can_from_dict(model_dict) thinc-release-v9.1.1/thinc/tests/test_types.py000066400000000000000000000030271467064331700214740ustar00rootroot00000000000000import numpy import pytest from thinc.types import ( Floats1d, Floats2d, Floats3d, Floats4d, Ints1d, Ints2d, Ints3d, Ints4d, ) try: from pydantic.v1 import ValidationError, create_model except ImportError: from pydantic import ValidationError, create_model # type: ignore from thinc.types import ( Floats1d, Floats2d, Floats3d, Floats4d, Ints1d, Ints2d, Ints3d, Ints4d, ) @pytest.mark.parametrize( "arr,arr_type", [ (numpy.zeros(0, dtype=numpy.float32), Floats1d), (numpy.zeros((0, 0), dtype=numpy.float32), Floats2d), (numpy.zeros((0, 0, 0), dtype=numpy.float32), Floats3d), (numpy.zeros((0, 0, 0, 0), dtype=numpy.float32), Floats4d), (numpy.zeros(0, dtype=numpy.int32), Ints1d), (numpy.zeros((0, 0), dtype=numpy.int32), Ints2d), (numpy.zeros((0, 0, 0), dtype=numpy.int32), Ints3d), (numpy.zeros((0, 0, 0, 0), dtype=numpy.int32), Ints4d), ], ) def test_array_validation_valid(arr, arr_type): test_model = create_model("TestModel", arr=(arr_type, ...)) result = test_model(arr=arr) assert numpy.array_equal(arr, result.arr) @pytest.mark.parametrize( "arr,arr_type", [ (numpy.zeros((0, 0), dtype=numpy.float32), Floats1d), (numpy.zeros((0, 0), dtype=numpy.float32), Ints2d), ], ) def test_array_validation_invalid(arr, arr_type): test_model = create_model("TestModel", arr=(arr_type, ...)) with pytest.raises(ValidationError): test_model(arr=arr) thinc-release-v9.1.1/thinc/tests/test_util.py000066400000000000000000000130171467064331700213050ustar00rootroot00000000000000import numpy import pytest from hypothesis import given from thinc.api import Padded, Ragged, get_width from thinc.types import ArgsKwargs from thinc.util import ( convert_recursive, get_array_module, is_cupy_array, is_numpy_array, to_categorical, ) from . import strategies ALL_XP = [numpy] try: import cupy ALL_XP.append(cupy) except ImportError: pass @pytest.mark.parametrize( "obj,width", [ (numpy.zeros((1, 2, 3, 4)), 4), (numpy.array(1), 0), (numpy.array([1, 2]), 3), ([numpy.zeros((1, 2)), numpy.zeros((1))], 2), (Ragged(numpy.zeros((1, 2)), numpy.zeros(1)), 2), # type:ignore ( Padded( numpy.zeros((2, 1, 2)), # type:ignore numpy.zeros(2), # type:ignore numpy.array([1, 0]), # type:ignore numpy.array([0, 1]), # type:ignore ), 2, ), ([], 0), ], ) def test_get_width(obj, width): assert get_width(obj) == width @pytest.mark.parametrize("obj", [1234, "foo", {"a": numpy.array(0)}]) def test_get_width_fail(obj): with pytest.raises(ValueError): get_width(obj) @pytest.mark.parametrize("xp", ALL_XP) def test_array_module_cpu_gpu_helpers(xp): error = ( "Only numpy and cupy arrays are supported" ", but found instead. If " "get_array_module module wasn't called " "directly, this might indicate a bug in Thinc." ) with pytest.raises(ValueError, match=error): get_array_module(0) zeros = xp.zeros((1, 2)) xp_ = get_array_module(zeros) assert xp_ == xp if xp == numpy: assert is_numpy_array(zeros) assert not is_numpy_array((1, 2)) else: assert is_cupy_array(zeros) assert not is_cupy_array((1, 2)) @given( label_smoothing=strategies.floats(min_value=0.0, max_value=0.5, exclude_max=True) ) def test_to_categorical(label_smoothing): # Test without n_classes one_hot = to_categorical(numpy.asarray([1, 2], dtype="i")) assert one_hot.shape == (2, 3) # From keras # https://github.com/keras-team/keras/blob/master/tests/keras/utils/np_utils_test.py nc = 5 shapes = [(1,), (3,), (4, 3), (5, 4, 3), (3, 1), (3, 2, 1)] expected_shapes = [ (1, nc), (3, nc), (4, 3, nc), (5, 4, 3, nc), (3, 1, nc), (3, 2, 1, nc), ] labels = [numpy.random.randint(0, nc, shape) for shape in shapes] one_hots = [to_categorical(label, nc) for label in labels] smooths = [ to_categorical(label, nc, label_smoothing=label_smoothing) for label in labels ] for i in range(len(expected_shapes)): label = labels[i] one_hot = one_hots[i] expected_shape = expected_shapes[i] smooth = smooths[i] assert one_hot.shape == expected_shape assert smooth.shape == expected_shape assert numpy.array_equal(one_hot, one_hot.astype(bool)) assert numpy.all(one_hot.sum(axis=-1) == 1) assert numpy.all(numpy.argmax(one_hot, -1).reshape(label.shape) == label) assert numpy.all(smooth.argmax(axis=-1) == one_hot.argmax(axis=-1)) assert numpy.all(numpy.isclose(numpy.sum(smooth, axis=-1), 1.0)) assert numpy.isclose(numpy.max(smooth), 1 - label_smoothing) assert numpy.isclose( numpy.min(smooth), label_smoothing / (smooth.shape[-1] - 1) ) # At least one class is required without label smoothing. numpy.testing.assert_allclose( to_categorical(numpy.asarray([0, 0, 0]), 1), [[1.0], [1.0], [1.0]] ) numpy.testing.assert_allclose( to_categorical(numpy.asarray([0, 0, 0])), [[1.0], [1.0], [1.0]] ) with pytest.raises(ValueError, match=r"n_classes should be at least 1"): to_categorical(numpy.asarray([0, 0, 0]), 0) # At least two classes are required with label smoothing. numpy.testing.assert_allclose( to_categorical(numpy.asarray([0, 1, 0]), 2, label_smoothing=0.01), [[0.99, 0.01], [0.01, 0.99], [0.99, 0.01]], ) numpy.testing.assert_allclose( to_categorical(numpy.asarray([0, 1, 0]), label_smoothing=0.01), [[0.99, 0.01], [0.01, 0.99], [0.99, 0.01]], ) with pytest.raises( ValueError, match=r"n_classes should be greater than 1.*label smoothing.*but 1" ): to_categorical(numpy.asarray([0, 1, 0]), 1, label_smoothing=0.01), with pytest.raises( ValueError, match=r"n_classes should be greater than 1.*label smoothing.*but 1" ): to_categorical(numpy.asarray([0, 0, 0]), label_smoothing=0.01), with pytest.raises(ValueError, match=r"label_smoothing parameter"): to_categorical(numpy.asarray([0, 1, 2, 3, 4]), label_smoothing=0.8) with pytest.raises(ValueError, match=r"label_smoothing parameter"): to_categorical(numpy.asarray([0, 1, 2, 3, 4]), label_smoothing=0.88) def test_convert_recursive(): is_match = lambda obj: obj == "foo" convert_item = lambda obj: obj.upper() obj = { "a": {("b", "foo"): {"c": "foo", "d": ["foo", {"e": "foo", "f": (1, "foo")}]}} } result = convert_recursive(is_match, convert_item, obj) assert result["a"][("b", "FOO")]["c"] == "FOO" assert result["a"][("b", "FOO")]["d"] == ["FOO", {"e": "FOO", "f": (1, "FOO")}] obj = {"a": ArgsKwargs(("foo", [{"b": "foo"}]), {"a": ["x", "foo"]})} result = convert_recursive(is_match, convert_item, obj) assert result["a"].args == ("FOO", [{"b": "FOO"}]) assert result["a"].kwargs == {"a": ["x", "FOO"]} thinc-release-v9.1.1/thinc/tests/util.py000066400000000000000000000070201467064331700202430ustar00rootroot00000000000000import contextlib import shutil import tempfile from pathlib import Path import numpy import pytest from thinc.api import ArgsKwargs, Linear, Padded, Ragged from thinc.util import has_cupy, is_cupy_array, is_numpy_array @contextlib.contextmanager def make_tempdir(): d = Path(tempfile.mkdtemp()) yield d shutil.rmtree(str(d)) def get_model(W_b_input, cls=Linear): W, b, input_ = W_b_input nr_out, nr_in = W.shape model = cls(nr_out, nr_in) model.set_param("W", W) model.set_param("b", b) model.initialize() return model def get_shape(W_b_input): W, b, input_ = W_b_input return input_.shape[0], W.shape[0], W.shape[1] def get_data_checker(inputs): if isinstance(inputs, Ragged): return assert_raggeds_match elif isinstance(inputs, Padded): return assert_paddeds_match elif isinstance(inputs, list): return assert_lists_match elif isinstance(inputs, tuple) and len(inputs) == 4: return assert_padded_data_match elif isinstance(inputs, tuple) and len(inputs) == 2: return assert_ragged_data_match else: return assert_arrays_match def assert_arrays_match(X, Y): assert X.dtype == Y.dtype # Transformations are allowed to change last dimension, but not batch size. assert X.shape[0] == Y.shape[0] return True def assert_lists_match(X, Y): assert isinstance(X, list) assert isinstance(Y, list) assert len(X) == len(Y) for x, y in zip(X, Y): assert_arrays_match(x, y) return True def assert_raggeds_match(X, Y): assert isinstance(X, Ragged) assert isinstance(Y, Ragged) assert_arrays_match(X.lengths, Y.lengths) assert_arrays_match(X.data, Y.data) return True def assert_paddeds_match(X, Y): assert isinstance(X, Padded) assert isinstance(Y, Padded) assert_arrays_match(X.size_at_t, Y.size_at_t) assert assert_arrays_match(X.lengths, Y.lengths) assert assert_arrays_match(X.indices, Y.indices) assert X.data.dtype == Y.data.dtype assert X.data.shape[1] == Y.data.shape[1] assert X.data.shape[0] == Y.data.shape[0] return True def assert_padded_data_match(X, Y): return assert_paddeds_match(Padded(*X), Padded(*Y)) def assert_ragged_data_match(X, Y): return assert_raggeds_match(Ragged(*X), Ragged(*Y)) def check_input_converters(Y, backprop, data, n_args, kwargs_keys, type_): assert isinstance(Y, ArgsKwargs) assert len(Y.args) == n_args assert list(Y.kwargs.keys()) == kwargs_keys assert all(isinstance(arg, type_) for arg in Y.args) assert all(isinstance(arg, type_) for arg in Y.kwargs.values()) dX = backprop(Y) def is_supported_backend_array(arr): return is_cupy_array(arr) or is_numpy_array(arr) input_type = type(data) if not isinstance(data, list) else tuple assert isinstance(dX, input_type) or is_supported_backend_array(dX) if isinstance(data, dict): assert list(dX.keys()) == kwargs_keys assert all(is_supported_backend_array(arr) for arr in dX.values()) elif isinstance(data, (list, tuple)): assert isinstance(dX, tuple) assert all(is_supported_backend_array(arr) for arr in dX) elif isinstance(data, ArgsKwargs): assert len(dX.args) == n_args assert list(dX.kwargs.keys()) == kwargs_keys assert all(is_supported_backend_array(arg) for arg in dX.args) assert all(is_supported_backend_array(arg) for arg in dX.kwargs.values()) elif not isinstance(data, numpy.ndarray): pytest.fail(f"Bad data type: {dX}") thinc-release-v9.1.1/thinc/types.py000066400000000000000000001353101467064331700172740ustar00rootroot00000000000000import sys from abc import abstractmethod from dataclasses import dataclass from typing import ( Any, Callable, Container, Dict, Generic, Iterable, Iterator, List, Optional, Sequence, Sized, Tuple, TypeVar, Union, cast, overload, ) import numpy from .compat import cupy, has_cupy if has_cupy: get_array_module = cupy.get_array_module else: get_array_module = lambda obj: numpy # Use typing_extensions for Python versions < 3.8 if sys.version_info < (3, 8): from typing_extensions import Literal, Protocol else: from typing import Literal, Protocol # noqa: F401 # fmt: off XY_YZ_OutT = TypeVar("XY_YZ_OutT") XY_XY_OutT = TypeVar("XY_XY_OutT") DeviceTypes = Literal["cpu", "gpu", "tpu"] Batchable = Union["Pairs", "Ragged", "Padded", "ArrayXd", List, Tuple] Xp = Union["numpy", "cupy"] # type: ignore Shape = Tuple[int, ...] DTypes = Literal["f", "i", "float16", "float32", "float64", "int32", "int64", "uint32", "uint64"] DTypesFloat = Literal["f", "float32", "float16", "float64"] DTypesInt = Literal["i", "int32", "int64", "uint32", "uint64"] Array1d = Union["Floats1d", "Ints1d"] Array2d = Union["Floats2d", "Ints2d"] Array3d = Union["Floats3d", "Ints3d"] Array4d = Union["Floats4d", "Ints4d"] FloatsXd = Union["Floats1d", "Floats2d", "Floats3d", "Floats4d"] IntsXd = Union["Ints1d", "Ints2d", "Ints3d", "Ints4d"] ArrayXd = Union[FloatsXd, IntsXd] List1d = Union[List["Floats1d"], List["Ints1d"]] List2d = Union[List["Floats2d"], List["Ints2d"]] List3d = Union[List["Floats3d"], List["Ints3d"]] List4d = Union[List["Floats4d"], List["Ints4d"]] ListXd = Union[List1d, List2d, List3d, List4d] ArrayT = TypeVar("ArrayT") SelfT = TypeVar("SelfT") Array1dT = TypeVar("Array1dT", bound="Array1d") FloatsXdT = TypeVar("FloatsXdT", "Floats1d", "Floats2d", "Floats3d", "Floats4d") # These all behave the same as far as indexing is concerned Slicish = Union[slice, List[int], "ArrayXd"] _1_KeyScalar = int _1_Key1d = Slicish _1_AllKeys = Union[_1_KeyScalar, _1_Key1d] _F1_AllReturns = Union[float, "Floats1d"] _I1_AllReturns = Union[int, "Ints1d"] _2_KeyScalar = Tuple[int, int] _2_Key1d = Union[int, Tuple[Slicish, int], Tuple[int, Slicish]] _2_Key2d = Union[Tuple[Slicish, Slicish], Slicish] _2_AllKeys = Union[_2_KeyScalar, _2_Key1d, _2_Key2d] _F2_AllReturns = Union[float, "Floats1d", "Floats2d"] _I2_AllReturns = Union[int, "Ints1d", "Ints2d"] _3_KeyScalar = Tuple[int, int, int] _3_Key1d = Union[Tuple[int, int], Tuple[int, int, Slicish], Tuple[int, Slicish, int], Tuple[Slicish, int, int]] _3_Key2d = Union[int, Tuple[int, Slicish], Tuple[Slicish, int], Tuple[int, Slicish, Slicish], Tuple[Slicish, int, Slicish], Tuple[Slicish, Slicish, int]] _3_Key3d = Union[Slicish, Tuple[Slicish, Slicish], Tuple[Slicish, Slicish, Slicish]] _3_AllKeys = Union[_3_KeyScalar, _3_Key1d, _3_Key2d, _3_Key3d] _F3_AllReturns = Union[float, "Floats1d", "Floats2d", "Floats3d"] _I3_AllReturns = Union[int, "Ints1d", "Ints2d", "Ints3d"] _4_KeyScalar = Tuple[int, int, int, int] _4_Key1d = Union[Tuple[int, int, int], Tuple[int, int, int, Slicish], Tuple[int, int, Slicish, int], Tuple[int, Slicish, int, int], Tuple[Slicish, int, int, int]] _4_Key2d = Union[Tuple[int, int], Tuple[int, int, Slicish], Tuple[int, Slicish, int], Tuple[Slicish, int, int], Tuple[int, int, Slicish, Slicish], Tuple[int, Slicish, int, Slicish], Tuple[int, Slicish, Slicish, int], Tuple[Slicish, int, int, Slicish], Tuple[Slicish, int, Slicish, int], Tuple[Slicish, Slicish, int, int]] _4_Key3d = Union[int, Tuple[int, Slicish], Tuple[Slicish, int], Tuple[int, Slicish, Slicish], Tuple[Slicish, int, Slicish], Tuple[Slicish, Slicish, int], Tuple[int, Slicish, Slicish, Slicish], Tuple[Slicish, int, Slicish, Slicish], Tuple[Slicish, Slicish, int, Slicish], Tuple[Slicish, Slicish, Slicish, int]] _4_Key4d = Union[Slicish, Tuple[Slicish, Slicish], Tuple[Slicish, Slicish, Slicish], Tuple[Slicish, Slicish, Slicish, Slicish]] _4_AllKeys = Union[_4_KeyScalar, _4_Key1d, _4_Key2d, _4_Key3d, _4_Key4d] _F4_AllReturns = Union[float, "Floats1d", "Floats2d", "Floats3d", "Floats4d"] _I4_AllReturns = Union[int, "Ints1d", "Ints2d", "Ints3d", "Ints4d"] # Typedefs for the reduction methods. Tru = Literal[True] Fal = Literal[False] OneAx = Union[int, Tuple[int]] TwoAx = Tuple[int, int] ThreeAx = Tuple[int, int, int] FourAx = Tuple[int, int, int, int] _1_AllAx = Optional[OneAx] _2_AllAx = Union[Optional[TwoAx], OneAx] _3_AllAx = Union[Optional[ThreeAx], TwoAx, OneAx] _4_AllAx = Union[Optional[FourAx], ThreeAx, TwoAx, OneAx] _1F_ReduceResults = Union[float, "Floats1d"] _2F_ReduceResults = Union[float, "Floats1d", "Floats2d"] _3F_ReduceResults = Union[float, "Floats1d", "Floats2d", "Floats3d"] _4F_ReduceResults = Union[float, "Floats1d", "Floats2d", "Floats3d", "Floats4d"] _1I_ReduceResults = Union[int, "Ints1d"] _2I_ReduceResults = Union[int, "Ints1d", "Ints2d"] _3I_ReduceResults = Union[int, "Ints1d", "Ints2d", "Ints3d"] _4I_ReduceResults = Union[int, "Ints1d", "Ints2d", "Ints3d", "Ints4d"] # TODO: # We need to get correct overloads in for the following reduction methods. # The 'sum' reduction is correct --- the others need to be just the same, # but with a different name. # max, min, prod, round, var, mean, ptp, std # There's also one *slightly* different function, cumsum. This doesn't # have a scalar version -- it always makes an array. class _Array(Sized, Container): @classmethod def __get_validators__(cls): """Runtime validation for pydantic.""" yield lambda v: validate_array(v) @property @abstractmethod def dtype(self) -> DTypes: ... @property @abstractmethod def data(self) -> memoryview: ... @property @abstractmethod def flags(self) -> Any: ... @property @abstractmethod def size(self) -> int: ... @property @abstractmethod def itemsize(self) -> int: ... @property @abstractmethod def nbytes(self) -> int: ... @property @abstractmethod def ndim(self) -> int: ... @property @abstractmethod def shape(self) -> Shape: ... @property @abstractmethod def strides(self) -> Tuple[int, ...]: ... # TODO: Is ArrayT right? @abstractmethod def astype(self: ArrayT, dtype: DTypes, order: str = ..., casting: str = ..., subok: bool = ..., copy: bool = ...) -> ArrayT: ... @abstractmethod def copy(self: ArrayT, order: str = ...) -> ArrayT: ... @abstractmethod def fill(self, value: Any) -> None: ... # Shape manipulation @abstractmethod def reshape(self: ArrayT, shape: Shape, *, order: str = ...) -> ArrayT: ... @abstractmethod def transpose(self: ArrayT, axes: Shape) -> ArrayT: ... # TODO: is this right? It returns 1d @abstractmethod def flatten(self, order: str = ...): ... # TODO: is this right? It returns 1d @abstractmethod def ravel(self, order: str = ...): ... @abstractmethod def squeeze(self, axis: Union[int, Shape] = ...): ... @abstractmethod def __len__(self) -> int: ... @abstractmethod def __setitem__(self, key, value): ... @abstractmethod def __iter__(self) -> Iterator[Any]: ... @abstractmethod def __contains__(self, key) -> bool: ... @abstractmethod def __index__(self) -> int: ... @abstractmethod def __int__(self) -> int: ... @abstractmethod def __float__(self) -> float: ... @abstractmethod def __complex__(self) -> complex: ... @abstractmethod def __bool__(self) -> bool: ... @abstractmethod def __bytes__(self) -> bytes: ... @abstractmethod def __str__(self) -> str: ... @abstractmethod def __repr__(self) -> str: ... @abstractmethod def __copy__(self, order: str = ...): ... @abstractmethod def __deepcopy__(self: SelfT, memo: dict) -> SelfT: ... @abstractmethod def __lt__(self, other): ... @abstractmethod def __le__(self, other): ... @abstractmethod def __eq__(self, other): ... @abstractmethod def __ne__(self, other): ... @abstractmethod def __gt__(self, other): ... @abstractmethod def __ge__(self, other): ... @abstractmethod def __add__(self, other): ... @abstractmethod def __radd__(self, other): ... @abstractmethod def __iadd__(self, other): ... @abstractmethod def __sub__(self, other): ... @abstractmethod def __rsub__(self, other): ... @abstractmethod def __isub__(self, other): ... @abstractmethod def __mul__(self, other): ... @abstractmethod def __rmul__(self, other): ... @abstractmethod def __imul__(self, other): ... @abstractmethod def __truediv__(self, other): ... @abstractmethod def __rtruediv__(self, other): ... @abstractmethod def __itruediv__(self, other): ... @abstractmethod def __floordiv__(self, other): ... @abstractmethod def __rfloordiv__(self, other): ... @abstractmethod def __ifloordiv__(self, other): ... @abstractmethod def __mod__(self, other): ... @abstractmethod def __rmod__(self, other): ... @abstractmethod def __imod__(self, other): ... @abstractmethod def __divmod__(self, other): ... @abstractmethod def __rdivmod__(self, other): ... # NumPy's __pow__ doesn't handle a third argument @abstractmethod def __pow__(self, other): ... @abstractmethod def __rpow__(self, other): ... @abstractmethod def __ipow__(self, other): ... @abstractmethod def __lshift__(self, other): ... @abstractmethod def __rlshift__(self, other): ... @abstractmethod def __ilshift__(self, other): ... @abstractmethod def __rshift__(self, other): ... @abstractmethod def __rrshift__(self, other): ... @abstractmethod def __irshift__(self, other): ... @abstractmethod def __and__(self, other): ... @abstractmethod def __rand__(self, other): ... @abstractmethod def __iand__(self, other): ... @abstractmethod def __xor__(self, other): ... @abstractmethod def __rxor__(self, other): ... @abstractmethod def __ixor__(self, other): ... @abstractmethod def __or__(self, other): ... @abstractmethod def __ror__(self, other): ... @abstractmethod def __ior__(self, other): ... @abstractmethod def __matmul__(self, other): ... @abstractmethod def __rmatmul__(self, other): ... @abstractmethod def __neg__(self: ArrayT) -> ArrayT: ... @abstractmethod def __pos__(self: ArrayT) -> ArrayT: ... @abstractmethod def __abs__(self: ArrayT) -> ArrayT: ... @abstractmethod def __invert__(self: ArrayT) -> ArrayT: ... @abstractmethod def get(self: ArrayT) -> ArrayT: ... @abstractmethod def all(self, axis: int = -1, out: Optional[ArrayT] = None, keepdims: bool = False) -> ArrayT: ... @abstractmethod def any(self, axis: int = -1, out: Optional[ArrayT] = None, keepdims: bool = False) -> ArrayT: ... # def argmax(self, axis: int = -1, out: Optional["Array"] = None, keepdims: Union[Tru, Fal]=False) -> Union[int, "Ints1d"]: ... @abstractmethod def argmin(self, axis: int = -1, out: Optional[ArrayT] = None) -> ArrayT: ... @abstractmethod def clip(self, a_min: Any, a_max: Any, out: Optional[ArrayT]) -> ArrayT: ... #def cumsum( self: ArrayT, axis: int = -1, dtype: Optional[DTypes] = None, out: Optional[ArrayT] = None) -> ArrayT: ... @abstractmethod def max(self, axis: int = -1, out: Optional[ArrayT] = None) -> ArrayT: ... # def mean(self, axis: int = -1, dtype: Optional[DTypes] = None, out: Optional[SelfT] = None, keepdims: bool = False) -> "Array": ... @abstractmethod def min(self, axis: int = -1, out: Optional[ArrayT] = None) -> ArrayT: ... @abstractmethod def nonzero(self: SelfT) -> SelfT: ... @abstractmethod def prod(self, axis: int = -1, dtype: Optional[DTypes] = None, out: Optional[ArrayT] = None, keepdims: bool = False) -> ArrayT: ... @abstractmethod def round(self, decimals: int = 0, out: Optional[ArrayT] = None) -> ArrayT: ... # def sum(self, axis: int = -1, dtype: Optional[DTypes] = None, out: Optional[ArrayT] = None, keepdims: bool = False) -> ArrayT: ... @abstractmethod def tobytes(self, order: str = "C") -> bytes: ... @abstractmethod def tolist(self) -> List[Any]: ... @abstractmethod def var(self: SelfT, axis: int = -1, dtype: Optional[DTypes] = None, out: Optional[ArrayT] = None, ddof: int = 0, keepdims: bool = False) -> SelfT: ... class _Floats(_Array): @property @abstractmethod def dtype(self) -> DTypesFloat: ... @abstractmethod def fill(self, value: float) -> None: ... @abstractmethod def reshape(self, shape: Shape, *, order: str = ...) -> "_Floats": ... class _Ints(_Array): @property @abstractmethod def dtype(self) -> DTypesInt: ... @abstractmethod def fill(self, value: int) -> None: ... @abstractmethod def reshape(self, shape: Shape, *, order: str = ...) -> "_Ints": ... """ Extensive overloads to represent __getitem__ behaviour. In an N+1 dimensional array, there will be N possible return types. For instance, if you have a 2d array, you could get back a float (array[i, j]), a floats1d (array[i]) or a floats2d (array[:i, :j]). You'll get the scalar if you have N ints in the index, a 1d array if you have N-1 ints, etc. So the trick here is to make a union with the various combinations that produce each result type, and then only have one overload per result. If we overloaded on each *key* type, that would get crazy, because there's tonnes of combinations. In each rank, we can use the same key-types for float and int, but we need a different return-type union. """ class _Array1d(_Array): """1-dimensional array.""" @classmethod def __get_validators__(cls): """Runtime validation for pydantic.""" yield lambda v: validate_array(v, ndim=1) @property @abstractmethod def ndim(self) -> Literal[1]: ... @property @abstractmethod def shape(self) -> Tuple[int]: ... @abstractmethod def __iter__(self) -> Iterator[Union[float, int]]: ... @abstractmethod def astype(self, dtype: DTypes, order: str = ..., casting: str = ..., subok: bool = ..., copy: bool = ...) -> "_Array1d": ... @abstractmethod def flatten(self: SelfT, order: str = ...) -> SelfT: ... @abstractmethod def ravel(self: SelfT, order: str = ...) -> SelfT: ... # These is actually a bit too strict: It's legal to say 'array1d + array2d' # That's kind of bad code though; it's better to write array2d + array1d. # We could relax this, but let's try the strict version. @abstractmethod def __add__(self: SelfT, other: Union[float, int, "Array1d"]) -> SelfT: ... @abstractmethod def __sub__(self: SelfT, other: Union[float, int, "Array1d"]) -> SelfT: ... @abstractmethod def __mul__(self: SelfT, other: Union[float, int, "Array1d"]) -> SelfT: ... @abstractmethod def __pow__(self: SelfT, other: Union[float, int, "Array1d"]) -> SelfT: ... @abstractmethod def __matmul__(self: SelfT, other: Union[float, int, "Array1d"]) -> SelfT: ... # These are not too strict though: you can't do += with higher dimensional. @abstractmethod def __iadd__(self, other: Union[float, int, "Array1d"]): ... @abstractmethod def __isub__(self, other: Union[float, int, "Array1d"]): ... @abstractmethod def __imul__(self, other: Union[float, int, "Array1d"]): ... @abstractmethod def __ipow__(self, other: Union[float, int, "Array1d"]): ... @overload @abstractmethod def argmax(self, keepdims: Fal = False, axis: int = -1, out: Optional[_Array] = None) -> int: ... @overload @abstractmethod def argmax(self, keepdims: Tru, axis: int = -1, out: Optional[_Array] = None) -> "Ints1d": ... @abstractmethod def argmax(self, keepdims: bool = False, axis: int = -1, out: Optional[_Array] = None) -> Union[int, "Ints1d"]: ... @overload @abstractmethod def mean(self, keepdims: Tru, axis: int = -1, dtype: Optional[DTypes] = None, out: Optional["Floats1d"] = None) -> "Floats1d": ... @overload @abstractmethod def mean(self, keepdims: Fal = False, axis: int = -1, dtype: Optional[DTypes] = None, out: Optional["Floats1d"] = None) -> float: ... @abstractmethod def mean(self, keepdims: bool = False, axis: int = -1, dtype: Optional[DTypes] = None, out: Optional["Floats1d"] = None) -> Union["Floats1d", float]: ... class Floats1d(_Array1d, _Floats): """1-dimensional array of floats.""" T: "Floats1d" @classmethod def __get_validators__(cls): """Runtime validation for pydantic.""" yield lambda v: validate_array(v, ndim=1, dtype="f") @abstractmethod def __iter__(self) -> Iterator[float]: ... @overload @abstractmethod def __getitem__(self, key: _1_KeyScalar) -> float: ... @overload @abstractmethod def __getitem__(self, key: _1_Key1d) -> "Floats1d": ... @abstractmethod def __getitem__(self, key: _1_AllKeys) -> _F1_AllReturns: ... @overload @abstractmethod def __setitem__(self, key: _1_KeyScalar, value: float) -> None: ... @overload @abstractmethod def __setitem__(self, key: _1_Key1d, value: "Floats1d") -> None: ... @abstractmethod def __setitem__(self, key: _1_AllKeys, _F1_AllReturns) -> None: ... @overload @abstractmethod def cumsum(self, *, keepdims: Tru, axis: Optional[OneAx] = None, out: Optional["Floats1d"] = None) -> "Floats1d": ... @overload # Cumsum is unusual in this @abstractmethod def cumsum(self, *, keepdims: Fal, axis: Optional[OneAx] = None, out: Optional["Floats1d"] = None) -> "Floats1d": ... @abstractmethod def cumsum(self, *, keepdims: bool = False, axis: _1_AllAx = None, out: Optional["Floats1d"] = None) -> "Floats1d": ... @overload @abstractmethod def sum(self, *, keepdims: Tru, axis: Optional[OneAx] = None, out: Optional["Floats1d"] = None) -> "Floats1d": ... @overload @abstractmethod def sum(self, *, keepdims: Fal, axis: Optional[OneAx] = None, out = None) -> float: ... @abstractmethod def sum(self, *, keepdims: bool = False, axis: _1_AllAx = None, out: Optional["Floats1d"] = None) -> _1F_ReduceResults: ... class Ints1d(_Array1d, _Ints): """1-dimensional array of ints.""" T: "Ints1d" @classmethod def __get_validators__(cls): """Runtime validation for pydantic.""" yield lambda v: validate_array(v, ndim=1, dtype="i") @abstractmethod def __iter__(self) -> Iterator[int]: ... @overload @abstractmethod def __getitem__(self, key: _1_KeyScalar) -> int: ... @overload @abstractmethod def __getitem__(self, key: _1_Key1d) -> "Ints1d": ... @abstractmethod def __getitem__(self, key: _1_AllKeys) -> _I1_AllReturns: ... @overload @abstractmethod def __setitem__(self, key: _1_KeyScalar, value: int) -> None: ... @overload @abstractmethod def __setitem__(self, key: _1_Key1d, value: Union[int, "Ints1d"]) -> None: ... @abstractmethod def __setitem__(self, key: _1_AllKeys, _I1_AllReturns) -> None: ... @overload @abstractmethod def cumsum(self, *, keepdims: Tru, axis: Optional[OneAx] = None, out: Optional["Ints1d"] = None) -> "Ints1d": ... @overload @abstractmethod def cumsum(self, *, keepdims: Fal = False, axis: Optional[OneAx] = None, out: Optional["Ints1d"] = None) -> "Ints1d": ... @abstractmethod def cumsum(self, *, keepdims: bool = False, axis: _1_AllAx = None, out: Optional["Ints1d"] = None) -> "Ints1d": ... @overload @abstractmethod def sum(self, *, keepdims: Tru, axis: Optional[OneAx] = None, out: Optional["Ints1d"] = None) -> "Ints1d": ... @overload @abstractmethod def sum(self, *, keepdims: Fal = False, axis: Optional[OneAx] = None, out = None) -> int: ... @abstractmethod def sum(self, *, keepdims: bool = False, axis: _1_AllAx = None, out: Optional["Ints1d"] = None) -> _1I_ReduceResults: ... class _Array2d(_Array): @classmethod def __get_validators__(cls): """Runtime validation for pydantic.""" yield lambda v: validate_array(v, ndim=2) @property @abstractmethod def ndim(self) -> Literal[2]: ... @property @abstractmethod def shape(self) -> Tuple[int, int]: ... @abstractmethod def __iter__(self) -> Iterator[Array1d]: ... @abstractmethod def astype(self, dtype: DTypes, order: str = ..., casting: str = ..., subok: bool = ..., copy: bool = ...) -> "Array2d": ... # These is actually a bit too strict: It's legal to say 'array2d + array3d' # That's kind of bad code though; it's better to write array3d + array2d. # We could relax this, but let's try the strict version. @abstractmethod def __add__(self: ArrayT, other: Union[float, int, Array1d, "Array2d"]) -> ArrayT: ... @abstractmethod def __sub__(self: ArrayT, other: Union[float, int, Array1d, "Array2d"]) -> ArrayT: ... @abstractmethod def __mul__(self: ArrayT, other: Union[float, int, Array1d, "Array2d"]) -> ArrayT: ... @abstractmethod def __pow__(self: ArrayT, other: Union[float, int, Array1d, "Array2d"]) -> ArrayT: ... @abstractmethod def __matmul__(self: ArrayT, other: Union[float, int, Array1d, "Array2d"]) -> ArrayT: ... # These are not too strict though: you can't do += with higher dimensional. @abstractmethod def __iadd__(self, other: Union[float, int, Array1d, "Array2d"]): ... @abstractmethod def __isub__(self, other: Union[float, int, Array1d, "Array2d"]): ... @abstractmethod def __imul__(self, other: Union[float, int, Array1d, "Array2d"]): ... @abstractmethod def __ipow__(self, other: Union[float, int, Array1d, "Array2d"]): ... @overload @abstractmethod def argmax(self, keepdims: Fal = False, axis: int = -1, out: Optional[_Array] = None) -> Ints1d: ... @overload @abstractmethod def argmax(self, keepdims: Tru, axis: int = -1, out: Optional[_Array] = None) -> "Ints2d": ... @abstractmethod def argmax(self, keepdims: bool = False, axis: int = -1, out: Optional[_Array] = None) -> Union[Ints1d, "Ints2d"]: ... @overload @abstractmethod def mean(self, keepdims: Fal = False, axis: int = -1, dtype: Optional[DTypes] = None, out: Optional["Floats2d"] = None) -> Floats1d: ... @overload @abstractmethod def mean(self, keepdims: Tru, axis: int = -1, dtype: Optional[DTypes] = None, out: Optional["Floats2d"] = None) -> "Floats2d": ... @abstractmethod def mean(self, keepdims: bool = False, axis: int = -1, dtype: Optional[DTypes] = None, out: Optional["Floats2d"] = None) -> Union["Floats2d", Floats1d]: ... class Floats2d(_Array2d, _Floats): """2-dimensional array of floats""" T: "Floats2d" @classmethod def __get_validators__(cls): """Runtime validation for pydantic.""" yield lambda v: validate_array(v, ndim=2, dtype="f") @abstractmethod def __iter__(self) -> Iterator[Floats1d]: ... @overload @abstractmethod def __getitem__(self, key: _2_KeyScalar) -> float: ... @overload @abstractmethod def __getitem__(self, key: _2_Key1d) -> Floats1d: ... @overload @abstractmethod def __getitem__(self, key: _2_Key2d) -> "Floats2d": ... @abstractmethod def __getitem__(self, key: _2_AllKeys) -> _F2_AllReturns: ... @overload @abstractmethod def __setitem__(self, key: _2_KeyScalar, value: float) -> None: ... @overload @abstractmethod def __setitem__(self, key: _2_Key1d, value: Union[float, Floats1d]) -> None: ... @overload @abstractmethod def __setitem__(self, key: _2_Key2d, value: _F2_AllReturns) -> None: ... @abstractmethod def __setitem__(self, key: _2_AllKeys, value: _F2_AllReturns) -> None: ... @overload @abstractmethod def sum(self, *, keepdims: Tru, axis: _2_AllAx = None, out: Optional["Floats2d"] = None) -> "Floats2d": ... @overload @abstractmethod def sum(self, *, keepdims: Fal = False, axis: OneAx, out: Optional[Floats1d] = None) -> Floats1d: ... @overload @abstractmethod def sum(self, *, keepdims: Fal = False, axis: TwoAx, out = None) -> float: ... @abstractmethod def sum(self, *, keepdims: bool = False, axis: _2_AllAx = None, out: Union[None, "Floats1d", "Floats2d"] = None) -> _2F_ReduceResults: ... class Ints2d(_Array2d, _Ints): """2-dimensional array of ints.""" T: "Ints2d" @classmethod def __get_validators__(cls): """Runtime validation for pydantic.""" yield lambda v: validate_array(v, ndim=2, dtype="i") @abstractmethod def __iter__(self) -> Iterator[Ints1d]: ... @overload @abstractmethod def __getitem__(self, key: _2_KeyScalar) -> int: ... @overload @abstractmethod def __getitem__(self, key: _2_Key1d) -> Ints1d: ... @overload @abstractmethod def __getitem__(self, key: _2_Key2d) -> "Ints2d": ... @abstractmethod def __getitem__(self, key: _2_AllKeys) -> _I2_AllReturns: ... @overload @abstractmethod def __setitem__(self, key: _2_KeyScalar, value: int) -> None: ... @overload @abstractmethod def __setitem__(self, key: _2_Key1d, value: Ints1d) -> None: ... @overload @abstractmethod def __setitem__(self, key: _2_Key2d, value: "Ints2d") -> None: ... @abstractmethod def __setitem__(self, key: _2_AllKeys, value: _I2_AllReturns) -> None: ... @overload @abstractmethod def sum(self, keepdims: Fal = False, axis: int = -1, out: Optional["Ints1d"] = None) -> Ints1d: ... @overload @abstractmethod def sum(self, keepdims: Tru, axis: int = -1, out: Optional["Ints2d"] = None) -> "Ints2d": ... @abstractmethod def sum(self, keepdims: bool = False, axis: int = -1, out: Optional[Union["Ints1d", "Ints2d"]] = None) -> Union["Ints2d", Ints1d]: ... class _Array3d(_Array): """3-dimensional array of floats""" @classmethod def __get_validators__(cls): """Runtime validation for pydantic.""" yield lambda v: validate_array(v, ndim=3) @property @abstractmethod def ndim(self) -> Literal[3]: ... @property @abstractmethod def shape(self) -> Tuple[int, int, int]: ... @abstractmethod def __iter__(self) -> Iterator[Array2d]: ... @abstractmethod def astype(self, dtype: DTypes, order: str = ..., casting: str = ..., subok: bool = ..., copy: bool = ...) -> "Array3d": ... # These is actually a bit too strict: It's legal to say 'array2d + array3d' # That's kind of bad code though; it's better to write array3d + array2d. # We could relax this, but let's try the strict version. @abstractmethod def __add__(self: SelfT, other: Union[float, int, Array1d, Array2d, "Array3d"]) -> SelfT: ... @abstractmethod def __sub__(self: SelfT, other: Union[float, int, Array1d, Array2d, "Array3d"]) -> SelfT: ... @abstractmethod def __mul__(self: SelfT, other: Union[float, int, Array1d, Array2d, "Array3d"]) -> SelfT: ... @abstractmethod def __pow__(self: SelfT, other: Union[float, int, Array1d, Array2d, "Array3d"]) -> SelfT: ... @abstractmethod def __matmul__(self: SelfT, other: Union[float, int, Array1d, Array2d, "Array3d"]) -> SelfT: ... # These are not too strict though: you can't do += with higher dimensional. @abstractmethod def __iadd__(self, other: Union[float, int, Array1d, Array2d, "Array3d"]): ... @abstractmethod def __isub__(self, other: Union[float, int, Array1d, Array2d, "Array3d"]): ... @abstractmethod def __imul__(self, other: Union[float, int, Array1d, Array2d, "Array3d"]): ... @abstractmethod def __ipow__(self, other: Union[float, int, Array1d, Array2d, "Array3d"]): ... @overload @abstractmethod def argmax(self, keepdims: Fal = False, axis: int = -1, out: Optional[_Array] = None) -> Ints2d: ... @overload @abstractmethod def argmax(self, keepdims: Tru, axis: int = -1, out: Optional[_Array] = None) -> "Ints3d": ... @abstractmethod def argmax(self, keepdims: bool = False, axis: int = -1, out: Optional[_Array] = None) -> Union[Ints2d, "Ints3d"]: ... class Floats3d(_Array3d, _Floats): """3-dimensional array of floats""" T: "Floats3d" @classmethod def __get_validators__(cls): """Runtime validation for pydantic.""" yield lambda v: validate_array(v, ndim=3, dtype="f") @abstractmethod def __iter__(self) -> Iterator[Floats2d]: ... @overload @abstractmethod def __getitem__(self, key: _3_KeyScalar) -> float: ... @overload @abstractmethod def __getitem__(self, key: _3_Key1d) -> Floats1d: ... @overload @abstractmethod def __getitem__(self, key: _3_Key2d) -> Floats2d: ... @overload @abstractmethod def __getitem__(self, key: _3_Key3d) -> "Floats3d": ... @abstractmethod def __getitem__(self, key: _3_AllKeys) -> _F3_AllReturns: ... @overload @abstractmethod def __setitem__(self, key: _3_KeyScalar, value: float) -> None: ... @overload @abstractmethod def __setitem__(self, key: _3_Key1d, value: Floats1d) -> None: ... @overload @abstractmethod def __setitem__(self, key: _3_Key2d, value: Floats2d) -> None: ... @overload @abstractmethod def __setitem__(self, key: _3_Key3d, value: "Floats3d") -> None: ... @abstractmethod def __setitem__(self, key: _3_AllKeys, value: _F3_AllReturns) -> None: ... @overload @abstractmethod def sum(self, *, keepdims: Tru, axis: _3_AllAx = None, out: Optional["Floats3d"] = None) -> "Floats3d": ... @overload @abstractmethod def sum(self, *, keepdims: Fal, axis: OneAx, out: Optional[Floats2d] = None) -> Floats2d: ... @overload @abstractmethod def sum(self, *, keepdims: Fal, axis: TwoAx, out: Optional[Floats1d] = None) -> Floats1d: ... @overload @abstractmethod def sum(self, *, keepdims: Fal, axis: Optional[ThreeAx], out = None) -> float: ... @abstractmethod def sum(self, *, keepdims: bool = False, axis: _3_AllAx = None, out: Union[None, Floats1d, Floats2d, "Floats3d"] = None) -> _3F_ReduceResults: ... class Ints3d(_Array3d, _Ints): """3-dimensional array of ints.""" T: "Ints3d" @classmethod def __get_validators__(cls): """Runtime validation for pydantic.""" yield lambda v: validate_array(v, ndim=3, dtype="i") @abstractmethod def __iter__(self) -> Iterator[Ints2d]: ... @overload @abstractmethod def __getitem__(self, key: _3_KeyScalar) -> int: ... @overload @abstractmethod def __getitem__(self, key: _3_Key1d) -> Ints1d: ... @overload @abstractmethod def __getitem__(self, key: _3_Key2d) -> Ints2d: ... @overload @abstractmethod def __getitem__(self, key: _3_Key3d) -> "Ints3d": ... @abstractmethod def __getitem__(self, key: _3_AllKeys) -> _I3_AllReturns: ... @overload @abstractmethod def __setitem__(self, key: _3_KeyScalar, value: int) -> None: ... @overload @abstractmethod def __setitem__(self, key: _3_Key1d, value: Ints1d) -> None: ... @overload @abstractmethod def __setitem__(self, key: _3_Key2d, value: Ints2d) -> None: ... @overload @abstractmethod def __setitem__(self, key: _3_Key3d, value: "Ints3d") -> None: ... @abstractmethod def __setitem__(self, key: _3_AllKeys, value: _I3_AllReturns) -> None: ... @overload @abstractmethod def sum(self, *, keepdims: Tru, axis: _3_AllAx = None, out: Optional["Ints3d"] = None) -> "Ints3d": ... @overload @abstractmethod def sum(self, *, keepdims: Fal, axis: OneAx, out: Optional[Ints2d] = None) -> Ints2d: ... @overload @abstractmethod def sum(self, *, keepdims: Fal, axis: TwoAx, out: Optional[Ints1d] = None) -> Ints1d: ... @overload @abstractmethod def sum(self, *, keepdims: Fal, axis: Optional[ThreeAx], out = None) -> int: ... @abstractmethod def sum(self, *, keepdims: bool = False, axis: _3_AllAx = None, out: Union[None, Ints1d, Ints2d, "Ints3d"] = None) -> _3I_ReduceResults: ... class _Array4d(_Array): """4-dimensional array.""" @classmethod def __get_validators__(cls): """Runtime validation for pydantic.""" yield lambda v: validate_array(v, ndim=4) @property @abstractmethod def ndim(self) -> Literal[4]: ... @property @abstractmethod def shape(self) -> Tuple[int, int, int, int]: ... @abstractmethod def __iter__(self) -> Iterator[Array3d]: ... @abstractmethod def astype(self, dtype: DTypes, order: str = ..., casting: str = ..., subok: bool = ..., copy: bool = ...) -> "_Array4d": ... # These is actually a bit too strict: It's legal to say 'array4d + array5d' # That's kind of bad code though; it's better to write array5d + array4d. # We could relax this, but let's try the strict version. @abstractmethod def __add__(self: SelfT, other: Union[float, int, Array1d, Array2d, Array3d, "Array4d"]) -> SelfT: ... @abstractmethod def __sub__(self: SelfT, other: Union[float, int, Array1d, Array2d, Array3d, "Array4d"]) -> SelfT: ... @abstractmethod def __mul__(self: SelfT, other: Union[float, int, Array1d, Array2d, Array3d, "Array4d"]) -> SelfT: ... @abstractmethod def __pow__(self: SelfT, other: Union[float, int, Array1d, Array2d, Array3d, "Array4d"]) -> SelfT: ... @abstractmethod def __matmul__(self: SelfT, other: Union[float, int, Array1d, Array2d, Array3d, "Array4d"]) -> SelfT: ... @abstractmethod # These are not too strict though: you can't do += with higher dimensional. @abstractmethod def __iadd__(self, other: Union[float, int, Array1d, Array2d, Array3d, "Array4d"]): ... @abstractmethod def __isub__(self, other: Union[float, int, Array1d, Array2d, Array3d, "Array4d"]): ... @abstractmethod def __imul__(self, other: Union[float, int, Array1d, Array2d, Array3d, "Array4d"]): ... @abstractmethod def __ipow__(self, other: Union[float, int, Array1d, Array2d, Array3d, "Array4d"]): ... class Floats4d(_Array4d, _Floats): """4-dimensional array of floats.""" T: "Floats4d" @classmethod def __get_validators__(cls): """Runtime validation for pydantic.""" yield lambda v: validate_array(v, ndim=4, dtype="f") @abstractmethod def __iter__(self) -> Iterator[Floats3d]: ... @overload @abstractmethod def __getitem__(self, key: _4_KeyScalar) -> float: ... @overload @abstractmethod def __getitem__(self, key: _4_Key1d) -> Floats1d: ... @overload @abstractmethod def __getitem__(self, key: _4_Key2d) -> Floats2d: ... @overload @abstractmethod def __getitem__(self, key: _4_Key3d) -> Floats3d: ... @overload @abstractmethod def __getitem__(self, key: _4_Key4d) -> "Floats4d": ... @abstractmethod def __getitem__(self, key: _4_AllKeys) -> _F4_AllReturns: ... @overload @abstractmethod def __setitem__(self, key: _4_KeyScalar, value: float) -> None: ... @overload @abstractmethod def __setitem__(self, key: _4_Key1d, value: Floats1d) -> None: ... @overload @abstractmethod def __setitem__(self, key: _4_Key2d, value: Floats2d) -> None: ... @overload @abstractmethod def __setitem__(self, key: _4_Key3d, value: Floats3d) -> None: ... @overload @abstractmethod def __setitem__(self, key: _4_Key4d, value: "Floats4d") -> None: ... @abstractmethod def __setitem__(self, key: _4_AllKeys, value: _F4_AllReturns) -> None: ... @overload @abstractmethod def sum(self, *, keepdims: Tru, axis: _4_AllAx = None, out: Optional["Floats4d"] = None) -> "Floats4d": ... @overload @abstractmethod def sum(self, *, keepdims: Fal = False, axis: OneAx, out: Optional[Floats3d] = None) -> Floats3d: ... @overload @abstractmethod def sum(self, *, keepdims: Fal = False, axis: TwoAx, out: Optional[Floats2d] = None) -> Floats2d: ... @overload @abstractmethod def sum(self, *, keepdims: Fal = False, axis: ThreeAx, out: Optional[Floats1d] = None) -> Floats1d: ... @overload @abstractmethod def sum(self, *, keepdims: Fal = False, axis: Optional[FourAx], out = None) -> float: ... @abstractmethod def sum(self, *, keepdims: bool = False, axis: _4_AllAx = None, out: Union[None, Floats1d, Floats2d, Floats3d, "Floats4d"] = None) -> _4F_ReduceResults: ... class Ints4d(_Array4d, _Ints): """4-dimensional array of ints.""" T: "Ints4d" @classmethod def __get_validators__(cls): """Runtime validation for pydantic.""" yield lambda v: validate_array(v, ndim=4, dtype="i") @abstractmethod def __iter__(self) -> Iterator[Ints3d]: ... @overload @abstractmethod def __getitem__(self, key: _4_KeyScalar) -> int: ... @overload @abstractmethod def __getitem__(self, key: _4_Key1d) -> Ints1d: ... @overload @abstractmethod def __getitem__(self, key: _4_Key2d) -> Ints2d: ... @overload @abstractmethod def __getitem__(self, key: _4_Key3d) -> Ints3d: ... @overload @abstractmethod def __getitem__(self, key: _4_Key4d) -> "Ints4d": ... @abstractmethod def __getitem__(self, key: _4_AllKeys) -> _I4_AllReturns: ... @overload @abstractmethod def __setitem__(self, key: _4_KeyScalar, value: int) -> None: ... @overload @abstractmethod def __setitem__(self, key: _4_Key1d, value: Ints1d) -> None: ... @overload @abstractmethod def __setitem__(self, key: _4_Key2d, value: Ints2d) -> None: ... @overload @abstractmethod def __setitem__(self, key: _4_Key3d, value: Ints3d) -> None: ... @overload @abstractmethod def __setitem__(self, key: _4_Key4d, value: "Ints4d") -> None: ... @abstractmethod def __setitem__(self, key: _4_AllKeys, value: _I4_AllReturns) -> None: ... @overload @abstractmethod def sum(self, *, keepdims: Tru, axis: _4_AllAx = None, out: Optional["Ints4d"] = None) -> "Ints4d": ... @overload @abstractmethod def sum(self, *, keepdims: Fal = False, axis: OneAx, out: Optional[Ints3d] = None) -> Ints3d: ... @overload @abstractmethod def sum(self, *, keepdims: Fal = False, axis: TwoAx, out: Optional[Ints2d] = None) -> Ints2d: ... @overload @abstractmethod def sum(self, *, keepdims: Fal = False, axis: ThreeAx, out: Optional[Ints1d] = None) -> Ints1d: ... @overload @abstractmethod def sum(self, *, keepdims: Fal = False, axis: Optional[FourAx] = None, out = None) -> int: ... @abstractmethod def sum(self, *, keepdims: bool = False, axis: _4_AllAx = None, out: Optional[Union[Ints1d, Ints2d, Ints3d, "Ints4d"]] = None) -> _4I_ReduceResults: ... _DIn = TypeVar("_DIn") class Decorator(Protocol): """Protocol to mark a function as returning its child with identical signature.""" def __call__(self, name: str) -> Callable[[_DIn], _DIn]: ... # fmt: on class Generator(Iterator): """Custom generator type. Used to annotate function arguments that accept generators so they can be validated by pydantic (which doesn't support iterators/iterables otherwise). """ @classmethod def __get_validators__(cls): yield cls.validate @classmethod def validate(cls, v): if not hasattr(v, "__iter__") and not hasattr(v, "__next__"): raise TypeError("not a valid iterator") return v @dataclass class SizedGenerator: """A generator that has a __len__ and can repeatedly call the generator function. """ get_items: Callable[[], Generator] length: int def __len__(self): return self.length def __iter__(self): yield from self.get_items() @dataclass class Padded: """A batch of padded sequences, sorted by decreasing length. The data array is of shape (step, batch, ...). The auxiliary array size_at_t indicates the length of the batch at each timestep, so you can do data[:, :size_at_t[t]] to shrink the batch. The lengths array indicates the length of each row b, and the indices indicates the original ordering. """ data: Array3d size_at_t: Ints1d lengths: Ints1d indices: Ints1d def copy(self): return Padded( self.data.copy(), self.size_at_t.copy(), self.lengths.copy(), self.indices.copy(), ) def __len__(self) -> int: return self.lengths.shape[0] def __getitem__(self, index: Union[int, slice, Ints1d]) -> "Padded": if isinstance(index, int): # Slice to keep the dimensionality return Padded( self.data[:, index : index + 1], self.lengths[index : index + 1], self.lengths[index : index + 1], self.indices[index : index + 1], ) elif isinstance(index, slice): return Padded( self.data[:, index], self.lengths[index], self.lengths[index], self.indices[index], ) else: # If we get a sequence of indices, we need to be careful that # we maintain the length-sorting, while also keeping the mapping # back to the original order correct. sorted_index = list(sorted(index)) return Padded( self.data[sorted_index], self.size_at_t[sorted_index], self.lengths[sorted_index], self.indices[index], # Use original, to maintain order. ) @dataclass class Ragged: """A batch of concatenated sequences, that vary in the size of their first dimension. Ragged allows variable-length sequence data to be contiguous in memory, without padding. Indexing into Ragged is just like indexing into the *lengths* array, except it returns a Ragged object with the accompanying sequence data. For instance, you can write ragged[1:4] to get a Ragged object with sequences 1, 2 and 3. """ data: Array2d lengths: Ints1d data_shape: Tuple[int, ...] starts_ends: Optional[Ints1d] = None def __init__(self, data: _Array, lengths: Ints1d): self.lengths = lengths # Frustratingly, the -1 dimension doesn't work with 0 size... if data.size: self.data = cast(Array2d, data.reshape((data.shape[0], -1))) else: self.data = cast(Array2d, data.reshape((0, 0))) self.data_shape = (-1,) + data.shape[1:] @property def dataXd(self) -> ArrayXd: if self.data.size: reshaped = self.data.reshape(self.data_shape) else: reshaped = self.data.reshape((self.data.shape[0],) + self.data_shape[1:]) return cast(ArrayXd, reshaped) def __len__(self) -> int: return self.lengths.shape[0] def __getitem__(self, index: Union[int, slice, Array1d]) -> "Ragged": if isinstance(index, tuple): raise IndexError("Ragged arrays do not support 2d indexing.") starts = self._get_starts() ends = self._get_ends() if isinstance(index, int): s = starts[index] e = ends[index] return Ragged(self.data[s:e], self.lengths[index : index + 1]) elif isinstance(index, slice): lengths = self.lengths[index] if len(lengths) == 0: return Ragged(self.data[0:0].reshape(self.data_shape), lengths) start = starts[index][0] if index.start >= 1 else 0 end = ends[index][-1] return Ragged(self.data[start:end].reshape(self.data_shape), lengths) else: # There must be a way to do this "properly" :(. Sigh, hate numpy. xp = get_array_module(self.data) data = xp.vstack([self[int(i)].data for i in index]) return Ragged(data.reshape(self.data_shape), self.lengths[index]) def _get_starts_ends(self) -> Ints1d: if self.starts_ends is None: xp = get_array_module(self.lengths) self.starts_ends = xp.empty(self.lengths.size + 1, dtype="i") self.starts_ends[0] = 0 self.lengths.cumsum(out=self.starts_ends[1:]) return self.starts_ends def _get_starts(self) -> Ints1d: return self._get_starts_ends()[:-1] def _get_ends(self) -> Ints1d: return self._get_starts_ends()[1:] _P = TypeVar("_P", bound=Sequence) @dataclass class Pairs(Generic[_P]): """Dataclass for pairs of sequences that allows indexing into the sequences while keeping them aligned. """ one: _P two: _P def __getitem__(self, index) -> "Pairs[_P]": return Pairs(self.one[index], self.two[index]) def __len__(self) -> int: return len(self.one) @dataclass class ArgsKwargs: """A tuple of (args, kwargs) that can be spread into some function f: f(*args, **kwargs) """ args: Tuple[Any, ...] kwargs: Dict[str, Any] @classmethod def from_items(cls, items: Sequence[Tuple[Union[int, str], Any]]) -> "ArgsKwargs": """Create an ArgsKwargs object from a sequence of (key, value) tuples, such as produced by argskwargs.items(). Each key should be either a string or an integer. Items with int keys are added to the args list, and items with string keys are added to the kwargs list. The args list is determined by sequence order, not the value of the integer. """ args = [] kwargs = {} for key, value in items: if isinstance(key, int): args.append(value) else: kwargs[key] = value return cls(args=tuple(args), kwargs=kwargs) def keys(self) -> Iterable[Union[int, str]]: """Yield indices from self.args, followed by keys from self.kwargs.""" yield from range(len(self.args)) yield from self.kwargs.keys() def values(self) -> Iterable[Any]: """Yield elements of from self.args, followed by values from self.kwargs.""" yield from self.args yield from self.kwargs.values() def items(self) -> Iterable[Tuple[Union[int, str], Any]]: """Yield enumerate(self.args), followed by self.kwargs.items()""" yield from enumerate(self.args) yield from self.kwargs.items() @dataclass class Unserializable: """Wrap a value to prevent it from being serialized by msgpack.""" obj: Any def validate_array(obj, ndim=None, dtype=None): """Runtime validator for pydantic to validate array types.""" xp = get_array_module(obj) if not isinstance(obj, xp.ndarray): raise TypeError("not a valid numpy or cupy array") errors = [] if ndim is not None and obj.ndim != ndim: errors.append(f"wrong array dimensions (expected {ndim}, got {obj.ndim})") if dtype is not None: dtype_mapping = {"f": ["float32"], "i": ["int32", "int64", "uint32", "uint64"]} expected_types = dtype_mapping.get(dtype, []) if obj.dtype not in expected_types: expected = "/".join(expected_types) err = f"wrong array data type (expected {expected}, got {obj.dtype})" errors.append(err) if errors: raise ValueError(", ".join(errors)) return obj thinc-release-v9.1.1/thinc/util.py000066400000000000000000000512021467064331700171020ustar00rootroot00000000000000import contextlib import functools import inspect import os import platform import random import tempfile import threading from contextvars import ContextVar from dataclasses import dataclass from typing import ( TYPE_CHECKING, Any, Callable, Dict, List, Mapping, Optional, Sequence, Tuple, TypeVar, Union, cast, ) import numpy from packaging.version import Version try: from pydantic.v1 import ValidationError, create_model except ImportError: from pydantic import ValidationError, create_model # type: ignore import numpy from wasabi import table # type: ignore from . import types # noqa: E402 from .compat import ( cupy, cupy_from_dlpack, has_cupy, has_cupy_gpu, has_gpu, has_mxnet, has_tensorflow, has_torch, has_torch_cuda_gpu, has_torch_mps, ) from .compat import mxnet as mx from .compat import tensorflow as tf from .compat import torch from .types import ArgsKwargs, ArrayXd, FloatsXd, IntsXd, Padded, Ragged # noqa: E402 if TYPE_CHECKING: from .api import Ops DATA_VALIDATION: ContextVar[bool] = ContextVar("DATA_VALIDATION", default=False) def get_torch_default_device() -> "torch.device": if torch is None: raise ValueError("Cannot get default Torch device when Torch is not available.") from .backends import get_current_ops from .backends.cupy_ops import CupyOps from .backends.mps_ops import MPSOps ops = get_current_ops() if isinstance(ops, CupyOps): device_id = torch.cuda.current_device() return torch.device(f"cuda:{device_id}") elif isinstance(ops, MPSOps): return torch.device("mps") return torch.device("cpu") def get_array_module(arr): # pragma: no cover if is_numpy_array(arr): return numpy elif is_cupy_array(arr): return cupy else: raise ValueError( "Only numpy and cupy arrays are supported" f", but found {type(arr)} instead. If " "get_array_module module wasn't called " "directly, this might indicate a bug in Thinc." ) def gpu_is_available(): return has_gpu def fix_random_seed(seed: int = 0) -> None: # pragma: no cover """Set the random seed across random, numpy.random and cupy.random.""" random.seed(seed) numpy.random.seed(seed) if has_torch: torch.manual_seed(seed) if has_cupy_gpu: cupy.random.seed(seed) if has_torch and has_torch_cuda_gpu: torch.cuda.manual_seed_all(seed) torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False def is_xp_array(obj: Any) -> bool: """Check whether an object is a numpy or cupy array.""" return is_numpy_array(obj) or is_cupy_array(obj) def is_cupy_array(obj: Any) -> bool: # pragma: no cover """Check whether an object is a cupy array.""" if not has_cupy: return False elif isinstance(obj, cupy.ndarray): return True else: return False def is_numpy_array(obj: Any) -> bool: """Check whether an object is a numpy array.""" if isinstance(obj, numpy.ndarray): return True else: return False def is_torch_array(obj: Any) -> bool: # pragma: no cover if torch is None: return False elif isinstance(obj, torch.Tensor): return True else: return False def is_torch_cuda_array(obj: Any) -> bool: # pragma: no cover return is_torch_array(obj) and obj.is_cuda def is_torch_gpu_array(obj: Any) -> bool: # pragma: no cover return is_torch_cuda_array(obj) or is_torch_mps_array(obj) def is_torch_mps_array(obj: Any) -> bool: # pragma: no cover return is_torch_array(obj) and hasattr(obj, "is_mps") and obj.is_mps def is_tensorflow_array(obj: Any) -> bool: # pragma: no cover if not has_tensorflow: return False elif isinstance(obj, tf.Tensor): # type: ignore return True else: return False def is_tensorflow_gpu_array(obj: Any) -> bool: # pragma: no cover return is_tensorflow_array(obj) and "GPU:" in obj.device def is_mxnet_array(obj: Any) -> bool: # pragma: no cover if not has_mxnet: return False elif isinstance(obj, mx.nd.NDArray): # type: ignore return True else: return False def is_mxnet_gpu_array(obj: Any) -> bool: # pragma: no cover return is_mxnet_array(obj) and obj.context.device_type != "cpu" def to_numpy(data): # pragma: no cover if isinstance(data, numpy.ndarray): return data elif has_cupy and isinstance(data, cupy.ndarray): return data.get() else: return numpy.array(data) def set_active_gpu(gpu_id: int) -> "cupy.cuda.Device": # pragma: no cover """Set the current GPU device for cupy and torch (if available).""" if not has_cupy_gpu: raise ValueError("No CUDA GPU devices detected") device = cupy.cuda.device.Device(gpu_id) device.use() if has_torch_cuda_gpu: torch.cuda.set_device(gpu_id) return device def require_cpu() -> bool: # pragma: no cover """Use CPU through best available backend.""" from .backends import get_ops, set_current_ops ops = get_ops("cpu") set_current_ops(ops) return True def prefer_gpu(gpu_id: int = 0) -> bool: # pragma: no cover """Use GPU if it's available. Returns True if so, False otherwise.""" if has_gpu: require_gpu(gpu_id=gpu_id) return has_gpu def require_gpu(gpu_id: int = 0) -> bool: # pragma: no cover from .backends import CupyOps, MPSOps, set_current_ops if platform.system() == "Darwin" and not has_torch_mps: if has_torch: raise ValueError("Cannot use GPU, installed PyTorch does not support MPS") raise ValueError("Cannot use GPU, PyTorch is not installed") elif platform.system() != "Darwin" and not has_cupy: raise ValueError("Cannot use GPU, CuPy is not installed") elif not has_gpu: raise ValueError("No GPU devices detected") if has_cupy_gpu: set_current_ops(CupyOps()) set_active_gpu(gpu_id) else: set_current_ops(MPSOps()) return True def copy_array(dst: ArrayXd, src: ArrayXd) -> None: # pragma: no cover if isinstance(dst, numpy.ndarray) and isinstance(src, numpy.ndarray): dst[:] = src elif is_cupy_array(dst): src = cupy.array(src, copy=False) cupy.copyto(dst, src) else: numpy.copyto(dst, src) # type: ignore def to_categorical( Y: IntsXd, n_classes: Optional[int] = None, *, label_smoothing: float = 0.0, ) -> FloatsXd: if n_classes is None: n_classes = int(numpy.max(Y) + 1) # type: ignore if label_smoothing < 0.0: raise ValueError( "Label-smoothing parameter has to be greater than or equal to 0" ) if label_smoothing == 0.0: if n_classes == 0: raise ValueError("n_classes should be at least 1") nongold_prob = 0.0 else: if not n_classes > 1: raise ValueError( "n_classes should be greater than 1 when label smoothing is enabled," f"but {n_classes} was provided." ) nongold_prob = label_smoothing / (n_classes - 1) max_smooth = (n_classes - 1) / n_classes if n_classes > 1 and label_smoothing >= max_smooth: raise ValueError( f"For {n_classes} classes " "label_smoothing parameter has to be less than " f"{max_smooth}, but found {label_smoothing}." ) xp = get_array_module(Y) label_distr = xp.full((n_classes, n_classes), nongold_prob, dtype="float32") xp.fill_diagonal(label_distr, 1 - label_smoothing) return label_distr[Y] def get_width( X: Union[ArrayXd, Ragged, Padded, Sequence[ArrayXd]], *, dim: int = -1 ) -> int: """Infer the 'width' of a batch of data, which could be any of: Array, Ragged, Padded or Sequence of Arrays. """ if isinstance(X, Ragged): return get_width(X.data, dim=dim) elif isinstance(X, Padded): return get_width(X.data, dim=dim) elif hasattr(X, "shape") and hasattr(X, "ndim"): X = cast(ArrayXd, X) if len(X.shape) == 0: return 0 elif len(X.shape) == 1: return int(X.max()) + 1 else: return X.shape[dim] elif isinstance(X, (list, tuple)): if len(X) == 0: return 0 else: return get_width(X[0], dim=dim) else: err = "Cannot get width of object: has neither shape nor __getitem__" raise ValueError(err) def assert_tensorflow_installed() -> None: # pragma: no cover """Raise an ImportError if TensorFlow is not installed.""" template = "TensorFlow support requires {pkg}: pip install thinc[tensorflow]\n\nEnable TensorFlow support with thinc.api.enable_tensorflow()" if not has_tensorflow: raise ImportError(template.format(pkg="tensorflow>=2.0.0,<2.6.0")) def assert_mxnet_installed() -> None: # pragma: no cover """Raise an ImportError if MXNet is not installed.""" if not has_mxnet: raise ImportError( "MXNet support requires mxnet: pip install thinc[mxnet]\n\nEnable MXNet support with thinc.api.enable_mxnet()" ) def assert_pytorch_installed() -> None: # pragma: no cover """Raise an ImportError if PyTorch is not installed.""" if not has_torch: raise ImportError("PyTorch support requires torch: pip install thinc[torch]") def convert_recursive( is_match: Callable[[Any], bool], convert_item: Callable[[Any], Any], obj: Any ) -> Any: """Either convert a single value if it matches a given function, or recursively walk over potentially nested lists, tuples and dicts applying the conversion, and returns the same type. Also supports the ArgsKwargs dataclass. """ if is_match(obj): return convert_item(obj) elif isinstance(obj, ArgsKwargs): converted = convert_recursive(is_match, convert_item, list(obj.items())) return ArgsKwargs.from_items(converted) elif isinstance(obj, dict): converted = {} for key, value in obj.items(): key = convert_recursive(is_match, convert_item, key) value = convert_recursive(is_match, convert_item, value) converted[key] = value return converted elif isinstance(obj, list): return [convert_recursive(is_match, convert_item, item) for item in obj] elif isinstance(obj, tuple): return tuple(convert_recursive(is_match, convert_item, item) for item in obj) else: return obj def iterate_recursive(is_match: Callable[[Any], bool], obj: Any) -> Any: """Either yield a single value if it matches a given function, or recursively walk over potentially nested lists, tuples and dicts yielding matching values. Also supports the ArgsKwargs dataclass. """ if is_match(obj): yield obj elif isinstance(obj, ArgsKwargs): yield from iterate_recursive(is_match, list(obj.items())) elif isinstance(obj, dict): for key, value in obj.items(): yield from iterate_recursive(is_match, key) yield from iterate_recursive(is_match, value) elif isinstance(obj, list) or isinstance(obj, tuple): for item in obj: yield from iterate_recursive(is_match, item) def xp2torch( xp_tensor: ArrayXd, requires_grad: bool = False, device: Optional["torch.device"] = None, ) -> "torch.Tensor": # pragma: no cover """Convert a numpy or cupy tensor to a PyTorch tensor.""" assert_pytorch_installed() if device is None: device = get_torch_default_device() if hasattr(xp_tensor, "toDlpack"): dlpack_tensor = xp_tensor.toDlpack() # type: ignore torch_tensor = torch.utils.dlpack.from_dlpack(dlpack_tensor) elif hasattr(xp_tensor, "__dlpack__"): torch_tensor = torch.utils.dlpack.from_dlpack(xp_tensor) else: torch_tensor = torch.from_numpy(xp_tensor) torch_tensor = torch_tensor.to(device) if requires_grad: torch_tensor.requires_grad_() return torch_tensor def torch2xp( torch_tensor: "torch.Tensor", *, ops: Optional["Ops"] = None ) -> ArrayXd: # pragma: no cover """Convert a torch tensor to a numpy or cupy tensor depending on the `ops` parameter. If `ops` is `None`, the type of the resultant tensor will be determined by the source tensor's device. """ from .api import NumpyOps assert_pytorch_installed() if is_torch_cuda_array(torch_tensor): if isinstance(ops, NumpyOps): return torch_tensor.detach().cpu().numpy() else: return cupy_from_dlpack(torch.utils.dlpack.to_dlpack(torch_tensor)) else: if isinstance(ops, NumpyOps) or ops is None: return torch_tensor.detach().cpu().numpy() else: return cupy.asarray(torch_tensor) def xp2tensorflow( xp_tensor: ArrayXd, requires_grad: bool = False, as_variable: bool = False ) -> "tf.Tensor": # type: ignore # pragma: no cover """Convert a numpy or cupy tensor to a TensorFlow Tensor or Variable""" assert_tensorflow_installed() if hasattr(xp_tensor, "toDlpack"): dlpack_tensor = xp_tensor.toDlpack() # type: ignore tf_tensor = tf.experimental.dlpack.from_dlpack(dlpack_tensor) # type: ignore elif hasattr(xp_tensor, "__dlpack__"): dlpack_tensor = xp_tensor.__dlpack__() # type: ignore tf_tensor = tf.experimental.dlpack.from_dlpack(dlpack_tensor) # type: ignore else: tf_tensor = tf.convert_to_tensor(xp_tensor) # type: ignore if as_variable: # tf.Variable() automatically puts in GPU if available. # So we need to control it using the context manager with tf.device(tf_tensor.device): # type: ignore tf_tensor = tf.Variable(tf_tensor, trainable=requires_grad) # type: ignore if requires_grad is False and as_variable is False: # tf.stop_gradient() automatically puts in GPU if available. # So we need to control it using the context manager with tf.device(tf_tensor.device): # type: ignore tf_tensor = tf.stop_gradient(tf_tensor) # type: ignore return tf_tensor def tensorflow2xp( tf_tensor: "tf.Tensor", *, ops: Optional["Ops"] = None # type: ignore ) -> ArrayXd: # pragma: no cover """Convert a Tensorflow tensor to numpy or cupy tensor depending on the `ops` parameter. If `ops` is `None`, the type of the resultant tensor will be determined by the source tensor's device. """ from .api import NumpyOps assert_tensorflow_installed() if is_tensorflow_gpu_array(tf_tensor): if isinstance(ops, NumpyOps): return tf_tensor.numpy() else: dlpack_tensor = tf.experimental.dlpack.to_dlpack(tf_tensor) # type: ignore return cupy_from_dlpack(dlpack_tensor) else: if isinstance(ops, NumpyOps) or ops is None: return tf_tensor.numpy() else: return cupy.asarray(tf_tensor.numpy()) def xp2mxnet( xp_tensor: ArrayXd, requires_grad: bool = False ) -> "mx.nd.NDArray": # type: ignore # pragma: no cover """Convert a numpy or cupy tensor to a MXNet tensor.""" assert_mxnet_installed() if hasattr(xp_tensor, "toDlpack"): dlpack_tensor = xp_tensor.toDlpack() # type: ignore mx_tensor = mx.nd.from_dlpack(dlpack_tensor) # type: ignore else: mx_tensor = mx.nd.from_numpy(xp_tensor) # type: ignore if requires_grad: mx_tensor.attach_grad() return mx_tensor def mxnet2xp( mx_tensor: "mx.nd.NDArray", *, ops: Optional["Ops"] = None # type: ignore ) -> ArrayXd: # pragma: no cover """Convert a MXNet tensor to a numpy or cupy tensor.""" from .api import NumpyOps assert_mxnet_installed() if is_mxnet_gpu_array(mx_tensor): if isinstance(ops, NumpyOps): return mx_tensor.detach().asnumpy() else: return cupy_from_dlpack(mx_tensor.to_dlpack_for_write()) else: if isinstance(ops, NumpyOps) or ops is None: return mx_tensor.detach().asnumpy() else: return cupy.asarray(mx_tensor.asnumpy()) # This is how functools.partials seems to do it, too, to retain the return type PartialT = TypeVar("PartialT") def partial( func: Callable[..., PartialT], *args: Any, **kwargs: Any ) -> Callable[..., PartialT]: """Wrapper around functools.partial that retains docstrings and can include other workarounds if needed. """ partial_func = functools.partial(func, *args, **kwargs) partial_func.__doc__ = func.__doc__ return partial_func class DataValidationError(ValueError): def __init__( self, name: str, X: Any, Y: Any, errors: Union[Sequence[Mapping[str, Any]], List[Dict[str, Any]]] = [], ) -> None: """Custom error for validating inputs / outputs at runtime.""" message = f"Data validation error in '{name}'" type_info = f"X: {type(X)} Y: {type(Y)}" data = [] for error in errors: err_loc = " -> ".join([str(p) for p in error.get("loc", [])]) data.append((err_loc, error.get("msg"))) result = [message, type_info, table(data)] ValueError.__init__(self, "\n\n" + "\n".join(result)) class _ArgModelConfig: extra = "forbid" arbitrary_types_allowed = True def validate_fwd_input_output( name: str, func: Callable[[Any, Any, bool], Any], X: Any, Y: Any ) -> None: """Validate the input and output of a forward function against the type annotations, if available. Used in Model.initialize with the input and output samples as they pass through the network. """ sig = inspect.signature(func) empty = inspect.Signature.empty params = list(sig.parameters.values()) if len(params) != 3: bad_params = f"{len(params)} ({', '.join([p.name for p in params])})" err = f"Invalid forward function. Expected 3 arguments (model, X , is_train), got {bad_params}" raise DataValidationError(name, X, Y, [{"msg": err}]) annot_x = params[1].annotation annot_y = sig.return_annotation sig_args: Dict[str, Any] = {"__config__": _ArgModelConfig} args = {} if X is not None and annot_x != empty: if isinstance(X, list) and len(X) > 5: X = X[:5] sig_args["X"] = (annot_x, ...) args["X"] = X if Y is not None and annot_y != empty: if isinstance(Y, list) and len(Y) > 5: Y = Y[:5] sig_args["Y"] = (annot_y, ...) args["Y"] = (Y, lambda x: x) ArgModel = create_model("ArgModel", **sig_args) # Make sure the forward refs are resolved and the types used by them are # available in the correct scope. See #494 for details. ArgModel.update_forward_refs(**types.__dict__) try: ArgModel.parse_obj(args) except ValidationError as e: raise DataValidationError(name, X, Y, e.errors()) from None @contextlib.contextmanager def make_tempfile(mode="r"): f = tempfile.NamedTemporaryFile(mode=mode, delete=False) yield f f.close() os.remove(f.name) @contextlib.contextmanager def data_validation(validation): with threading.Lock(): prev = DATA_VALIDATION.get() DATA_VALIDATION.set(validation) yield DATA_VALIDATION.set(prev) @contextlib.contextmanager def use_nvtx_range(message: str, id_color: int = -1): """Context manager to register the executed code as an NVTX range. The ranges can be used as markers in CUDA profiling.""" if has_cupy: cupy.cuda.nvtx.RangePush(message, id_color) yield cupy.cuda.nvtx.RangePop() else: yield @dataclass class ArrayInfo: """Container for info for checking array compatibility.""" shape: types.Shape dtype: types.DTypes @classmethod def from_array(cls, arr: ArrayXd): return cls(shape=arr.shape, dtype=arr.dtype) def check_consistency(self, arr: ArrayXd): if arr.shape != self.shape: raise ValueError( f"Shape mismatch in backprop. Y: {self.shape}, dY: {arr.shape}" ) if arr.dtype != self.dtype: raise ValueError( f"Type mismatch in backprop. Y: {self.dtype}, dY: {arr.dtype}" ) # fmt: off __all__ = [ "get_array_module", "get_torch_default_device", "fix_random_seed", "is_cupy_array", "is_numpy_array", "set_active_gpu", "prefer_gpu", "require_gpu", "copy_array", "to_categorical", "get_width", "xp2torch", "torch2xp", "tensorflow2xp", "xp2tensorflow", "validate_fwd_input_output", "DataValidationError", "make_tempfile", "use_nvtx_range", "ArrayInfo", "has_cupy", "has_torch", ] # fmt: on thinc-release-v9.1.1/website/000077500000000000000000000000001467064331700161105ustar00rootroot00000000000000thinc-release-v9.1.1/website/.dockerignore000066400000000000000000000001731467064331700205650ustar00rootroot00000000000000# Avoid uploading large Docker contexts .cache/ public/ node_modules .npm logs *.log npm-debug.log* www/ _deploy.sh *.html thinc-release-v9.1.1/website/.eslintrc000066400000000000000000000017561467064331700177450ustar00rootroot00000000000000{ "extends": ["standard", "prettier"], "plugins": ["standard", "react", "react-hooks"], "rules": { "no-var": "error", "no-unused-vars": 1, "arrow-spacing": ["error", { "before": true, "after": true }], "indent": ["error", 4], "semi": ["error", "never"], "arrow-parens": ["error", "as-needed"], "standard/object-curly-even-spacing": ["error", "either"], "standard/array-bracket-even-spacing": ["error", "either"], "standard/computed-property-even-spacing": ["error", "even"], "standard/no-callback-literal": ["error", ["cb", "callback"]], "react/jsx-uses-react": "error", "react/jsx-uses-vars": "error", "react-hooks/rules-of-hooks": "error", "react-hooks/exhaustive-deps": "warn", "import/no-duplicates": "off", "new-cap": "off" }, "parser": "babel-eslint", "parserOptions": { "ecmaVersion": 8 }, "env": { "browser": true } } thinc-release-v9.1.1/website/.gitignore000066400000000000000000000001301467064331700200720ustar00rootroot00000000000000.vscode/ .cache/ public/ node_modules/ .npm logs *.log npm-debug.log* .idea/ src/fonts/ thinc-release-v9.1.1/website/.nvmrc000066400000000000000000000000021467064331700172260ustar00rootroot0000000000000016thinc-release-v9.1.1/website/.prettierrc000066400000000000000000000010361467064331700202740ustar00rootroot00000000000000{ "semi": false, "singleQuote": true, "trailingComma": "es5", "tabWidth": 4, "bracketSpacing": true, "printWidth": 100, "overrides": [ { "files": "*.sass", "options": { "printWidth": 999 } }, { "files": "*.md", "options": { "tabWidth": 2, "printWidth": 80, "proseWrap": "always", "htmlWhitespaceSensitivity": "strict" } } ] } thinc-release-v9.1.1/website/Dockerfile000066400000000000000000000006511467064331700201040ustar00rootroot00000000000000FROM node:16 USER node # This is so the installed node_modules will be up one directory # from where a user mounts files, so that they don't accidentally mount # their own node_modules from a different build # https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders WORKDIR /home/node COPY --chown=node package.json . COPY --chown=node package-lock.json . RUN npm install WORKDIR /home/node/website/ thinc-release-v9.1.1/website/README.md000066400000000000000000000136431467064331700173760ustar00rootroot00000000000000[![Netlify Status](https://api.netlify.com/api/v1/badges/d249ffd8-1790-4053-b6e8-5967ac68e4e1/deploy-status)](https://app.netlify.com/sites/cocky-hodgkin-996e5b/deploys) ## Setup and installation The site is powered by [Gatsby](https://www.gatsbyjs.org/) and [Markdown Remark](https://github.com/remarkjs/remark). To run the site, Node 16 is required. If you use NVM you can `nvm use` to select the correct Node version. ```bash npm install # install dependencies npm run dev # start dev server ``` A `.prettierrc` is included in the repo, so if you set up auto-formatting with Prettier, it should match the style. ## Build and run the website in a Docker container Rather than installing NPM locally, you can also build a Docker container with the prerequisite dependencies: ```bash docker build -t thinc-ai . ``` Afterwards, the website can be built and run in the container: ```bash docker run --rm -it \ -v $PWD:/home/node/website \ -p 8000:8000 \ thinc-ai \ npm run dev -- -H 0.0.0.0 ``` This is currently the only way to build the website on ARM64 Macs, since the required Node.js version is not built for macOS/ARM64. These commands also work with Podman by replacing `docker` by `podman`. ## Directory structure - `/docs`: Docs pages as Markdown. - `/src/pages`: JavaScript-formatted landing pages relative to the root. ## Markdown reference The docs use various customized Markdown components for better visual documentation. Here are the most relevant: ### Special syntax #### Headings Headings can specify optional attributes in curly braces, e.g. `#some_id` to add a permalink and `id="some_id"` or a `tag` attribute with a string of one or more comma-separated tags to be added after the headline text. ```markdown ## Headline 2 ## Headline 2 {#some_id} ## Headline 2 {#some_id tag="method"} ``` #### Code Code blocks can specify an optional title on the first line, prefixed by `###`. The title also supports specifying attributes, including `small="true"` (small font) and `highlight`, mapped to valid line numbers or line number ranges. ````markdown ```python ### This is a title {highlight="1,3-4"} from thinc.api import Model, chain, Relu, Softmax with Model.define_operators({">>": chain}): model = Relu(512) >> Relu(512) >> Softmax() ``` ```` #### Tables If a table row defines an italicized label in its first column and is otherwise empty, it will be rendered as divider with the given label. This is currently used for the "keyword-only" divider that separates positional and regular keyword arguments from keyword-only arguments. If the last row contains a bold `RETURNS` or `YIELDS`, the row is rendered as the footer row with an additional divider. ```markdown | Argument | Type | Description | | -------------- | ---------------- | ------------------------------------------------------ | | `X` | ArrayXd | The array. | | _keyword-only_ | | | | `dim` | int | Which dimension to get the size for. Defaults to `-1`. | | **RETURNS** | int | The array's inferred width. | ``` If you're specifying tables in Markdown, you always need a head row – otherwise, the markup is invalid. However, if all head cells are empty, the header row will not be rendered. ```markdown | | | | | -------- | -------- | -------- | | Column 1 | Column 2 | Column 3 | ``` ### Custom markdown elements #### `` Infobox Infobox with an optional variant attribute: `variant="warning"` or `variant="danger"`. ```markdown This is a warning. ``` #### `` Type annotation Should be used for Python type annotations like `bool`, `Optional[int]` or `Model[ArrayXd, ArrayXd]`. Similar to regular inline code but will highlight the elements and link the types if available. See [`type-links.js`](src/type-links.js) for the type to link mapping. ```markdown Tuple[str, int] ``` #### `` Arrays Special type annotation for arrays with option to specify shape. Will link types if available. See [`_type_links.json`](docs/_type_links.json) for the type to link mapping. ```markdown Array2d ``` #### `` `` Tabbed components Will make each tab title a selectable button and allow tabbing between content. Mostly used for longer code examples to show a variety of different examples without making the page too verbose. The `id` is needed to distinguish multiple tabbed components on the same page. ```markdown Tab content 1 goes here Tab content 2 goes here ``` #### `` Simple two-column grid Responsive grid for displaying child elements in two columns. Mostly used to display code examples side-by-side. ````markdown ```ini ### config.cfg {small="true"} [training] patience = 10 dropout = 0.2 ``` ```json ### Parsed {small="true"} { "training": { "patience": 10, "dropout": 0.2 } } ``` ```` #### `` Inline list of meta info Should contain an unnumbered list with items optionally prefixed with a bold label. Mostly used in the layers API reference to document input/output types, parameters and attributes in a concise way. ```markdown - **Label 1:** Some content - **Label 2:** Some content ``` #### `` Tutorial links with Colab buttons Should contain an unnumbered list with IDs of the tutorials to include. See [`_tutorials.json`](docs/_tutorials.json) for options. The tutorials section will show each tutorial name and description with a button to launch the notebook on Colab, if available. ```markdown - intro - transformers_tagger - parallel_training_ray ``` thinc-release-v9.1.1/website/docs/000077500000000000000000000000001467064331700170405ustar00rootroot00000000000000thinc-release-v9.1.1/website/docs/_quickstart.json000066400000000000000000000022371467064331700222700ustar00rootroot00000000000000{ "defaults": { "cuda": "-" }, "options": [ { "label": "CUDA", "name": "cuda", "options": [ { "label": "none", "value": "-" }, { "label": "8.0", "value": "cuda80" }, { "label": "9.0", "value": "cuda90" }, { "label": "9.1", "value": "cuda91" }, { "label": "9.2", "value": "cuda92" }, { "label": "10.0", "value": "cuda100" }, { "label": "10.1", "value": "cuda101" }, { "label": "10.2", "value": "cuda102" }, { "label": "11.0", "value": "cuda110" }, { "label": "11.1", "value": "cuda111" }, { "label": "11.2-11.x", "value": "cuda11x" }, { "label": "12.x", "value": "cuda12x" } ] }, { "label": "Libraries", "name": "libraries", "multi": true, "options": [ { "label": "PyTorch", "value": "torch" }, { "label": "TensorFlow", "value": "tensorflow" }, { "label": "MXNet", "value": "mxnet" } ] } ] } thinc-release-v9.1.1/website/docs/_tutorials.json000066400000000000000000000060341467064331700221230ustar00rootroot00000000000000{ "intro": { "title": "Intro to Thinc", "description": "Everything you need to know to get started. Composing and training a model on the MNIST data, using config files, registering custom functions and wrapping PyTorch, TensorFlow and MXNet models.", "url": "00_intro_to_thinc.ipynb" }, "intro_model": { "title": "Intro to Thinc's Model class", "description": "Defining and composing models, the model methods and working with dimensions, parameters and gradients.", "url": "01_intro_model_definition_methods.ipynb" }, "transformers_tagger": { "title": "Training a part-of-speech tagger with transformers (BERT)", "description": "How to use Thinc, Transformers and PyTorch to train a part-of-speech tagger. From model definition and config to the training loop.", "url": "02_transformers_tagger_bert.ipynb" }, "basic_cnn_tagger": { "title": "Basic CNN part-of-speech tagger", "description": "Implementing and training a basic CNN for part-of-speech tagging model without external dependencies and using different levels of Thinc's configuration system.", "url": "03_pos_tagger_basic_cnn.ipynb" }, "textcat_neural_bow": { "title": "Basic neural bag-of-words text classifier", "description": "Implementing and training a simple neural text classification model.", "url": "03_textcat_basic_neural_bow.ipynb" }, "gpu_memory": { "title": "Using a single memory pool for Cupy and PyTorch/TensorFlow", "description": "How to use Thinc with custom memory allocation to route cupy's memory requests via PyTorch or TensorFlow library.", "url": "04_configure_gpu_memory.ipynb" }, "parallel_training_ray": { "title": "Parallel training with Ray", "description": "How to set up synchronous and asynchronous parameter server training with Thinc and Ray.", "url": "04_parallel_training_ray.ipynb" }, "benchmarking_layers": { "title": "Writing a custom benchmark layer", "description": "How to write a benchmark layer to wrap any layer(s) in your network and log the execution times of the initialization, forward pass and backward pass.", "url": "05_benchmarking_layers.ipynb" }, "visualizing": { "title": "Visualizing Thinc models (with shape inference)", "description": "Visualizing Thinc models and their inputs and outputs using Graphviz and pydot.", "url": "05_visualizing_models.ipynb" }, "type_checking": { "title": "Type checking with Thinc and mypy", "description": "How to take advantage of Thinc's type system and spot potential bugs early.", "url": "type_checking.py", "standalone": true }, "mathy_like_terms": { "title": "Predicting like polynomial terms with Mathy", "description": "How to build a regression model that outputs the number of like terms in each math problem generated by Mathy.", "url": "06_predicting_like_terms.ipynb" } } thinc-release-v9.1.1/website/docs/_type_links.json000066400000000000000000000023741467064331700222610ustar00rootroot00000000000000{ "__default__": "/docs/api-types#types", "Model": "/docs/api-model#model", "Shim": "/docs/api-model#shim", "Ops": "/docs/api-backends#ops", "NumpyOps": "/docs/api-backends#ops", "CupyOps": "/docs/api-backends#ops", "Config": "/docs/api-config#config", "Ragged": "/docs/api-types#ragged", "Padded": "/docs/api-types#padded", "Pairs": "/docs/api-types#pairs", "ArgsKwargs": "/docs/api-types#argskwargs", "SizedGenerator": "/docs/api-types#sizedgenerator", "Array1d": true, "Array2d": true, "Array3d": true, "Array4d": true, "ArrayXd": true, "Floats1d": true, "Floats2d": true, "Floats3d": true, "Floats4d": true, "FloatsXd": true, "Ints1d": true, "Ints2d": true, "Ints3d": true, "Ints4d": true, "IntsXd": true, "List1d": true, "List2d": true, "List3d": true, "List4d": true, "ListXd": true, "Generator": true, "Shape": true, "DTypes": true, "DTypesInt": true, "DTypesFloat": true, "Xp": true, "Batchable": true, "BaseModel": "https://pydantic-docs.helpmanual.io/usage/models/", "Doc": "https://spacy.io/api/doc", "Device": "https://docs-cupy.chainer.org/en/stable/reference/generated/cupy.cuda.Device.html" } thinc-release-v9.1.1/website/docs/api-backends.md000066400000000000000000002130121467064331700217020ustar00rootroot00000000000000--- title: Backends & Math next: /docs/api-util --- All Thinc models have a reference to an `Ops` instance, that provides access to **memory allocation** and **mathematical routines**. The `Model.ops` instance also keeps track of state and settings, so that you can have different models in your network executing on different devices or delegating to different underlying libraries. Each `Ops` instance holds a reference to a numpy-like module (`numpy` or `cupy`), which you can access at `Model.ops.xp`. This is enough to make most layers work on **both CPU and GPU devices**. Additionally, there are several routines that we have implemented as methods on the `Ops` object, so that specialized versions can be called for different backends. You can also create your own `Ops` subclasses with specialized routines for your layers, and use the [`set_current_ops`](#set_current_ops) function to change the default. | Backend | CPU | GPU | TPU | Description | | ---------- | :----------------: | :----------------: | :---------------: | ----------------------------------------------------------------------------------------------------------- | | `AppleOps` | | | | Use AMX matrix multiplication units on Apple Silicon Macs. Added in Thinc 9.0. | | `CupyOps` | | | | Execute via [`cupy`](https://cupy.chainer.org/) and custom CUDA. | | `MPSOps` | | | | Use the GPU on Apple Silicon Macs for PyTorch models, use AMX matrix multiplication units for Thinc Models. | | `NumpyOps` | | | | Execute via `numpy`, [`blis`](https://github.com/explosion/cython-blis) (optional) and custom Cython. | ## Ops {#ops tag="class"} The `Ops` class is typically not used directly but via `NumpyOps`, `AppleOps`, `CupyOps` or `MPSOps`, which are subclasses of `Ops` and implement a **more efficient subset of the methods**. You also have access to the ops via the [`Model.ops`](/docs/api-model#attributes) attribute. The documented methods below list which backends provide optimized and more efficient versions (indicated by ), and which use the default implementation. Thinc also provides various [helper functions](#util) for getting and setting different backends. The current set of implemented methods is somewhat arbitrary and **subject to change**. Methods are moved to the `Ops` object if we want different implementations for different backends, e.g. cythonized CPU versions or custom CUDA kernels. ```python ### Example from thinc.api import Linear, get_ops, use_ops model = Linear(4, 2) X = model.ops.alloc2f(10, 2) blis_ops = get_ops("numpy", use_blis=True) use_ops(blis_ops) ``` ### Attributes {#attributes} | Name | Type | Description | | ------------- | ------------ | ---------------------------------------------------------------------------------------- | | `name` | str | **Class attribute:** Backend name, `"numpy"`, `"apple"`, `"cupy"` or `"mps"`. | | `xp` | Xp | **Class attribute:** `numpy` or `cupy`. | | `device_type` | str | The device type to use, if available for the given backend: `"cpu"`, `"gpu"` or `"tpu"`. | | `device_id` | int | The device ID to use, if available for the given backend. | ### Ops.\_\_init\_\_ {#init tag="method"} | Argument | Type | Description | | -------------- | ------------- | ------------------------------------------------------------------------------------------------------------- | | `device_type` | str | The device type to use, if available for the given backend: `"cpu"`, `"gpu"` or `"tpu"`. | | `device_id` | int | The device ID to use, if available for the given backend. | | _keyword-only_ | | | | `use_blis` | bool | `NumpyOps`: Use [`blis`](https://github.com/explosion/cython-blis) for single-threaded matrix multiplication. | ### Ops.minibatch {#minibatch tag="method"} - **default:** - **numpy:** default - **cupy:** default Iterate slices from a sequence, optionally shuffled. Slices may be either views or copies of the underlying data. Supports the batchable data types [`Pairs`](/docs/api-types#pairs), [`Ragged`](/docs/api-types#ragged) and [`Padded`](/docs/api-types#padded), as well as arrays, lists and tuples. The `size` argument may be either an integer, or a sequence of integers. If a sequence, a new size is drawn before every output. If `shuffle` is `True`, shuffled batches are produced by first generating an index array, shuffling it, and then using it to slice into the sequence. An internal queue of `buffer` items is accumulated before being each output. Buffering is useful for some devices, to allow the network to run asynchronously without blocking on every batch. The method returns a [`SizedGenerator`](/docs/api-types#sizedgenerator) that exposes a `__len__` and is rebatched and reshuffled every time it's executed, allowing you to move the batching outside of the training loop. ```python ### Example batches = model.ops.minibatch(128, train_X, shuffle=True) ``` | Argument | Type | Description | | -------------- | ------------------------------ | ------------------------------------------------------------------ | | `size` | Union[int, Generator] | The batch size(s). | | `sequence` | Batchable | The sequence to batch. | | _keyword-only_ | | | | `shuffle` | bool | Whether to shuffle the items. | | `buffer` | int | Number of items to accumulate before each output. Defaults to `1`. | | **RETURNS** | SizedGenerator | The batched items. | ### Ops.multibatch {#multibatch tag="method"} - **default:** - **numpy:** default - **cupy:** default Minibatch one or more sequences of data, and return lists with one batch per sequence. Otherwise identical to [`Ops.minibatch`](#minibatch). ```python ### Example batches = model.ops.multibatch(128, train_X, train_Y, shuffle=True) ``` | Argument | Type | Description | | -------------- | ------------------------------ | ------------------------------------------------------------------ | | `size` | Union[int, Generator] | The batch size(s). | | `sequence` | Batchable | The sequence to batch. | | `*other` | Batchable | The other sequences to batch. | | _keyword-only_ | | | | `shuffle` | bool | Whether to shuffle the items. | | `buffer` | int | Number of items to accumulate before each output. Defaults to `1`. | | **RETURNS** | SizedGenerator | The batched items. | ### Ops.seq2col {#seq2col tag="method"} - **default:** (`nW=1` only) - **numpy:** - **cupy:** Given an `(M, N)` sequence of vectors, return an `(M, N*(nW*2+1))` sequence. The new sequence is constructed by concatenating `nW` preceding and succeeding vectors onto each column in the sequence, to extract a window of features. | Argument | Type | Description | | -------------- | ------------------------- | ----------------------------------------------------------------- | | `seq` | Floats2d | The original sequence. | | `nW` | int | The window size. | | _keyword-only_ | | | | `lengths` | Optional[Ints1d] | Sequence lengths, introduces padding around sequences. | | **RETURNS** | Floats2d | The created sequence containing preceding and succeeding vectors. | ### Ops.backprop_seq2col {#backprop_seq2col tag="method"} - **default:** (`nW=1` only) - **numpy:** - **cupy:** The reverse/backward operation of the `seq2col` function: calculate the gradient of the original `(M, N)` sequence, as a function of the gradient of the output `(M, N*(nW*2+1))` sequence. | Argument | Type | Description | | -------------- | ------------------------- | ------------------------------------------------------ | | `dY` | Floats2d | Gradient of the output sequence. | | `nW` | int | The window size. | | _keyword-only_ | | | | `lengths` | Optional[Ints1d] | Sequence lengths, introduces padding around sequences. | | **RETURNS** | Floats2d | Gradient of the original sequence. | ### Ops.gemm {#gemm tag="method"} - **default:** - **numpy:** - **cupy:** Perform General Matrix Multiplication (GeMM) and optionally store the result in the specified output variable. | Argument | Type | Description | | ----------- | --------------------------- | ------------------------------------------------------------- | | `x` | Floats2d | First array. | | `y` | Floats2d | Second array. | | `out` | Optional[Floats2d] | Variable to store the result of the matrix multiplication in. | | `trans1` | bool | Whether or not to transpose array `x`. | | `trans2` | bool | Whether or not to transpose array `y`. | | **RETURNS** | Floats2d | The result of the matrix multiplication. | ### Ops.affine {#affine tag="method"} - **default:** - **numpy:** default - **cupy:** default Apply a weights layer and a bias to some inputs, i.e. `Y = X @ W.T + b`. | Argument | Type | Description | | ----------- | ----------------- | ---------------- | | `X` | Floats2d | The inputs. | | `W` | Floats2d | The weights. | | `b` | Floats1d | The bias vector. | | **RETURNS** | Floats2d | The output. | ### Ops.flatten {#flatten tag="method"} - **default:** - **numpy:** default - **cupy:** default Flatten a list of arrays into one large array. | Argument | Type | Description | | --------------- | -------------------------- | ------------------------------------------------------------- | | `X` | Sequence[ArrayXd] | The original list of arrays. | | `dtype` | Optional[DTypes] | The data type to cast the resulting array in. | | `pad` | int | The number of zeros to add as padding to `X` (default 0). | | `ndim_if_empty` | int | The dimension of the output result if `X` is `None` or empty. | | **RETURNS** | ArrayXd | One large array storing all original information. | ### Ops.unflatten {#unflatten tag="method"} - **default:** - **numpy:** default - **cupy:** default The reverse/backward operation of the `flatten` function: unflatten a large array into a list of arrays according to the given lengths. | Argument | Type | Description | | ----------- | ---------------------- | --------------------------------------------------------------------- | | `X` | ArrayXd | The flattened array. | | `lengths` | Ints1d | The lengths of the original arrays before they were flattened. | | `pad` | int | The padding that was applied during the `flatten` step (default 0). | | **RETURNS** | List[ArrayXd] | A list of arrays storing the same information as the flattened array. | ### Ops.pad {#pad tag="method"} - **default:** - **numpy:** default - **cupy:** default Perform padding on a list of arrays so that they each have the same length, by taking the maximum dimension across each axis. This only works on non-empty sequences with the same `ndim` and `dtype`. | Argument | Type | Description | | ----------- | ---------------------- | ------------------------------------------------------------------------------------------------ | | `seqs` | List[Array2d] | The sequences to pad. | | `round_to` | int | Round the length to nearest bucket (helps on GPU, to make similar array sizes). Defaults to `1`. | | **RETURNS** | Array3d | The padded sequences, stored in one array. | ### Ops.unpad {#unpad tag="method"} - **default:** - **numpy:** default - **cupy:** default The reverse/backward operation of the `pad` function: transform an array back into a list of arrays, each with their original length. | Argument | Type | Description | | ----------- | ---------------------- | ----------------------------------------------- | | `padded` | ArrayXd | The padded sequences, stored in one array. | | `lengths` | List[int] | The original lengths of the unpadded sequences. | | **RETURNS** | List[ArrayXd] | The unpadded sequences. | ### Ops.list2padded {#list2padded tag="method"} - **default:** - **numpy:** default - **cupy:** default Pack a sequence of two-dimensional arrays into a [`Padded`](/docs/api-types#padded) datatype. | Argument | Type | Description | | ----------- | ---------------------- | ---------------------- | | `seqs` | List[Array2d] | The sequences to pack. | | **RETURNS** | Padded | The packed arrays. | ### Ops.padded2list {#padded2list tag="method"} - **default:** - **numpy:** default - **cupy:** default Unpack a [`Padded`](/docs/api-types#padded) datatype to a list of two-dimensional arrays. | Argument | Type | Description | | ----------- | ---------------------- | ----------------------- | | `padded` | Padded | The object to unpack. | | **RETURNS** | List[Array2d] | The unpacked sequences. | ### Ops.get_dropout_mask {#get_dropout_mask tag="method"} - **default:** - **numpy:** default - **cupy:** default Create a random mask for applying dropout, with a certain percent of the mask (defined by `drop`) will contain zeros. The neurons at those positions will be deactivated during training, resulting in a more robust network and less overfitting. | Argument | Type | Description | | ----------- | ------------------------ | ----------------------------------------------------------- | | `shape` | Shape | The input shape. | | `drop` | Optional[float] | The dropout rate. | | **RETURNS** | Floats | A mask specifying a 0 where a neuron should be deactivated. | ### Ops.alloc {#alloc tag="method"} - **default:** - **numpy:** - **cupy:** default Allocate an array of a certain shape. If possible, you should always use the **type-specific methods** listed below, as they make the code more readable and allow more sophisticated static [type checking](/docs/usage-type-checking) of the inputs and outputs. | Argument | Type | Description | | -------------- | ---------------- | -------------------------------------------- | | `shape` | Shape | The shape. | | _keyword-only_ | | | | `dtype` | DTypes | The data type (default: `float32`). | | `zeros` | bool | Fill the array with zeros (default: `True`). | | **RETURNS** | ArrayXd | An array of the correct shape and data type. | ### Ops.cblas {#cblas tag="method"} - **default:** - **numpy:** - **cupy:** Get a table of C BLAS functions usable in Cython `cdef nogil` functions. This method does not take any arguments. This method is only supported by `NumpyOps`. A `NotImplementedError` exception is raised when calling this method on `Ops` or `CupyOps`. ### Ops.to_numpy {#to_numpy tag="method"} - **default:** - **numpy:** default - **cupy:** Convert the array to a numpy array. | Argument | Type | Description | | -------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `data` | ArrayXd | The array. | | _keyword-only_ | | | | `byte_order` | Optional[str] | The [new byte order](https://numpy.org/doc/stable/reference/generated/numpy.dtype.newbyteorder.html), `None` preserves the current byte order (default: `None`). | | **RETURNS** | numpy.ndarray | A numpy array with the specified byte order. | #### Type-specific methods - **Floats:** `Ops.alloc_f`, `Ops.alloc1f`, `Ops.alloc2f`, `Ops.alloc3f`, `Ops.alloc4f` - **Ints:** `Ops.alloc_i`, `Ops.alloc1i`, `Ops.alloc2i`, `Ops.alloc3i`, `Ops.alloc4i` Shortcuts to allocate an array of a certain shape and data type (`f` refers to `float32` and `i` to `int32`). For instance, `Ops.alloc2f` will allocate an two-dimensional array of floats. ```python ### Example X = model.ops.alloc2f(10, 2) # Floats2d Y = model.ops.alloc1i(4) # Ints1d ``` | Argument | Type | Description | | -------------- | ----------------------------------------- | -------------------------------------------------------------------------- | | `*shape` | int | The shape, one positional argument per dimension. | | _keyword-only_ | | | | `dtype` | DTypesInt / DTypesFloat | The data type (float type for float methods and int type for int methods). | | `zeros` | bool | Fill the array with zeros (default: `True`). | | **RETURNS** | ArrayXd | An array of the correct shape and data type. | ### Ops.reshape {#reshape tag="method"} - **default:** - **numpy:** default - **cupy:** default Reshape an array and return an array containing the same data with the given shape. If possible, you should always use the **type-specific methods** listed below, as they make the code more readable and allow more sophisticated static [type checking](/docs/usage-type-checking) of the inputs and outputs. | Argument | Type | Description | | ----------- | ---------------- | --------------------- | | `array` | ArrayXd | The array to reshape. | | `shape` | Shape | The shape. | | **RETURNS** | ArrayXd | The reshaped array. | #### Type-specific methods - **Floats:** `Ops.reshape_f`, `Ops.reshape1f`, `Ops.reshape2f`, `Ops.reshape3f`, `Ops.reshape4f` - **Ints:** `Ops.reshape_i`, `Ops.reshape1i`, `Ops.reshape2i`, `Ops.reshape3i`, `Ops.reshape4i` Shortcuts to reshape an array of a certain shape and data type (`f` refers to `float32` and `i` to `int32`). For instance, `reshape2f` can be used to reshape an array of floats to a 2d-array of floats. Note that the data type-specific methods mostly exist for **static type checking purposes**. They do **not** change the data type of the array. For example, `Ops.reshape2f` expects an array of floats and expects to return an array of floats – but it won't convert an array of ints to an array of floats. However, using the specific method will tell the static type checker what array to expect, and passing in an array that's _typed_ as an int array will result in a type error. ```python ### Example {small="true"} X = model.ops.reshape2f(X, 10, 2) # Floats2d Y = model.ops.reshape1i(Y, 4) # Ints1d ``` | Argument | Type | Description | | ----------- | ---------------- | -------------------------------------------------------------- | | `array` | ArrayXd | The array to reshape (of the same data type). | | `*shape` | int | The shape, one positional argument per dimension. | | **RETURNS** | ArrayXd | The reshaped array (of the same data type as the input array). | ### Ops.asarray {#asarray tag="method"} - **default:** - **numpy:** - **cupy:** Ensure a given array is of the correct type, e.g. `numpy.ndarray` for `NumpyOps` or `cupy.ndarray` for `CupyOps`. If possible, you should always use the **type-specific methods** listed below, as they make the code more readable and allow more sophisticated static [type checking](/docs/usage-type-checking) of the inputs and outputs. | Argument | Type | Description | | -------------- | --------------------------------------------------------- | ------------------------------------------ | | `data` | Union[ArrayXd, Sequence[ArrayXd], Sequence[int]] | The original array. | | _keyword-only_ | | | | `dtype` | Optional[DTypes] | The data type | | **RETURNS** | ArrayXd | The array transformed to the correct type. | ### Type-specific methods - **Floats:** `Ops.asarray_f`, `Ops.asarray1f`, `Ops.asarray2f`, `Ops.asarray3f`, `Ops.asarray4f` - **Ints:** `Ops.asarray_i`, `Ops.asarray1i`, `Ops.asarray2i`, `Ops.asarray3i`, `Ops.asarray4i` Shortcuts for specific dimensions and data types (`f` refers to `float32` and `i` to `int32`). For instance, `Ops.asarray2f` will return a two-dimensional array of floats. ```python ### Example X = model.ops.asarray2f(X, 10, 2) # Floats2d Y = model.ops.asarray1i(Y, 4) # Ints1d ``` | Argument | Type | Description | | -------------- | ----------------------------------------- | -------------------------------------------------------------------------- | | `*shape` | int | The shape, one positional argument per dimension. | | _keyword-only_ | | | | `dtype` | DTypesInt / DTypesFloat | The data type (float type for float methods and int type for int methods). | | **RETURNS** | ArrayXd | An array of the correct shape and data type, filled with zeros. | ### Ops.as_contig {#as_contig tag="method"} - **default:** - **numpy:** default - **cupy:** default Allow the backend to make a contiguous copy of an array. Implementations of `Ops` do not have to make a copy or make it contiguous if that would not improve efficiency for the execution engine. | Argument | Type | Description | | -------------- | ------------------------- | --------------------------------------------- | | `data` | ArrayXd | The array. | | _keyword-only_ | | | | `dtype` | Optional[DTypes] | The data type | | **RETURNS** | ArrayXd | An array with the same contents as the input. | ### Ops.unzip {#unzip tag="method"} - **default:** - **numpy:** default - **cupy:** default Unzip a tuple of two arrays, transform them with `asarray` and return them as two separate arrays. | Argument | Type | Description | | ----------- | -------------------------------- | ------------------------------------------- | | `data` | Tuple[ArrayXd, ArrayXd] | The tuple of two arrays. | | **RETURNS** | Tuple[ArrayXd, ArrayXd] | The two arrays, transformed with `asarray`. | ### Ops.sigmoid {#sigmoid tag="method"} - **default:** - **numpy:** default - **cupy:** default Calculate the sigmoid function. | Argument | Type | Description | | -------------- | ----------------- | ------------------------------------------ | | `X` | FloatsXd | The input values. | | _keyword-only_ | | | | `inplace` | bool | If `True`, the array is modified in place. | | **RETURNS** | FloatsXd | The output values, i.e. `S(X)`. | ### Ops.dsigmoid {#dsigmoid tag="method"} - **default:** - **numpy:** default - **cupy:** default Calculate the derivative of the `sigmoid` function. | Argument | Type | Description | | -------------- | ----------------- | ------------------------------------------ | | `Y` | FloatsXd | The input values. | | _keyword-only_ | | | | `inplace` | bool | If `True`, the array is modified in place. | | **RETURNS** | FloatsXd | The output values, i.e. `dS(Y)`. | ### Ops.dtanh {#dtanh tag="method"} - **default:** - **numpy:** default - **cupy:** default Calculate the derivative of the `tanh` function. | Argument | Type | Description | | -------------- | ----------------- | ------------------------------------------ | | `Y` | FloatsXd | The input values. | | _keyword-only_ | | | | `inplace` | bool | If `True`, the array is modified in place. | | **RETURNS** | FloatsXd | The output values, i.e. `dtanh(Y)`. | ### Ops.softmax {#softmax tag="method"} - **default:** - **numpy:** default - **cupy:** default Calculate the softmax function. The resulting array will sum up to 1. | Argument | Type | Description | | -------------- | ----------------- | ------------------------------------------------------ | | `x` | FloatsXd | The input values. | | _keyword-only_ | | | | `inplace` | bool | If `True`, the array is modified in place. | | `axis` | int | The dimension to normalize over. | | `temperature` | float | The value to divide the unnormalized probabilities by. | | **RETURNS** | FloatsXd | The normalized output values. | ### Ops.backprop_softmax {#backprop_softmax tag="method"} - **default:** - **numpy:** default - **cupy:** default | Argument | Type | Description | | -------------- | ----------------- | ------------------------------------------------------ | | `Y` | FloatsXd | Output array. | | `dY` | FloatsXd | Gradients of the output array. | | _keyword-only_ | | | | `axis` | int | The dimension that was normalized over. | | `temperature` | float | The value to divide the unnormalized probabilities by. | | **RETURNS** | FloatsXd | The gradients of the input array. | ### Ops.softmax_sequences {#softmax_sequences tag="method"} - **default:** - **numpy:** default - **cupy:** default | Argument | Type | Description | | -------------- | ----------------- | ------------------------------------------ | | `Xs` | Floats2d | An 2d array of input sequences. | | `lengths` | Ints1d | The lengths of the input sequences. | | _keyword-only_ | | | | `inplace` | bool | If `True`, the array is modified in place. | | `axis` | int | The dimension to normalize over. | | **RETURNS** | Floats2d | The normalized output values. | ### Ops.backprop_softmax_sequences {#backprop_softmax_sequences tag="method"} - **default:** - **numpy:** default - **cupy:** default The reverse/backward operation of the `softmax` function. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------- | | `dY` | Floats2d | Gradients of the output array. | | `Y` | Floats2d | Output array. | | `lengths` | Ints1d | The lengths of the input sequences. | | **RETURNS** | Floats2d | The gradients of the input sequences. | ### Ops.recurrent_lstm {#recurrent_lstm tag="method"} - **default:** - **numpy:** default - **cupy:** default Encode a padded batch of inputs into a padded batch of outputs using an LSTM. | Argument | Type | Description | | ----------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | `W` | Floats2d | The weights, shaped `(nO * 4, nO + nI)`. | | `b` | Floats1d | The bias vector, shaped `(nO * 4,)`. | | `h_init` | Floats1d | Initial value for the previous hidden vector. | | `c_init` | Floats1d | Initial value for the previous cell state. | | `inputs` | Floats3d | A batch of inputs, shaped `(nL, nB, nI)`, where `nL` is the sequence length and `nB` is the batch size. | | `is_train` | bool | Whether the model is running in a training context. | | **RETURNS** | Tuple[Floats3d, Tuple[Floats3d, Floats3d, Floats3d]] | A tuple consisting of the outputs and the intermediate activations required for the backward pass. The outputs are shaped `(nL, nB, nO)`. | ### Ops.backprop_recurrent_lstm {#backprop_recurrent_lstm tag="method"} - **default:** - **numpy:** default - **cupy:** default Compute the gradients for the `recurrent_lstm` operation via backpropagation. | Argument | Type | Description | | ----------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | | `dY` | Floats3d | The gradient w.r.t. the outputs. | | `fwd_state` | Tuple[Floats3d, Floats3d, Floats3d] | The tuple of gates, cells and inputs, returned by the forward pass. | | `params` | Tuple[Floats2d, Floats1d] | A tuple of the weights and biases. | | **RETURNS** | Tuple[Floats3d, Tuple[Floats2d, Floats1d, Floats1d, Floats1d]] | The gradients for the inputs and parameters (the weights, biases, initial hiddens and initial cells). | ### Ops.maxout {#maxout tag="method"} - **default:** - **numpy:** - **cupy:** | Argument | Type | Description | | ----------- | -------------------------------- | ------------------------------------------------------------------------------- | | `X` | Floats3d | The inputs. | | **RETURNS** | Tuple[Floats2d, Ints2d] | The outputs and an array indicating which elements in the final axis were used. | ### Ops.backprop_maxout {#backprop_maxout tag="method"} - **default:** - **numpy:** - **cupy:** | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------- | | `dY` | Floats2d | Gradients of the output array. | | `which` | Ints2d | The positions selected in the forward pass. | | `P` | int | The size of the final dimension. | | **RETURNS** | Floats3d | The gradient of the inputs. | ### Ops.relu {#relu tag="method"} - **default:** - **numpy:** - **cupy:** | Argument | Type | Description | | -------------- | ----------------- | ------------------------------------------ | | `X` | Floats2d | The inputs. | | _keyword-only_ | | | | `inplace` | bool | If `True`, the array is modified in place. | | **RETURNS** | Floats2d | The outputs. | ### Ops.backprop_relu {#relu tag="method"} - **default:** - **numpy:** - **cupy:** | Argument | Type | Description | | -------------- | ----------------- | ------------------------------------------ | | `dY` | Floats2d | Gradients of the output array. | | `Y` | Floats2d | The output from the forward pass. | | _keyword-only_ | | | | `inplace` | bool | If `True`, the array is modified in place. | | **RETURNS** | Floats2d | The gradient of the input. | ### Ops.mish {#mish tag="method"} - **default:** - **numpy:** - **cupy:** Compute the Mish activation ([Misra, 2019](https://arxiv.org/pdf/1908.08681.pdf)). | Argument | Type | Description | | ----------- | ----------------- | ----------------------------------------------- | | `X` | FloatsXd | The inputs. | | `threshold` | float | Maximum value at which to apply the activation. | | `inplace` | bool | Apply Mish to `X` in-place. | | **RETURNS** | FloatsXd | The outputs. | ### Ops.backprop_mish {#backprop_mish tag="method"} - **default:** - **numpy:** - **cupy:** Backpropagate the Mish activation ([Misra, 2019](https://arxiv.org/pdf/1908.08681.pdf)). | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------- | | `dY` | FloatsXd | Gradients of the output array. | | `X` | FloatsXd | The inputs to the forward pass. | | `threshold` | float | Threshold from the forward pass. | | `inplace` | bool | Apply Mish backprop to `dY` in-place. | | **RETURNS** | FloatsXd | The gradient of the input. | ### Ops.swish {#swish tag="method"} - **default:** - **numpy:** - **cupy:** Swish [(Ramachandran et al., 2017)](https://arxiv.org/abs/1710.05941v2) is a self-gating non-monotonic activation function similar to the [GELU](#gelu) activation: whereas [GELU](#gelu) uses the CDF of the Gaussian distribution Φ for self-gating `x * Φ(x)`, Swish uses the logistic CDF `x * σ(x)`. Sometimes referred to as "SiLU" for "Sigmoid Linear Unit". | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------ | | `X` | FloatsXd | The inputs. | | `inplace` | bool | If `True`, the array is modified in place. | | **RETURNS** | FloatsXd | The outputs. | ### Ops.backprop_swish {#backprop_swish tag="method"} - **default:** - **numpy:** - **cupy:** Backpropagate the Swish activation [(Ramachandran et al., 2017)](https://arxiv.org/abs/1710.05941v2). | Argument | Type | Description | | ----------- | ----------------- | ----------------------------------------------- | | `dY` | FloatsXd | Gradients of the output array. | | `X` | FloatsXd | The inputs to the forward pass. | | `Y` | FloatsXd | The outputs to the forward pass. | | `inplace` | bool | If `True`, the `dY` array is modified in place. | | **RETURNS** | FloatsXd | The gradient of the input. | ### Ops.dish {#dish tag="method" new="8.1.1"} - **default:** - **numpy:** - **cupy:** Dish or "Daniël's Swish-like activation" is an activation function with a non-monotinic shape similar to [GELU](#gelu), [Swish](#swish) and [Mish](#mish). However, Dish does not rely on elementary functions like `exp` or `erf`, making it much [faster to compute](https://twitter.com/danieldekok/status/1484898130441166853) in most cases. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------ | | `X` | FloatsXd | The inputs. | | `inplace` | bool | If `True`, the array is modified in place. | | **RETURNS** | FloatsXd | The outputs. | ### Ops.backprop_dish {#backprop_dish tag="method" new="8.1.1"} - **default:** - **numpy:** - **cupy:** Backpropagate the Dish activation. | Argument | Type | Description | | ----------- | ----------------- | ----------------------------------------------- | | `dY` | FloatsXd | Gradients of the output array. | | `X` | FloatsXd | The inputs to the forward pass. | | `inplace` | bool | If `True`, the `dY` array is modified in place. | | **RETURNS** | FloatsXd | The gradient of the input. | ### Ops.gelu {#gelu tag="method"} - **default:** - **numpy:** - **cupy:** GELU or "Gaussian Error Linear Unit" [(Hendrycks and Gimpel, 2016)](https://arxiv.org/abs/1606.08415) is a self-gating non-monotonic activation function similar to the [Swish](#swish) activation: whereas [GELU](#gelu) uses the CDF of the Gaussian distribution Φ for self-gating `x * Φ(x)` the Swish activation uses the logistic CDF σ and computes `x * σ(x)`. Various approximations exist, but `thinc` implements the exact GELU. The use of GELU is popular within transformer feed-forward blocks. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------ | | `X` | FloatsXd | The inputs. | | `inplace` | bool | If `True`, the array is modified in place. | | **RETURNS** | FloatsXd | The outputs. | ### Ops.backprop_gelu {#backprop_gelu tag="method"} - **default:** - **numpy:** - **cupy:** Backpropagate the GELU activation [(Hendrycks and Gimpel, 2016)](https://arxiv.org/abs/1606.08415). | Argument | Type | Description | | ----------- | ----------------- | ----------------------------------------------- | | `dY` | FloatsXd | Gradients of the output array. | | `X` | FloatsXd | The inputs to the forward pass. | | `inplace` | bool | If `True`, the `dY` array is modified in place. | | **RETURNS** | FloatsXd | The gradient of the input. | ### Ops.relu_k {#relu_k tag="method"} - **default:** - **numpy:** - **cupy:** ReLU activation function with the maximum value clipped at `k`. A common choice is `k=6` introduced for convolutional deep belief networks [(Krizhevsky, 2010)](https://www.cs.toronto.edu/~kriz/conv-cifar10-aug2010.pdf). The resulting function `relu6` is commonly used in low-precision scenarios. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------ | | `X` | FloatsXd | The inputs. | | `inplace` | bool | If `True`, the array is modified in place. | | `k` | float | Maximum value (default: 6.0). | | **RETURNS** | FloatsXd | The outputs. | ### Ops.backprop_relu_k {#backprop_relu_k tag="method"} - **default:** - **numpy:** - **cupy:** Backpropagate the ReLU-k activation. | Argument | Type | Description | | ----------- | ----------------- | ----------------------------------------------- | | `dY` | FloatsXd | Gradients of the output array. | | `X` | FloatsXd | The inputs to the forward pass. | | `inplace` | bool | If `True`, the `dY` array is modified in place. | | **RETURNS** | FloatsXd | The gradient of the input. | ### Ops.hard_sigmoid {#hard_sigmoid tag="method"} - **default:** - **numpy:** - **cupy:** The hard sigmoid activation function is a fast linear approximation of the sigmoid activation, defined as `max(0, min(1, x * 0.2 + 0.5))`. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------ | | `X` | FloatsXd | The inputs. | | `inplace` | bool | If `True`, the array is modified in place. | | **RETURNS** | FloatsXd | The outputs. | ### Ops.backprop_hard_sigmoid {#backprop_hard_sigmoid tag="method"} - **default:** - **numpy:** - **cupy:** Backpropagate the hard sigmoid activation. | Argument | Type | Description | | ----------- | ----------------- | ----------------------------------------------- | | `dY` | FloatsXd | Gradients of the output array. | | `X` | FloatsXd | The inputs to the forward pass. | | `inplace` | bool | If `True`, the `dY` array is modified in place. | | **RETURNS** | FloatsXd | The gradient of the input. | ### Ops.hard_tanh {#hard_tanh tag="method"} - **default:** - **numpy:** - **cupy:** The hard tanh activation function is a fast linear approximation of tanh, defined as `max(-1, min(1, x))`. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------ | | `X` | FloatsXd | The inputs. | | `inplace` | bool | If `True`, the array is modified in place. | | **RETURNS** | FloatsXd | The outputs. | ### Ops.backprop_hard_tanh {#backprop_hard_tanh tag="method"} - **default:** - **numpy:** - **cupy:** Backpropagate the hard tanh activation. | Argument | Type | Description | | ----------- | ----------------- | ----------------------------------------------- | | `dY` | FloatsXd | Gradients of the output array. | | `X` | FloatsXd | The inputs to the forward pass. | | `inplace` | bool | If `True`, the `dY` array is modified in place. | | **RETURNS** | FloatsXd | The gradient of the input. | ### Ops.clipped_linear {#clipped_linear tag="method"} - **default:** - **numpy:** - **cupy:** Flexible clipped linear activation function of the form `max(min_value, min(max_value, x * slope + offset))`. It is used to implement the [`relu_k`](#reluk), [`hard_sigmoid`](#hard_sigmoid), and [`hard_tanh`](#hard_tanh) methods. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------------------------------------- | | `X` | FloatsXd | The inputs. | | `inplace` | bool | If `True`, the array is modified in place. | | `slope` | float | The slope of the linear function: `input * slope`. | | `offset` | float | The offset or intercept of the linear function: `input * slope + offset`. | | `min_val` | float | Minimum value to clip to. | | `max_val` | float | Maximum value to clip to. | | **RETURNS** | FloatsXd | The outputs. | ### Ops.backprop_clipped_linear {#backprop_clipped_linear tag="method"} - **default:** - **numpy:** - **cupy:** Backpropagate the clipped linear activation. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------------------------------------- | | `dY` | FloatsXd | Gradients of the output array. | | `X` | FloatsXd | The inputs to the forward pass. | | `slope` | float | The slope of the linear function: `input * slope`. | | `offset` | float | The offset or intercept of the linear function: `input * slope + offset`. | | `min_val` | float | Minimum value to clip to. | | `max_val` | float | Maximum value to clip to. | | `inplace` | bool | If `True`, the `dY` array is modified in place. | | **RETURNS** | FloatsXd | The gradient of the input. | ### Ops.hard_swish {#hard_swish tag="method"} - **default:** - **numpy:** - **cupy:** The hard Swish activation function is a fast linear approximation of Swish: `x * hard_sigmoid(x)`. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------ | | `X` | FloatsXd | The inputs. | | `inplace` | bool | If `True`, the array is modified in place. | | **RETURNS** | FloatsXd | The outputs. | ### Ops.backprop_hard_swish {#backprop_hard_swish tag="method"} - **default:** - **numpy:** - **cupy:** Backpropagate the hard Swish activation. | Argument | Type | Description | | ----------- | ----------------- | ----------------------------------------------- | | `dY` | FloatsXd | Gradients of the output array. | | `X` | FloatsXd | The inputs to the forward pass. | | `inplace` | bool | If `True`, the `dY` array is modified in place. | | **RETURNS** | FloatsXd | The gradient of the input. | ### Ops.hard_swish_mobilenet {#hard_swish_mobilenet tag="method"} - **default:** - **numpy:** - **cupy:** A variant of the fast hard Swish activation function used in `MobileNetV3` [(Howard et al., 2019)](https://arxiv.org/abs/1905.02244), defined as `x * (relu6(x + 3) / 6)`. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------ | | `X` | FloatsXd | The inputs. | | `inplace` | bool | If `True`, the array is modified in place. | | **RETURNS** | FloatsXd | The outputs. | ### Ops.backprop_hard_swish_mobilenet {#backprop_hard_swish_mobilenet tag="method"} - **default:** - **numpy:** - **cupy:** Backpropagate the hard Swish MobileNet activation. | Argument | Type | Description | | ----------- | ----------------- | ----------------------------------------------- | | `dY` | FloatsXd | Gradients of the output array. | | `X` | FloatsXd | The inputs to the forward pass. | | `inplace` | bool | If `True`, the `dY` array is modified in place. | | **RETURNS** | FloatsXd | The gradient of the input. | ### Ops.reduce_first {#reduce_first tag="method"} - **default:** - **numpy:** default - **cupy:** default Perform sequence-wise first pooling for data in the ragged format. - Zero-length sequences are not allowed. A `ValueError` is raised if any element in `lengths` is zero. - Batch and hidden dimensions can have a size of zero. In these cases the corresponding dimensions in the output also have a size of zero. | Argument | Type | Description | | ----------- | ------------------------------- | --------------------------------------------------------------------- | | `X` | Floats2d | The concatenated sequences. | | `lengths` | Ints1d | The sequence lengths. | | **RETURNS** | Tuple[Floats2d,Ints1d] | The first vector of each sequence and the sequence start/end indices. | ### Ops.backprop_reduce_first {#backprop_reduce_first tag="method"} - **default:** - **numpy:** default - **cupy:** default Backpropagate the `reduce_first` operation. | Argument | Type | Description | | ------------- | ----------------- | ------------------------------------------- | | `d_firsts` | Floats2d | The gradient of the outputs. | | `starts_ends` | Ints1d | The sequence start/end indices. | | **RETURNS** | Floats2d | The gradient of the concatenated sequences. | ### Ops.reduce_last {#reduce_last tag="method"} - **default:** - **numpy:** default - **cupy:** default Perform sequence-wise last pooling for data in the ragged format. - Zero-length sequences are not allowed. A `ValueError` is raised if any element in `lengths` is zero. - Batch and hidden dimensions can have a size of zero. In these cases the corresponding dimensions in the output also have a size of zero. | Argument | Type | Description | | ----------- | ------------------------------- | ------------------------------------------------------------------------------- | | `X` | Floats2d | The concatenated sequences. | | `lengths` | Ints1d | The sequence lengths. | | **RETURNS** | Tuple[Floats2d,Ints1d] | The last vector of each sequence and the indices of the last sequence elements. | ### Ops.backprop_reduce_last {#backprop_reduce_last tag="method"} - **default:** - **numpy:** default - **cupy:** default Backpropagate the `reduce_last` operation. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------- | | `d_lasts` | Floats2d | The gradient of the outputs. | | `lasts` | Ints1d | Indices of the last sequence elements. | | **RETURNS** | Floats2d | The gradient of the concatenated sequences. | ### Ops.reduce_sum {#reduce_sum tag="method"} - **default:** - **numpy:** - **cupy:** Perform sequence-wise summation for data in the ragged format. - Zero-length sequences are reduced to all-zero vectors. - Batch and hidden dimensions can have a size of zero. In these cases the corresponding dimensions in the output also have a size of zero. | Argument | Type | Description | | ----------- | ----------------- | ----------------------------- | | `X` | Floats2d | The concatenated sequences. | | `lengths` | Ints1d | The sequence lengths. | | **RETURNS** | Floats2d | The sequence-wise summations. | ### Ops.backprop_reduce_sum {#backprop_reduce_sum tag="method"} - **default:** - **numpy:** - **cupy:** Backpropagate the `reduce_sum` operation. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------- | | `d_sums` | Floats2d | The gradient of the outputs. | | `lengths` | Ints1d | The sequence lengths. | | **RETURNS** | Floats2d | The gradient of the concatenated sequences. | ### Ops.reduce_mean {#reduce_mean tag="method"} - **default:** - **numpy:** - **cupy:** Perform sequence-wise averaging for data in the ragged format. - Zero-length sequences are reduced to all-zero vectors. - Batch and hidden dimensions can have a size of zero. In these cases the corresponding dimensions in the output also have a size of zero. | Argument | Type | Description | | ----------- | ----------------- | --------------------------- | | `X` | Floats2d | The concatenated sequences. | | `lengths` | Ints1d | The sequence lengths. | | **RETURNS** | Floats2d | The sequence-wise averages. | ### Ops.backprop_reduce_mean {#backprop_reduce_mean tag="method"} - **default:** - **numpy:** - **cupy:** Backpropagate the `reduce_mean` operation. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------- | | `d_means` | Floats2d | The gradient of the outputs. | | `lengths` | Ints1d | The sequence lengths. | | **RETURNS** | Floats2d | The gradient of the concatenated sequences. | ### Ops.reduce_max {#reduce_max tag="method"} - **default:** - **numpy:** - **cupy:** Perform sequence-wise max pooling for data in the ragged format. Zero-length sequences are not allowed. - Zero-length sequences are not allowed. A `ValueError` is raised if any element in `lengths` is zero. - Batch and hidden dimensions can have a size of zero. In these cases the corresponding dimensions in the output also have a size of zero. | Argument | Type | Description | | ----------- | -------------------------------- | --------------------------- | | `X` | Floats2d | The concatenated sequences. | | `lengths` | Ints1d | The sequence lengths. | | **RETURNS** | Tuple[Floats2d, Ints2d] | The sequence-wise maximums. | ### Ops.backprop_reduce_max {#backprop_reduce_max tag="method"} - **default:** - **numpy:** - **cupy:** Backpropagate the `reduce_max` operation. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------------- | | `d_maxes` | Floats2d | The gradient of the outputs. | | `which` | Ints2d | The indices selected. | | `lengths` | Ints1d | The sequence lengths. | | **RETURNS** | Floats2d | The gradient of the concatenated sequences. | ### Ops.hash {#hash tag="method"} - **default:** - **numpy:** - **cupy:** Hash a sequence of 64-bit keys into a table with four 32-bit keys, using `murmurhash3`. | Argument | Type | Description | | ----------- | --------------- | ----------------------------------- | | `ids` | Ints1d | The keys, 64-bit unsigned integers. | | `seed` | int | The hashing seed. | | **RETURNS** | Ints2d | The hashes. | ### Ops.ngrams {#ngrams tag="method"} - **default:** - **numpy:** - **cupy:** default Create hashed ngram features. | Argument | Type | Description | | ----------- | --------------- | ------------------------------------------ | | `n` | int | The window to calculate each feature over. | | `keys` | Ints1d | The input sequence. | | **RETURNS** | Ints1d | The hashed ngrams. | ### Ops.gather_add {#gather_add tag="method" new="8.1"} - **default:** - **numpy:** - **cupy:** Gather rows from `table` with shape `(T, O)` using array `indices` with shape `(B, K)`, then sum the resulting array with shape `(B, K, O)` over the `K` axis. | Argument | Type | Description | | ----------- | ----------------- | ----------------------- | | `table` | Floats2d | The array to increment. | | `indices` | Ints2d | The indices to use. | | **RETURNS** | Floats2d | The summed rows. | ### Ops.scatter_add {#scatter_add tag="method"} - **default:** - **numpy:** - **cupy:** Increment entries in the array out using the indices in `ids` and the values in `inputs`. | Argument | Type | Description | | ----------- | ----------------- | ----------------------- | | `table` | FloatsXd | The array to increment. | | `indices` | IntsXd | The indices to use. | | `values` | FloatsXd | The inputs. | | **RETURNS** | FloatsXd | The incremented array. | --- ## Utilities {#util} ### get_ops {#get_ops tag="function"} Get a backend object using a string name. ```python ### Example from thinc.api import get_ops numpy_ops = get_ops("numpy") ``` | Argument | Type | Description | | ----------- | ------------ | ----------------------------------------------------- | | `ops` | str | `"numpy"`, `"apple"`, `"cupy"` or `"mps"`. | | `**kwargs` | | Optional arguments passed to [`Ops.__init__`](#init). | | **RETURNS** | Ops | The backend object. | ### use_ops {#use_ops tag="contextmanager"} Change the backend to execute with for the scope of the block. ```python ### Example from thinc.api import use_ops, get_current_ops with use_ops("cupy"): current_ops = get_current_ops() assert current_ops.name == "cupy" ``` | Argument | Type | Description | | ---------- | ------------ | ----------------------------------------------------- | | `ops` | str | `"numpy"`, `"apple"`, `"cupy"` or `"mps"`. | | `**kwargs` | | Optional arguments passed to [`Ops.__init__`](#init). | ### get_current_ops {#get_current_ops tag="function"} Get the current backend object. | Argument | Type | Description | | ----------- | ------------ | --------------------------- | | **RETURNS** | Ops | The current backend object. | ### set_current_ops {#set_current_ops tag="function"} Set the current backend object. | Argument | Type | Description | | -------- | ------------ | ------------------- | | `ops` | Ops | The backend object. | ### set_gpu_allocator {#set_gpu_allocator tag="function"} Set the CuPy GPU memory allocator. | Argument | Type | Description | | ----------- | ------------ | ------------------------------------- | | `allocator` | str | Either `"pytorch"` or `"tensorflow"`. | ```python ### Example from thinc.api set_gpu_allocator set_gpu_allocator("pytorch") ``` thinc-release-v9.1.1/website/docs/api-config.md000066400000000000000000000574761467064331700214210ustar00rootroot00000000000000--- title: Config & Registry teaser: Function registry and configuration system next: /docs/api-types --- | | | | ------------------------- | ------------------------------------------------------------------------------- | | [**Config**](#config) | `Config` class used to load and create INI-style [configs](/docs/usage-config). | | [**Registry**](#registry) | Function registry for layers, optimizers etc. | ## Config {#config tag="class"} This class holds the model and training [configuration](/docs/usage-config) and can load and save the INI-style configuration format from/to a string, file or bytes. The `Config` class is a subclass of `dict` and uses Python's `ConfigParser` under the hood. ### Config.\_\_init\_\_ {#config-init tag="method"} Initialize a new `Config` object with optional data. ```python ### Example from thinc.api import Config config = Config({"training": {"patience": 10, "dropout": 0.2}}) ``` | Argument | Type | Description | | ----------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | | `data` | Optional[Union[Dict[str, Any], Config]] | Optional data to initialize the config with. | | _keyword-only_ | | | | `section_order` | Optional[List[str]] | Top-level section names, in order, used to sort the saved and loaded config. All other sections will be sorted alphabetically. | | `is_interpolated` | Optional[bool] | Whether the config is interpolated or whether it contains variables. Read from the `data` if it's an instance of `Config` and otherwise defaults to `True`. | ### Config.from_str {#config-from_str tag="method"} Load the config from a string. ```python ### Example from thinc.api import Config config_str = """ [training] patience = 10 dropout = 0.2 """ config = Config().from_str(config_str) print(config["training"]) # {'patience': 10, 'dropout': 0.2}} ``` | Argument | Type | Description | | -------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------- | | `text` | str | The string config to load. | | _keyword-only_ | | | | `interpolate` | bool | Whether to interpolate variables like `${section.key}`. Defaults to `True`. | | `overrides` | Dict[str, Any] | Overrides for values and sections. Keys are provided in dot notation, e.g. `"training.dropout"` mapped to the value. | | **RETURNS** | Config | The loaded config. | ### Config.to_str {#config-to_str tag="method"} Write the config to a string. ```python ### Example from thinc.api import Config config = Config({"training": {"patience": 10, "dropout": 0.2}}) print(config.to_str()) # '[training]\npatience = 10\n\ndropout = 0.2' ``` | Argument | Type | Description | | ------------- | ------------- | --------------------------------------------------------------------------- | | `interpolate` | bool | Whether to interpolate variables like `${section.key}`. Defaults to `True`. | | **RETURNS** | str | The string config. | ### Config.to_bytes {#config-to_bytes tag="method"} Serialize the config to a byte string. ```python ### Example from thinc.api import Config config = Config({"training": {"patience": 10, "dropout": 0.2}}) config_bytes = config.to_bytes() print(config_bytes) # b'[training]\npatience = 10\n\ndropout = 0.2' ``` | Argument | Type | Description | | -------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------- | | _keyword-only_ | | | | `interpolate` | bool | Whether to interpolate variables like `${section.key}`. Defaults to `True`. | | `overrides` | Dict[str, Any] | Overrides for values and sections. Keys are provided in dot notation, e.g. `"training.dropout"` mapped to the value. | | **RETURNS** | bytes | The serialized config. | ### Config.from_bytes {#config-from_bytes tag="method"} Load the config from a byte string. ```python ### Example from thinc.api import Config config = Config({"training": {"patience": 10, "dropout": 0.2}}) config_bytes = config.to_bytes() new_config = Config().from_bytes(config_bytes) ``` | Argument | Type | Description | | -------------- | --------------- | --------------------------------------------------------------------------- | | `bytes_data` | bytes | The data to load. | | _keyword-only_ | | | | `interpolate` | bool | Whether to interpolate variables like `${section.key}`. Defaults to `True`. | | **RETURNS** | Config | The loaded config. | ### Config.to_disk {#config-to_disk tag="method"} Serialize the config to a file. ```python ### Example from thinc.api import Config config = Config({"training": {"patience": 10, "dropout": 0.2}}) config.to_disk("./config.cfg") ``` | Argument | Type | Description | | -------------- | ------------------------- | --------------------------------------------------------------------------- | | `path` | Union[Path, str] | The file path. | | _keyword-only_ | | | | `interpolate` | bool | Whether to interpolate variables like `${section.key}`. Defaults to `True`. | ### Config.from_disk {#config-from_disk tag="method"} Load the config from a file. ```python ### Example from thinc.api import Config config = Config({"training": {"patience": 10, "dropout": 0.2}}) config.to_disk("./config.cfg") new_config = Config().from_disk("./config.cfg") ``` | Argument | Type | Description | | -------------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------- | | `path` | Union[Path, str] | The file path. | | _keyword-only_ | | | | `interpolate` | bool | Whether to interpolate variables like `${section.key}`. Defaults to `True`. | | `overrides` | Dict[str, Any] | Overrides for values and sections. Keys are provided in dot notation, e.g. `"training.dropout"` mapped to the value. | | **RETURNS** | Config | The loaded config. | ### Config.copy {#config-copy tag="method"} Deep-copy the config. | Argument | Type | Description | | ----------- | --------------- | ------------------ | | **RETURNS** | Config | The copied config. | ### Config.interpolate {#config-interpolate tag="method"} Interpolate [variables](/docs/usage-config#config-interpolation) like `${section.value}` or `${section.subsection}` and return a copy of the config with interpolated values. Can be used if a config is loaded with `interpolate=False`, e.g. via [`Config.from_str`](#config-from_str). ```python ### Example from thinc.api import Config config_str = """ [hyper_params] dropout = 0.2 [training] dropout = ${hyper_params.dropout} """ config = Config().from_str(config_str, interpolate=False) print(config["training"]) # {'dropout': '${hyper_params.dropout}'}} config = config.interpolate() print(config["training"]) # {'dropout': 0.2}} ``` | Argument | Type | Description | | ----------- | --------------- | ---------------------------------------------- | | **RETURNS** | Config | A copy of the config with interpolated values. | ### Config.merge {#config-merge tag="method"} Deep-merge two config objects, using the current config as the default. Only merges sections and dictionaries and not other values like lists. Values that are provided in the updates are overwritten in the base config, and any new values or sections are added. If a config value is a variable like `${section.key}` (e.g. if the config was loaded with `interpolate=False`), the **variable is preferred**, even if the updates provide a different value. This ensures that variable references aren't destroyed by a merge. Note that blocks that refer to [registered functions](/docs/usage-config#registry) using the `@` syntax are only merged if they are referring to the same functions. Otherwise, merging could easily produce invalid configs, since different functions can take different arguments. If a block refers to a different function, it's overwritten. ```python ### Example from thinc.api import Config base_config_str = """ [training] patience = 10 dropout = 0.2 """ update_config_str = """ [training] dropout = 0.1 max_epochs = 2000 """ base_config = Config().from_str(base_config_str) update_config = Config().from_str(update_config_str) merged = Config(base_config).merge(update_config) print(merged["training"]) # {'patience': 10, 'dropout': 1.0, 'max_epochs': 2000} ``` | Argument | Type | Description | | ----------- | -------------------------------------- | --------------------------------------------------- | | `updates` | Union[Dict[str, Any], Config] | The updates to merge into the config. | | **RETURNS** | Config | A new config instance containing the merged config. | ### Config Attributes | Name | Type | Description | | ----------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `is_interpolated` | bool | Whether the config values have been interpolated. Defaults to `True` and is set to `False` if a config is loaded with `interpolate=False`, e.g. using [`Config.from_str`](#config-from_str). | --- ## Registry {#registry tag="class"} Thinc's registry system lets you **map string keys to functions**. You can register functions to create [optimizers](/docs/api-optimizers), [schedules](/docs/api-schedules), [layers](/docs/api-layers) and more, and then refer to them and set their arguments in your [config file](/docs/usage-config). Python type hints are used to validate the inputs. ```python ### Example import thinc @thinc.registry.optimizers.register("my_cool_optimizer.v1") def make_my_optimizer(learn_rate: float, gamma: float): return MyCoolOptimizer(learn_rate, gamma) ``` ```ini ### Valid Config {small="true"} [optimizer] @optimizers = "my_cool_optimizer.v1" learn_rate = 0.001 gamma = 1e-8 ``` ```ini ### Invalid Config {small="true"} [optimizer] @optimizers = "my_cool_optimizer.v1" learn_rate = 1 # not a float schedules = null # unknown argument ``` ### Attributes {#registry-attributes} | Registry name | Description | | -------------- | -------------------------------------------------------------------------- | | `optimizers` | Registry for functions that create [optimizers](/docs/api-optimizers). | | `schedules` | Registry for functions that create [schedules](/docs/api-schedules). | | `layers` | Registry for functions that create [layers](/docs/api-layers). | | `losses` | Registry for functions that create [losses](/docs/api-loss). | | `initializers` | Registry for functions that create [initializers](/docs/api-initializers). | ### registry.get {#registry-get tag="classmethod"} Get a registered function from a given registry using string names. Will raise an error if the registry or function doesn't exist. All individual registries also have a `get` method to get a registered function. ```python ### Example import thinc registered_func = thinc.registry.get("optimizers", "my_cool_optimizer.v1") # The above is the same as: registered_func = thinc.registry.optimizers.get("my_cool_optimizer.v1") ``` | Argument | Type | Description | | --------------- | ----------------- | ---------------------------------------------- | | `registry_name` | str | The name of the registry, e.g. `"optimizers"`. | | `func_name` | str | The name of the function. | | **RETURNS** | Callable | The registered function. | ### registry.create {#registry-create tag="classmethod"} Create a new function registry that will become available as an attribute to `registry`. Will raise an error if a registry of the name already exists. Under the hood, this calls into [`catalogue.create`](https://github.com/explosion/catalogue#function-cataloguecreate) using the `"thinc"` namespace. ```python ### Example import thinc thinc.registry.create("visualizers") @thinc.registry.visualizers("my_cool_visualizer.v1") def my_cool_visualizer(format: str = "jpg") -> "MyCoolVisualizer": return MyCoolVisualizer(format) ``` | Argument | Type | Description | | --------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `registry_name` | str | The name of the registry to create, e.g. `"visualizers"`. | | `entry_points` | bool | Allow the registry to be populated with entry points advertised by other packages (e.g. via the `"thinc_visualizers"` entry point group). Defaults to `False`. | Registry names can be _any string_ – however, if you want to use your registry as an attribute of `thinc.registry`, e.g. `@thinc.registry.visualizers`, they should be valid Python attribute names and only contain alphanumeric characters and underscores. ### registry.fill {#fill tag="classmethod"} Unpack a config dictionary, but leave all references to registry functions intact and don't resolve them. Only use the type annotations and optional base schema to fill in all arguments and their default values. This method is especially useful for getting an existing config up to date with changes in the schema and/or function arguments. If the config is incomplete and contains missing values for required arguments, you can set `validate=False` to skip validation and only update it. The updated schema should then pass validation. If the provided [`Config`](#config) still includes references to variables, e.g. if it was loaded with `interpolate=False` using a method like [`Config.from_str`](#config-from_str), a copy of the config is interpolated so it can be filled, and a filled version with the variables intact is returned. This means you can auto-fill partial config, without destroying the variables. ```python ### Example from thinc.api import Config, registry cfg = Config().from_disk("./my_config.cfg") filled_cfg = registry.fill(cfg) ``` | Argument | Type | Description | | -------------- | -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `config` | Union[Config, Dict[str, Any]] | The config dict to load. | | _keyword-only_ | | | | `validate` | bool | Whether to validate the config against a base schema and/or type annotations defined on the registered functions. Defaults to `True`. | | `schema` | pydantic.BaseModel | Optional [`pydantic` model](https://pydantic-docs.helpmanual.io/usage/models/) to validate the config against. See the docs on [base schemas](/docs/api-config#advanced-types-base-schema) for details. Defaults to an `EmptySchema` with extra properties and arbitrary types allowed. | | `overrides` | Dict[str, Any] | Optional overrides for config values. Should be a dictionary keyed by config properties with dot notation, e.g. `{"training.batch_size": 128}`. | | **RETURNS** | Config | The filled config. | ### registry.resolve {#registry-resolve tag="classmethod"} Unpack a config dictionary, creating objects from the registry recursively. If a section contains a key beginning with `@`, the rest of that key will be interpreted as the name of the registry. For instance, `"@optimizers": "my_cool_optimizer.v1"` will load the function from the optimizers registry and pass in the specified arguments. For more details and examples, see the [docs on Thinc's config system](/docs/usage-config). ```python ### Example from thinc.api import Config, registry cfg = Config().from_disk("./my_config.cfg") resolved = registry.resolve(cfg) ``` | Argument | Type | Description | | -------------- | -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `config` | Union[Config, Dict[str, Any]] | The config dict to load. | | _keyword-only_ | | | | `validate` | bool | Whether to validate the config against a base schema and/or type annotations defined on the registered functions. Defaults to `True`. | | `schema` | pydantic.BaseModel | Optional [`pydantic` model](https://pydantic-docs.helpmanual.io/usage/models/) to validate the config against. See the docs on [base schemas](/docs/api-config#advanced-types-base-schema) for details. Defaults to an `EmptySchema` with extra properties and arbitrary types allowed. | | `overrides` | Dict[str, Any] | Optional overrides for config values. Should be a dictionary keyed by config properties with dot notation, e.g. `{"training.batch_size": 128}`. | | **RETURNS** | Dict[str, Any] | The resolved config. | thinc-release-v9.1.1/website/docs/api-initializers.md000066400000000000000000000177621467064331700226540ustar00rootroot00000000000000--- title: Initializers next: /docs/api-schedules --- A collection of initialization functions. Parameter initialization schemes can be very important for deep neural networks, because the initial distribution of the weights helps determine whether activations change in mean and variance as the signal moves through the network. If the activations are not stable, the network will not learn effectively. The "best" initialization scheme changes depending on the activation functions being used, which is why a variety of initializations are necessary. You can reduce the importance of the initialization by using normalization after your hidden layers. ### normal_init {#normal_init tag="function"} Initialize from a normal distribution, with `scale = sqrt(1 / fan_in)`. | Argument | Type | Description | | -------------- | ----------------- | --------------------------------------------------------------------------------- | | `ops` | Ops | The backend object, e.g. `model.ops`. | | `shape` | Shape | The data shape. | | _keyword-only_ | | | | `fan_in` | int | Usually the number of inputs to the layer. If `-1`, the second dimension is used. | | **RETURNS** | FloatsXd | The initialized array. | ### glorot_uniform_init {#glorot_uniform_init tag="function"} Initialize from a uniform distribution with `scale` parameter computed by the method introduced by Xavier Glorot ([Glorot and Bengio, 2010])(http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf): `scale = sqrt(6.0 / (data.shape[0] + data.shape[1]))`. Usually used in [`Relu`](/docs/api-layers#relu) layers. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------- | | `ops` | Ops | The backend object, e.g. `model.ops`. | | `shape` | Shape | The data shape. | | **RETURNS** | FloatsXd | The initialized array. | ### glorot_normal_init {#glorot_normal_init tag="function"} Initialize from a normal distribution with `scale` parameter computed by the method introduced by Xavier Glorot ([Glorot and Bengio, 2010])(http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf): `scale = sqrt(2.0 / (data.shape[0] + data.shape[1]))`. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------- | | `ops` | Ops | The backend object, e.g. `model.ops`. | | `shape` | Shape | The data shape. | | **RETURNS** | FloatsXd | The initialized array. | ### he_uniform_init {#he_uniform_init tag="function"} Initialize from a uniform distribution with `scale` parameter computed by the method introduced in [He et al., 2015](https://arxiv.org/abs/1502.01852): `scale = sqrt(6.0 / data.shape[1])`. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------- | | `ops` | Ops | The backend object, e.g. `model.ops`. | | `shape` | Shape | The data shape. | | **RETURNS** | FloatsXd | The initialized array. | ### he_normal_init {#he_normal_init tag="function"} Initialize from a normal distribution with `scale` parameter computed by the method introduced in [He et al., 2015](https://arxiv.org/abs/1502.01852): `scale = sqrt(2.0 / data.shape[1])`. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------- | | `ops` | Ops | The backend object, e.g. `model.ops`. | | `shape` | Shape | The data shape. | | **RETURNS** | FloatsXd | The initialized array. | ### lecun_uniform_init {#lecun_uniform_init tag="function"} Initialize from a uniform distribution with `scale` parameter computed as: `scale = sqrt(3.0 / data.shape[1])`. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------- | | `ops` | Ops | The backend object, e.g. `model.ops`. | | `shape` | Shape | The data shape. | | **RETURNS** | FloatsXd | The initialized array. | ### lecun_normal_init {#lecun_normal_init tag="function"} Initialize from a normal distribution with `scale` parameter computed as: `variance = sqrt(1.0 / data.shape[1])`. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------- | | `ops` | Ops | The backend object, e.g. `model.ops`. | | `shape` | Shape | The data shape. | | **RETURNS** | FloatsXd | The initialized array. | ### zero_init {#zero_init tag="function"} Initialize a parameter with zero weights. This is usually used for output layers and for bias vectors. | Argument | Type | Description | | ----------- | ----------------- | ------------------------------------- | | `ops` | Ops | The backend object, e.g. `model.ops`. | | `shape` | Shape | The data shape. | | **RETURNS** | FloatsXd | The initialized array. | ### uniform_init {#uniform_init tag="function"} Initialize values from a uniform distribution. This is usually used for word embedding tables. | Argument | Type | Description | | -------------- | ----------------- | ---------------------------------------- | | `ops` | Ops | The backend object, e.g. `model.ops`. | | `shape` | Shape | The data shape. | | _keyword-only_ | | | | `lo` | float | The minimum of the uniform distribution. | | `hi` | float | The maximum of the uniform distribution. | | **RETURNS** | FloatsXd | The initialized array. | --- ## Usage via config and function registry {#registry} Since the initializers need to be called with data, defining them in the [config](/docs/usage-config) will return a **configured function**: a partial with only the settings (the keyword arguments) applied. Within your script, you can then pass in the data, and the configured function will be called using the settings defined in the config. Most commonly, the initializer is passed as an argument to a [layer](/docs/api-layers), so it can be defined as its own config block nested under the layer settings: ```ini ### config.cfg {small="true"} [model] @layers = "linear.v1" nO = 10 [model.init_W] @initializers = "normal_init.v1" fan_in = -1 ``` ```python ### Usage {small="true"} from thinc.api import registry, Config config = Config().from_disk("./config.cfg") resolved = registry.resolve(config) model = resolved["model"] ``` You can also define it as a regular config setting and then call the configured function in your script: ```ini ### config.cfg {small="true"} [initializer] @initializers = "uniform_init.v1" lo = -0.1 hi = 0.1 ``` ```python ### Usage {small="true"} from thinc.api import registry, Config, NumpyOps config = Config().from_disk("./config.cfg") resolved = registry.resolve(config) initializer = resolved["initializer"] weights = initializer(NumpyOps(), (3, 2)) ``` thinc-release-v9.1.1/website/docs/api-layers.md000066400000000000000000003137371467064331700214460ustar00rootroot00000000000000--- title: Layers teaser: Weights layers, transforms, combinators and wrappers next: /docs/api-optimizers --- This page describes functions for defining your model. Each layer is implemented in its own module in [`thinc.layers`](https://github.com/explosion/thinc/blob/master/thinc/layers) and can be imported from `thinc.api`. Most layer files define two public functions: a **creation function** that returns a [`Model`](/docs/api-model) instance, and a **forward function** that performs the computation. | | | | ------------------------------------------ | -------------------------------------------------------------------------------- | | [**Weights layers**](#weights-layers) | Layers that use an internal weights matrix for their computations. | | [**Reduction operations**](#reduction-ops) | Layers that perform rank reductions, e.g. pooling from word to sentence vectors. | | [**Combinators**](#combinators) | Layers that combine two or more existing layers. | | [**Data type transfers**](#transfers) | Layers that transform data to different types. | | [**Wrappers**](#wrappers) | Wrapper layers for other libraries like PyTorch and TensorFlow. | ## Weights layers {#weights-layers} ### CauchySimilarity {#cauchysimilarity tag="function"} - **Input:** Tuple[Floats2d, Floats2d] - **Output:** Floats1d - **Parameters:** W Compare input vectors according to the Cauchy similarity function proposed by [Chen (2013)](https://tspace.library.utoronto.ca/bitstream/1807/43097/3/Liu_Chen_201311_MASc_thesis.pdf). Primarily used within [`siamese`](#siamese) neural networks. | Argument | Type | Description | | ----------- | --------------------------------------------------- | ------------------------------ | | `nI` | Optional[int] | The size of the input vectors. | | **RETURNS** | Model[Tuple[Floats2d, Floats2d], Floats1d] | The created similarity layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/cauchysimilarity.py ``` ### Dish {#dish tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A dense layer with the Dish activation function. Dish or "Daniël's Swish-like activation" is an activation function with a non-monotinic shape similar to [GELU](#gelu), [Swish](#swish) and [Mish](#mish). However, Dish does not rely on elementary functions like `exp` or `erf`, making it much [faster to compute](https://twitter.com/danieldekok/status/1484898130441166853) in most cases. | Argument | Type | Description | | -------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`he_normal_init`](/docs/api-initializers#he_normal_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `dropout` | Optional[float] | Dropout rate to avoid overfitting. | | `normalize` | bool | Whether or not to apply [layer normalization](#layernorm). Defaults to `False`. | | **RETURNS** | Model[Floats2d, Floats2d] | The created dense layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/dish.py ``` ### Dropout {#dropout tag="function"} - **Input:** ArrayXd / Sequence[ArrayXd] / Ragged / Padded - **Output:** ArrayXd / Sequence[ArrayXd] / Ragged / Padded - **Attrs:** `dropout_rate` float Helps prevent overfitting by adding a random distortion to the input data during training. Specifically, cells of the input are zeroed with probability determined by the `dropout_rate` argument. Cells which are not zeroed are rescaled by `1-rate`. When not in training mode, the distortion is disabled (see [Hinton et al., 2012](https://arxiv.org/abs/1207.0580)). ```python ### Example from thinc.api import chain, Linear, Dropout model = chain(Linear(10, 2), Dropout(0.2)) Y, backprop = model(X, is_train=True) # Configure dropout rate via the dropout_rate attribute. for node in model.walk(): if node.name == "dropout": node.attrs["dropout_rate"] = 0.5 ``` | Argument | Type | Description | | -------------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | | `dropout_rate` | float | The probability of zeroing the activations (default: 0). Higher dropout rates mean more distortion. Values around `0.2` are often good. | | **RETURNS** | Model[T, T] | The created dropout layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/dropout.py ``` ### Embed {#embed tag="function"} - **Input:** Union[Ints1d, Ints2d] - **Output:** Floats2d - **Parameters:** E - **Attrs:** `column` int, `dropout_rate` float Map integers to vectors, using a fixed-size lookup table. The input to the layer should be a two-dimensional array of integers, one column of which the embeddings table will slice as the indices. | Argument | Type | Description | | -------------- | ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | | `nO` | Optional[int] | The size of the output vectors. | | `nV` | int | Number of input vectors. Defaults to `1`. | | _keyword-only_ | | | | `column` | int | The column to slice from the input, to get the indices. | | `initializer` | Optional[Callable] | A function to initialize the internal parameters. Defaults to [`uniform_init`](/docs/api-initializers#uniform_init) when set to `None`. | | `dropout` | Optional[float] | Dropout rate to avoid overfitting (default `None`). | | **RETURNS** | Model[Union[Ints1d, Ints2d], Floats2d] | The created embedding layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/embed.py ``` ### HashEmbed {#hashembed tag="function"} - **Input:** Union[Ints1d, Ints2d] / - **Output:** Floats2d - **Parameters:** E - **Attrs:** `seed` Optional[int], `column` int, `dropout_rate` float An embedding layer that uses the "hashing trick" to map keys to distinct values. The hashing trick involves hashing each key four times with distinct seeds, to produce four likely differing values. Those values are modded into the table, and the resulting vectors summed to produce a single result. Because it's unlikely that two different keys will collide on all four "buckets", most distinct keys will receive a distinct vector under this scheme, even when the number of vectors in the table is very low. | Argument | Type | Description | | -------------- | ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | | `nO` | int | The size of the output vectors. | | `nV` | int | Number of input vectors. | | _keyword-only_ | | | | `seed` | Optional[int] | A seed to use for the hashing. | | `column` | int | The column to select features from. | | `initializer` | Optional[Callable] | A function to initialize the internal parameters. Defaults to [`uniform_init`](/docs/api-initializers#uniform_init) when set to `None`. | | `dropout` | Optional[float] | Dropout rate to avoid overfitting (default `None`). | | **RETURNS** | Model[Union[Ints1d, Ints2d], Floats2d] | The created embedding layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/hashembed.py ``` ### LayerNorm {#layernorm tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** b, G Perform layer normalization on the inputs ([Ba et al., 2016](https://arxiv.org/abs/1607.06450)). This layer does not change the dimensionality of the vectors. | Argument | Type | Description | | ----------- | ---------------------------------- | -------------------------------- | | `nI` | Optional[int] | The size of the input vectors. | | **RETURNS** | Model[Floats2d, Floats2d] | The created normalization layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/layernorm.py ``` ### Linear {#linear tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b The `Linear` layer multiplies inputs by a weights matrix `W` and adds a bias vector `b`. In PyTorch this is called a `Linear` layer, while Keras calls it a `Dense` layer. ```python ### Example from thinc.api import Linear model = Linear(10, 5) model.initialize() Y = model.predict(model.ops.alloc2f(2, 5)) assert Y.shape == (2, 10) ``` | Argument | Type | Description | | -------------- | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `init_W` | Callable | A function to initialize the weights matrix. Defaults to [`glorot_uniform_init`](/docs/api-initializers#glorot_uniform_init). | | `init_b` | Callable | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init). | | **RETURNS** | Model[Floats2d, Floats2d] | The created `Linear` layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/linear.py ``` ### Sigmoid {#sigmoid tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A linear (aka dense) layer, followed by a sigmoid activation. This is usually used as an output layer for multi-label classification (in contrast to the `Softmax` layer, which is used for problems where exactly one class is correct per example. | Argument | Type | Description | | ----------- | ---------------------------------- | -------------------------------- | | `nOs` | Tuple[int, ...] | The sizes of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | **RETURNS** | Model[Floats2d, Floats2d] | The created sigmoid layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/sigmoid.py ``` ### sigmoid_activation {#sigmoid_activation tag="function"} - **Input:** FloatsXd - **Output:** FloatsXd Apply the sigmoid logistic function as an activation to the inputs. This is often used as an output activation for multi-label classification, because each element of the output vectors will be between `0` and `1`. | Argument | Type | Description | | ----------- | ---------------------------------- | --------------------------------------- | | **RETURNS** | Model[Floats2d, Floats2d] | The created `sigmoid_activation` layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/sigmoid_activation.py ``` ### LSTM and BiLSTM {#lstm tag="function"} - **Input:** Padded - **Output:** Padded - **Parameters:** `depth` int, `dropout` float An LSTM recurrent neural network. The BiLSTM is bidirectional: that is, each layer concatenated a forward LSTM with an LSTM running in the reverse direction. If you are able to install PyTorch, you should usually prefer to use the `PyTorchLSTM` layer instead of Thinc's implementations, as PyTorch's LSTM implementation is significantly faster. | Argument | Type | Description | | -------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `bi` | bool | Use BiLSTM. | | `depth` | int | Number of layers (default `1`). | | `dropout` | float | Dropout rate to avoid overfitting (default `0`). | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`glorot_uniform_init`](/docs/api-initializers#glorot_uniform_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | **RETURNS** | Model[Padded, Padded] | The created LSTM layer(s). | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/lstm.py ``` ### Maxout {#maxout tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A dense layer with a "maxout" activation ([Goodfellow et al, 2013](https://arxiv.org/abs/1302.4389)). Maxout layers require a weights array of shape `(nO, nP, nI)` in order to compute outputs of width `nO` given inputs of width `nI`. The extra multiple, `nP`, determines the number of "pieces" that the piecewise-linear activation will consider. | Argument | Type | Description | | -------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | `nP` | int | Number of maxout pieces (default: 3). | | _keyword-only_ | | | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`glorot_uniform_init`](/docs/api-initializers#glorot_uniform_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `dropout` | Optional[float] | Dropout rate to avoid overfitting. | | `normalize` | bool | Whether or not to apply [layer normalization](#layernorm), (default: False). | | **RETURNS** | Model[Floats2d, Floats2d] | The created maxout layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/maxout.py ``` ### Mish {#mish tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A dense layer with Mish activation ([Misra, 2019](https://arxiv.org/pdf/1908.08681.pdf)). | Argument | Type | Description | | -------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`glorot_uniform_init`](/docs/api-initializers#glorot_uniform_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `dropout` | Optional[float] | Dropout rate to avoid overfitting. | | `normalize` | bool | Whether or not to apply [layer normalization](#layernorm), (default: False). | | **RETURNS** | Model[Floats2d, Floats2d] | The created dense layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/mish.py ``` ### Swish {#swish tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A dense layer with the Swish activation function [(Ramachandran et al., 2017)](https://arxiv.org/abs/1710.05941v2). Swish is a self-gating non-monotonic activation function similar to [`GELU`](#gelu): whereas GELU uses the CDF of the Gaussian distribution Φ for self-gating `x * Φ(x)` Swish uses the logistic CDF `x * σ(x)`. Sometimes referred to as "SiLU" for "Sigmoid Linear Unit". | Argument | Type | Description | | -------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`he_normal_init`](/docs/api-initializers#he_normal_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `dropout` | Optional[float] | Dropout rate to avoid overfitting. | | `normalize` | bool | Whether or not to apply [layer normalization](#layernorm). Defaults to `False`. | | **RETURNS** | Model[Floats2d, Floats2d] | The created dense layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/swish.py ``` ### Gelu {#gelu tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A dense layer with the GELU activation function [(Hendrycks and Gimpel, 2016)](https://arxiv.org/abs/1606.08415). The GELU or "Gaussian Error Linear Unit" is a self-gating non-monotonic activation function similar to [Swish](#swish): whereas GELU uses the CDF of the Gaussian distribution Φ for self-gating `x * Φ(x)` the Swish activation uses the logistic CDF σ and computes `x * σ(x)`. Various approximations exist, but `thinc` implements the exact GELU. The use of GELU is popular within transformer feed-forward blocks. | Argument | Type | Description | | -------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`he_normal_init`](/docs/api-initializers#he_normal_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `dropout` | Optional[float] | Dropout rate to avoid overfitting. | | `normalize` | bool | Whether or not to apply [layer normalization](#layernorm). Defaults to `False`. | | **RETURNS** | Model[Floats2d, Floats2d] | The created dense layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/gelu.py ``` ### ReluK {#reluk tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A dense layer with the ReLU activation function where the maximum value is clipped at `k`. A common choice is `k=6` introduced for convolutional deep belief networks [(Krizhevsky, 2010)](https://www.cs.toronto.edu/~kriz/conv-cifar10-aug2010.pdf). The resulting function `relu6` is commonly used in low-precision scenarios. | Argument | Type | Description | | -------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`glorot_uniform_init`](/docs/api-initializers#glorot_uniform_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `dropout` | Optional[float] | Dropout rate to avoid overfitting. | | `normalize` | bool | Whether or not to apply [layer normalization](#layernorm). Defaults to `False`. | | `k` | float | Maximum value. Defaults to `6.0`.. | | **RETURNS** | Model[Floats2d, Floats2d] | The created dense layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/clipped_linear.py#L132 ``` ### HardSigmoid {#hardsigmoid tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A dense layer with hard sigmoid activation function, which is a fast linear approximation of sigmoid, defined as `max(0, min(1, x * 0.2 + 0.5))`. | Argument | Type | Description | | -------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`glorot_uniform_init`](/docs/api-initializers#glorot_uniform_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `dropout` | Optional[float] | Dropout rate to avoid overfitting. | | `normalize` | bool | Whether or not to apply [layer normalization](#layernorm). Defaults to `False`. | | **RETURNS** | Model[Floats2d, Floats2d] | The created dense layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/clipped_linear.py#L90 ``` ### HardTanh {#hardtanh tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A dense layer with hard tanh activation function, which is a fast linear approximation of tanh, defined as `max(-1, min(1, x))`. | Argument | Type | Description | | -------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`glorot_uniform_init`](/docs/api-initializers#glorot_uniform_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `dropout` | Optional[float] | Dropout rate to avoid overfitting. | | `normalize` | bool | Whether or not to apply [layer normalization](#layernorm). Defaults to `False`. | | **RETURNS** | Model[Floats2d, Floats2d] | The created dense layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/clipped_linear.py#L111 ``` ### ClippedLinear {#clippedlinear tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A dense layer implementing a flexible clipped linear activation function of the form `max(min_value, min(max_value, x * slope + offset))`. It is used to implement the [`ReluK`](#reluk), [`HardSigmoid`](#hardsigmoid), and [`HardTanh`](#hardtanh) layers. | Argument | Type | Description | | -------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`glorot_uniform_init`](/docs/api-initializers#glorot_uniform_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `dropout` | Optional[float] | Dropout rate to avoid overfitting. | | `normalize` | bool | Whether or not to apply [layer normalization](#layernorm). Defaults to `False`. | | `slope` | float | The slope of the linear function: `input * slope`. | | `offset` | float | The offset or intercept of the linear function: `input * slope + offset`. | | `min_val` | float | Minimum value to clip to. | | `max_val` | float | Maximum value to clip to. | | **RETURNS** | Model[Floats2d, Floats2d] | The created dense layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/clipped_linear.py ``` ### HardSwish {#hardswish tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A dense layer implementing the hard Swish activation function, which is a fast linear approximation of Swish: `x * hard_sigmoid(x)`. | Argument | Type | Description | | -------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`he_normal_init`](/docs/api-initializers#he_normal_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `dropout` | Optional[float] | Dropout rate to avoid overfitting. | | `normalize` | bool | Whether or not to apply [layer normalization](#layernorm). Defaults to `False`. | | **RETURNS** | Model[Floats2d, Floats2d] | The created dense layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/hard_swish.py ``` ### HardSwishMobileNet {#hardswishmobilenet tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A dense layer implementing the a variant of the fast linear hard Swish activation function used in `MobileNetV3` [(Howard et al., 2019)](https://arxiv.org/abs/1905.02244), defined as `x * (relu6(x + 3) / 6)`. | Argument | Type | Description | | -------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`he_normal_init`](/docs/api-initializers#he_normal_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `dropout` | Optional[float] | Dropout rate to avoid overfitting. | | `normalize` | bool | Whether or not to apply [layer normalization](#layernorm). Defaults to `False`. | | **RETURNS** | Model[Floats2d, Floats2d] | The created dense layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/hard_swish_mobilenet.py ``` ### MultiSoftmax {#multisoftmax tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b Neural network layer that predicts several multi-class attributes at once. For instance, we might predict one class with six variables, and another with five. We predict the 11 neurons required for this, and then softmax them such that columns 0-6 make a probability distribution and columns 6-11 make another. | Argument | Type | Description | | ----------- | ---------------------------------- | -------------------------------- | | `nOs` | Tuple[int, ...] | The sizes of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | **RETURNS** | Model[Floats2d, Floats2d] | The created multi softmax layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/multisoftmax.py ``` ### ParametricAttention {#parametricattention tag="function"} - **Input:** Ragged - **Output:** Ragged - **Parameters:** Q A layer that uses the parametric attention scheme described by [Yang et al. (2016)](https://www.cs.cmu.edu/~./hovy/papers/16HLT-hierarchical-attention-networks.pdf). The layer learns a parameter vector that is used as the keys in a single-headed attention mechanism. | Argument | Type | Description | | ----------- | ------------------------------ | ------------------------------- | | `nO` | Optional[int] | The size of the output vectors. | | **RETURNS** | Model[Ragged, Ragged] | The created attention layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/parametricattention.py ``` ### ParametricAttention_v2 {#parametricattention_v2 tag="function"} - **Input:** Ragged - **Output:** Ragged - **Parameters:** Q A layer that uses the parametric attention scheme described by [Yang et al. (2016)](https://aclanthology.org/N16-1174). The layer learns a parameter vector that is used as the keys in a single-headed attention mechanism. The original `ParametricAttention` layer uses the hidden representation as-is for the keys in the attention. This differs from the paper that introduces parametric attention (Equation 5). `ParametricAttention_v2` adds the option to transform the key representation in line with the paper by passing such a transformation through the `key_transform` parameter. | Argument | Type | Description | |-----------------|----------------------------------------------|------------------------------------------------------------------------| | `key_transform` | Optional[Model[Floats2d, Floats2d]] | Transformation to apply to the key representations. Defaults to `None` | | `nO` | Optional[int] | The size of the output vectors. | | **RETURNS** | Model[Ragged, Ragged] | The created attention layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/parametricattention_v2.py ``` ### Relu {#relu tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A dense layer with Relu activation. | Argument | Type | Description | | -------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`glorot_uniform_init`](/docs/api-initializers#glorot_uniform_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `dropout` | Optional[float] | Dropout rate to avoid overfitting. | | `normalize` | bool | Whether or not to apply [layer normalization](#layernorm), (default: False). | | **RETURNS** | Model[Floats2d, Floats2d] | The created Relu layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/relu.py ``` ### Softmax {#softmax tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A dense layer with a softmax activation. This is usually used as a prediction layer. Vectors produced by the softmax function sum to 1, and have values between 0 and 1, so each vector can be interpreted as a probability distribution. | Argument | Type | Description | | -------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | **RETURNS** | Model[Floats2d, Floats2d] | The created softmax layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/softmax.py ``` ### Softmax_v2 {#softmax_v2 tag="function"} - **Input:** Floats2d - **Output:** Floats2d - **Parameters:** W, b A dense layer with a softmax activation. This is usually used as a prediction layer. Vectors produced by the softmax function sum to 1, and have values between 0 and 1, so each vector can be interpreted as a probability distribution. `Softmax_v2` supports outputting unnormalized probabilities during inference by using `normalize_outputs=False` as an argument. This is useful when we are only interested in finding the top-k classes, but not their probabilities. Computing unnormalized probabilities is faster, because it skips the expensive normalization step. The `temperature` argument of `Softmax_v2` provides control of the softmax distribution. Values larger than 1 increase entropy and values between 0 and 1 (exclusive) decrease entropy of the distribution. The default temperature of 1 will calculate the unmodified softmax distribution. `temperature` is not used during inference when `normalize_outputs=False`. | Argument | Type | Description | | ------------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | | `nO` | Optional[int] | The size of the output vectors. | | `nI` | Optional[int] | The size of the input vectors. | | _keyword-only_ | | | | `init_W` | Optional[Callable] | A function to initialize the weights matrix. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `init_b` | Optional[Callable] | A function to initialize the bias vector. Defaults to [`zero_init`](/docs/api-initializers#zero_init) when set to `None`. | | `normalize_outputs` | bool | Return normalized probabilities during inference. Defaults to `True`. | | `temperature` | float | Temperature to divide logits by. Defaults to `1.0`. | | **RETURNS** | Model[Floats2d, Floats2d] | The created softmax layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/softmax.py ``` ### SparseLinear {#sparselinear tag="function"} - **Input:** Tuple[ArrayXd, ArrayXd, ArrayXd] - **Output:** ArrayXd - **Parameters:** W, b, `length` int A sparse linear layer using the "hashing trick". Useful for tasks such as text classification. Inputs to the layer should be a tuple of arrays `(keys, values, lengths)`, where the `keys` and `values` are arrays of the same length, describing the concatenated batch of input features and their values. The `lengths` array should have one entry per sequence in the batch, and the sum of the lengths should equal the length of the keys and values array. `SparseLinear` should not be used for new models because it contains an indexing bug. As a result, only a subset of the weights is used. Use [`SparseLinear_v2`](#sparselinear_v2) instead. | Argument | Type | Description | | ----------- | --------------------------------------------------------- | -------------------------------------------------------- | | `nO` | Optional[int] | The size of the output vectors. | | `length` | int | The size of the weights vector, to be tuned empirically. | | **RETURNS** | Model[Tuple[ArrayXd, ArrayXd, ArrayXd], ArrayXd] | The created layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/sparselinear.pyx ``` ### SparseLinear_v2 {#sparselinear_v2 tag="function" new="8.1.6"} - **Input:** Tuple[ArrayXd, ArrayXd, ArrayXd] - **Output:** ArrayXd - **Parameters:** W, b, `length` int A sparse linear layer using the "hashing trick". Useful for tasks such as text classification. Inputs to the layer should be a tuple of arrays `(keys, values, lengths)`, where the `keys` and `values` are arrays of the same length, describing the concatenated batch of input features and their values. The `lengths` array should have one entry per sequence in the batch, and the sum of the lengths should equal the length of the keys and values array. | Argument | Type | Description | | ----------- | --------------------------------------------------------- | -------------------------------------------------------- | | `nO` | Optional[int] | The size of the output vectors. | | `length` | int | The size of the weights vector, to be tuned empirically. | | **RETURNS** | Model[Tuple[ArrayXd, ArrayXd, ArrayXd], ArrayXd] | The created layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/sparselinear.pyx ``` ## Reduction operations {#reduction-ops} ### reduce_first {#reduce_first tag="function"} - **Input:** Ragged - **Output:** ArrayXd Pooling layer that reduces the dimensions of the data by selecting the first item of each sequence. This is most useful after multi-head attention layers, which can learn to assign a good feature representation for the sequence to one of its elements. | Argument | Type | Description | | ----------- | ------------------------------- | -------------------------- | | **RETURNS** | Model[Ragged, ArrayXd] | The created pooling layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/reduce_first.py ``` ### reduce_last {#reduce_last tag="function"} Pooling layer that reduces the dimensions of the data by selecting the last item of each sequence. This is typically used after multi-head attention or recurrent neural network layers such as LSTMs, which can learn to assign a good feature representation for the sequence to its final element. - **Input:** Ragged - **Output:** ArrayXd | Argument | Type | Description | | ----------- | ------------------------------- | -------------------------- | | **RETURNS** | Model[Ragged, ArrayXd] | The created pooling layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/reduce_last.py ``` ### reduce_max {#reduce_max tag="function"} - **Input:** Ragged - **Output:** Floats2d Pooling layer that reduces the dimensions of the data by selecting the maximum value for each feature. A `ValueError` is raised if any element in `lengths` is zero. | Argument | Type | Description | | ----------- | -------------------------------- | -------------------------- | | **RETURNS** | Model[Ragged, Floats2d] | The created pooling layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/reduce_max.py ``` ### reduce_mean {#reduce_mean tag="function"} - **Input:** Ragged - **Output:** Floats2d Pooling layer that reduces the dimensions of the data by computing the average value of each feature. Zero-length sequences are reduced to the zero vector. | Argument | Type | Description | | ----------- | -------------------------------- | -------------------------- | | **RETURNS** | Model[Ragged, Floats2d] | The created pooling layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/reduce_mean.py ``` ### reduce_sum {#reduce_sum tag="function"} - **Input:** Ragged - **Output:** Floats2d Pooling layer that reduces the dimensions of the data by computing the sum for each feature. Zero-length sequences are reduced to the zero vector. | Argument | Type | Description | | ----------- | -------------------------------- | -------------------------- | | **RETURNS** | Model[Ragged, Floats2d] | The created pooling layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/reduce_sum.py ``` --- ## Combinators {#combinators} Combinators are layers that express **higher-order functions**: they take one or more layers as arguments and express some relationship or perform some additional logic around the child layers. Combinators can also be used to [overload operators](/docs/usage-models#operators). For example, binding `chain` to `>>` allows you to write `Relu(512) >> Softmax()` instead of `chain(Relu(512), Softmax())`. ### add {#add tag="function"} Compose two or more models `f`, `g`, etc, such that their outputs are added, i.e. `add(f, g)(x)` computes `f(x) + g(x)`. | Argument | Type | Description | | ----------- | ---------------------------- | ---------------------- | | `*layers` | Model[Any, ArrayXd] | The models to compose. | | **RETURNS** | Model[Any, ArrayXd] | The composed model. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/add.py ``` ### bidirectional {#bidirectional tag="function"} Stitch two RNN models into a bidirectional layer. Expects squared sequences. | Argument | Type | Description | | ----------- | ---------------------------------------- | --------------------------------- | | `l2r` | Model[Padded, Padded] | The first model. | | `r2l` | Optional[Model[Padded, Padded]] | The second model. | | **RETURNS** | Model[Padded, Padded] | The composed bidirectional layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/bidirectional.py ``` ### chain {#chain tag="function"} Compose two or more models such that they become layers of a single feed-forward model, e.g. `chain(f, g)` computes `g(f(x))`. | Argument | Type | Description | | ----------- | -------------- | --------------------------------- | | `layer1` | Model | The first model to compose. | | `layer2` | Model | The second model to compose. | | `*layers` | Model | Any additional models to compose. | | **RETURNS** | Model | The composed feed-forward model. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/chain.py ``` ### clone {#clone tag="function"} Construct `n` copies of a layer, with distinct weights. For example, `clone(f, 3)(x)` computes `f(f'(f''(x)))`. | Argument | Type | Description | | ----------- | -------------- | ------------------------------------------------ | | `orig` | Model | The layer to copy. | | `n` | int | The number of copies to construct. | | **RETURNS** | Model | A composite model containing two or more copies. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/clone.py ``` ### concatenate {#concatenate tag="function"} Compose two or more models `f`, `g`, etc, such that their outputs are concatenated, i.e. `concatenate(f, g)(x)` computes `hstack(f(x), g(x))`. | Argument | Type | Description | | ----------- | ------------------- | ---------------------- | | `*layers` | Model, ... | The models to compose. | | **RETURNS** | Model | The composed model. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/concatenate.py ``` ### map_list {#map_list tag="function"} Map a child layer across list inputs. | Argument | Type | Description | | ----------- | ------------------------------------- | ----------------------- | | `layer` | Model[InT, OutT] | The child layer to map. | | **RETURNS** | Model[List[InT], List[OutT]] | The composed model. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/map_list.py ``` ### expand_window {#expand_window tag="function"} - **Input:** Floats2d, Ragged - **Output:** Floats2d, Ragged - **Attrs:** `window_size` int For each vector in an input, construct an output vector that contains the input and a window of surrounding vectors. This is one step in a convolution. If the `window_size` is three, the output size `nO` will be `nI * 7` after concatenating three contextual vectors from the left, and three from the right, to each input vector. In general, `nO` equals `nI * (2 * window_size + 1)`. | Argument | Type | Description | | ------------- | -------------------- | ------------------------------------------------------------------------------ | | `window_size` | int | The window size (default 1) that determines the number of surrounding vectors. | | **RETURNS** | Model[T, T] | The created layer for adding context to vectors. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/expand_window.py ``` ### noop {#noop tag="function"} Transform a sequences of layers into a null operation. | Argument | Type | Description | | ----------- | -------------- | ---------------------- | | `*layers` | Model | The models to compose. | | **RETURNS** | Model | The composed model. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/noop.py ``` ### residual {#residual tag="function"} - **Input:** List[FloatsXd] / Ragged / Padded / FloatsXd Floats1d Floats2d Floats3d Floats4d - **Output:** List[FloatsXd] / Ragged / Padded / FloatsXd Floats1d Floats2d Floats3d Floats4d A unary combinator creating a residual connection. This converts a layer computing `f(x)` into one that computes `f(x)+x`. Gradients flow through residual connections directly, helping the network to learn more smoothly. | Argument | Type | Description | | ----------- | -------------------- | -------------------------------------------------- | | `layer` | Model[T, T] | A model with the same input and output types. | | **RETURNS** | Model[T, T] | A model with the unchanged input and output types. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/residual.py ``` ### tuplify {#tuplify tag="function"} Give each child layer a separate copy of the input, and the combine the output of the child layers into a tuple. Useful for providing original and modified input to a downstream layer. On the backward pass the loss from each child is added together, so when using custom datatypes they should define an addition operator. | Argument | Type | Description | | ----------- | ----------------------------- | -------------------------------- | | `*layers` | Model[Any, T] ... | The models to compose. | | **RETURNS** | Model[Any, Tuple[T]] | The composed feed-forward model. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/tuplify.py ``` ### siamese {#siamese tag="function"} Combine and encode a layer and a similarity function to form a [siamese architecture](https://en.wikipedia.org/wiki/Siamese_neural_network). Typically used to learn symmetric relationships, such as redundancy detection. | Argument | Type | Description | | ------------ | ------------------------------ | ----------------------------------------- | | `layer` | Model | The layer to run over the pair of inputs. | | `similarity` | Model | The similarity layer. | | **RETURNS** | Model[Tuple, ArrayXd] | The created siamese layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/siamese.py ``` ### uniqued {#uniqued tag="function"} Group inputs to a layer, so that the layer only has to compute for the unique values. The data is transformed back before output, and the same transformation is applied for the gradient. Effectively, this is a cache local to each minibatch. The `uniqued` wrapper is useful for word inputs, because common words are seen often, but we may want to compute complicated features for the words, using e.g. character LSTM. | Argument | Type | Description | | -------------- | -------------------------------- | ---------------------------- | | `layer` | Model | The layer. | | _keyword-only_ | | | | `column` | int | The column. Defaults to `0`. | | **RETURNS** | Model[Ints2d, Floats2d] | The composed model. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/uniqued.py ``` --- ## Data type transfers {#transfers} ### array_getitem, ints_getitem, floats_getitem {#array_getitem tag="function"} - **Input:** ArrayXd - **Output:** ArrayXd Index into input arrays, and return the subarrays. Multi-dimensional indexing can be performed by passing in a tuple, and slicing can be performed using the slice object. For instance, `X[:, :-1]` would be `(slice(None, None), slice(None, -1))`. | Argument | Type | Description | | -------- | --------------------------------------------------------------------------------------------- | -------------------------- | | `index` | Union[Union[int, slice, Sequence[int]], Tuple[Union[int, slice, Sequence[int]], ...] | A valid numpy-style index. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/array_getitem.py ``` ### list2array {#list2array tag="function"} - **Input:** List2d - **Output:** Array2d Transform sequences to ragged arrays if necessary. If sequences are already ragged, do nothing. A ragged array is a tuple `(data, lengths)`, where `data` is the concatenated data. | Argument | Type | Description | | ----------- | ------------------------------- | ---------------------------------------- | | **RETURNS** | Model[List2d, Array2d] | The layer to compute the transformation. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/list2array.py ``` ### list2ragged {#list2ragged tag="function"} - **Input:** ListXd - **Output:** Ragged Transform sequences to ragged arrays if necessary and return the ragged array. If sequences are already ragged, do nothing. A ragged array is a tuple `(data, lengths)`, where `data` is the concatenated data. | Argument | Type | Description | | ----------- | ------------------------------ | ---------------------------------------- | | **RETURNS** | Model[ListXd, Ragged] | The layer to compute the transformation. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/list2ragged.py ``` ### list2padded {#list2padded tag="function"} - **Input:** List2d - **Output:** Padded Create a layer to convert a list of array inputs into [`Padded`](/docs/api-types#padded). | Argument | Type | Description | | ----------- | ------------------------------ | ---------------------------------------- | | **RETURNS** | Model[List2d, Padded] | The layer to compute the transformation. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/list2padded.py ``` ### ragged2list {#ragged2list tag="function"} - **Input:** Ragged - **Output:** ListXd Transform sequences from a ragged format into lists. | Argument | Type | Description | | ----------- | ------------------------------ | ---------------------------------------- | | **RETURNS** | Model[Ragged, ListXd] | The layer to compute the transformation. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/ragged2list.py ``` ### padded2list {#padded2list tag="function"} - **Input:** Padded - **Output:** List2d Create a layer to convert a [`Padded`](/docs/api-types#padded) input into a list of arrays. | Argument | Type | Description | | ----------- | ------------------------------ | ---------------------------------------- | | **RETURNS** | Model[Padded, List2d] | The layer to compute the transformation. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/padded2list.py ``` ### remap_ids {#remap_ids tag="function"} - **Input:** Union[Sequence[Hashable], Ints1d, Ints2d] - **Output:** Ints2d Remap a sequence of strings, integers or other hashable inputs using a mapping table, usually as a preprocessing step before embeddings. The input can also be a two dimensional integer array in which case the `column` attribute tells the `remap_ids` layer which column of the array to map with the `mapping_table`. Both attributes can be passed on initialization, but since the layer is designed to retrieve them from `model.attrs` during `forward`, they can be set any time before calling `forward`. This means that they can also be changed between calls. Before calling `forward` the `mapping_table` has to be set and for 2D inputs the `column` is also required. | Argument | Type | Description | | --------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | | `mapping_table` | Dict[Any, int] | The mapping table to use. Can also be set after initialization by writing to `model.attrs["mapping_table"]`. | | `default` | int | The default value if the input does not have an entry in the mapping table. | | `column` | int | The column to apply the mapper to in case of 2D input. | | **RETURNS** | Model[Union[Sequence[Hashable], Ints1d, Ints2d], Ints2d] | The layer to compute the transformation. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/remap_ids.py ``` ### strings2arrays {#strings2arrays tag="function"} - **Input:** Sequence[Sequence[str]] - **Output:** List[Ints2d] Transform a sequence of string sequences to a list of arrays. | Argument | Type | Description | | ----------- | ----------------------------------------------------- | ---------------------------------------- | | **RETURNS** | Model[Sequence[Sequence[str]], List[Ints2d]] | The layer to compute the transformation. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/strings2arrays.py ``` ### with_array {#with_array tag="function"} - **Input / output:** Union[Padded, Ragged, ListXd, ArrayXd] Transform sequence data into a contiguous array on the way into and out of a model. Handles a variety of sequence types: lists, padded and ragged. If the input is an array, it is passed through unchanged. | Argument | Type | Description | | -------------- | -------------------------------- | ----------------------------- | | `layer` | Model[ArrayXd, ArrayXd] | The layer to wrap. | | _keyword-only_ | | | | `pad` | int | The padding. Defaults to `0`. | | **RETURNS** | Model | The wrapped layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/with_array2d.py ``` ### with_array2d {#with_array2d tag="function"} - **Input / output:** Union[Padded, Ragged, List2d, Array2d] Transform sequence data into a contiguous two-dimensional array on the way into and out of a model. In comparison to the `with_array` layer, the behavior of this layer mostly differs on `Padded` inputs, as this layer merges the batch and length axes to form a two-dimensional array. Handles a variety of sequence types: lists, padded and ragged. If the input is a two-dimensional array, it is passed through unchanged. | Argument | Type | Description | | -------------- | -------------------------------- | ----------------------------- | | `layer` | Model[Array2d, Array2d] | The layer to wrap. | | _keyword-only_ | | | | `pad` | int | The padding. Defaults to `0`. | | **RETURNS** | Model | The wrapped layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/with_array.py ``` ### with_flatten {#with_flatten tag="function"} - **Input:** Sequence[Sequence[Any]] - **Output:** ListXd Flatten nested inputs on the way into a layer and reverse the transformation over the outputs. Even though `with_flatten` is a layer wrapper, it does not preserve symmetry between the input and output data types. This often makes it hard to compose with other layers. Use [`with_flatten_v2`](#with_flatten_v2) instead. | Argument | Type | Description | | ----------- | ----------------------------------------------- | ------------------ | | `layer` | Model[Sequence[Any], ArrayXd] | The layer to wrap. | | **RETURNS** | Model[Sequence[Sequence[Any]], ListXd] | The wrapped layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/with_flatten.py ``` ### with_flatten_v2 {#with_flatten_v2 tag="function" new="8.1.6"} - **Input:** List[List[InItemT]] - **Output:** List[List[OutItemT]] Flatten nested inputs on the way into a layer and reverse the transformation over the outputs. | Argument | Type | Description | | ----------- | --------------------------------------------------------- | ------------------ | | `layer` | Model[List[InItemT], List[OutItemT]] | The layer to wrap. | | **RETURNS** | Model[List[List[InItemT]], List[List[OutItemT]]] | The wrapped layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/with_flatten_v2.py ``` ### with_padded {#with_padded tag="function"} - **Input / output:** Union[Padded, Ragged, List2d, Floats3d, Tuple[Floats3d, Ints1d, Ints1d, Ints1d]] Convert sequence input into the [`Padded`](/docs/api-types#padded) data type on the way into a layer and reverse the transformation on the output. | Argument | Type | Description | | ----------- | ------------------------------ | ------------------ | | `layer` | Model[Padded, Padded] | The layer to wrap. | | **RETURNS** | Model | The wrapped layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/with_padded.py ``` ### with_ragged {#with_ragged tag="function"} - **Input / output:** Union[Padded, Ragged, ListXd, Floats3d, Tuple[Floats2d, Ints1d]] Convert sequence input into the [`Ragged`](/docs/api-types#ragged) data type on the way into a layer and reverse the transformation on the output. | Argument | Type | Description | | ----------- | ------------------------------ | ------------------ | | `layer` | Model[Ragged, Ragged] | The layer to wrap. | | **RETURNS** | Model | The wrapped layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/with_ragged.py ``` ### with_list {#with_list tag="function"} - **Input / output:** Union[Padded, Ragged, List2d] Convert sequence input into lists on the way into a layer and reverse the transformation on the outputs. | Argument | Type | Description | | ----------- | ------------------------------ | ------------------ | | `layer` | Model[List2d, List2d] | The layer to wrap. | | **RETURNS** | Model | The wrapped layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/with_list.py ``` ### with_getitem {#with_getitem tag="function"} - **Input:** Tuple - **Output:** Tuple Transform data on the way into and out of a layer by plucking an item from a tuple. | Argument | Type | Description | | ----------- | -------------------------------- | ---------------------------------- | | `idx` | int | The index to pluck from the tuple. | | `layer` | Model[ArrayXd, ArrayXd] | The layer to wrap. | | **RETURNS** | Model[Tuple, Tuple] | The wrapped layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/with_getitem.py ``` ### with_reshape {#with_reshape tag="function"} - **Input:** Array3d - **Output:** Array3d Reshape data on the way into and out from a layer. | Argument | Type | Description | | ----------- | -------------------------------- | ------------------ | | `layer` | Model[Array2d, Array2d] | The layer to wrap. | | **RETURNS** | Model[Array3d, Array3d] | The wrapped layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/with_reshape.py ``` ### with_debug {#with_debug tag="function"} - **Input:** Any - **Output:** Any Debugging layer that wraps any layer and allows executing callbacks during the forward pass, backward pass and initialization. The callbacks will receive the same arguments as the functions they're called in and are executed before the function runs. This layer should only be used for **debugging, logging, benchmarking etc.**, not to modify data or perform any other side-effects that are relevant to the network outside of debugging and testing it. If you need hooks that run in specific places of the model lifecycle, you should write your own [custom layer](/docs/usage-models#new-layers). You can use the implementation of `with_debug` as a template. ```python ### Example from thinc.api import Linear, with_debug def on_init(model, X, Y): print(f"X: {type(Y)}, Y ({type(Y)})") model = with_debug(Linear(2, 5), on_init=on_init) model.initialize() ``` | Argument | Type | Description | | -------------- | ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | `layer` | Model | The layer to wrap. | | `name` | Optional[str] | Optional name for the wrapped layer, will be prefixed by `debug:`. Defaults to name of the wrapped layer. | | _keyword-only_ | | | | `on_init` | Callable[[Model, Any, Any], None] | Function called on initialization. Receives the model and the `X` and `Y` passed to [`Model.initialize`](/docs/api-model#initialize), if available. | | `on_forward` | Callable[[Model, Any, bool], None] | Function called at the start of the forward pass. Receives the model, the inputs and the value of `is_train`. | | `on_backprop` | Callable[[Any], None] = do_nothing | Function called at the start of the backward pass. Receives the gradient. | | **RETURNS** | Model | The wrapped layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/with_debug.py ``` ### with_nvtx_range {#with_nvtx_range tag="function"} - **Input:** Any - **Output:** Any Layer that wraps any layer and marks the forward and backprop passes as an NVTX range. This can be helpful when profiling GPU performance of a layer. ```python ### Example from thinc.api import Linear, with_nvtx_range model = with_nvtx_range(Linear(2, 5)) model.initialize() ``` | Argument | Type | Description | | ---------------- | ---------------------- | ------------------------------------------------------------------------------- | | `layer` | Model | The layer to wrap. | | `name` | Optional[str] | Optional name for the wrapped layer. Defaults to the name of the wrapped layer. | | _keyword-only_ | | | | `forward_color` | int | Identifier of the color to use for the forward pass | | `backprop_color` | int | Identifier of the color to use for the backward pass | | **RETURNS** | Model | The wrapped layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/with_nvtx_range.py ``` ### with_signpost_interval {#with_signpost_interval tag="function" new="8.1.1"} - **Input:** Any - **Output:** Any Layer that wraps any layer and marks the init, forward and backprop passes as a (macOS) signpost interval. This can be helpful when profiling the performance of a layer using macOS [Instruments.app](https://help.apple.com/instruments/mac/current/). Use of this layer requires that the [`os-signpost`](https://github.com/explosion/os-signpost) package is installed. ```python ### Example from os_signpost import Signposter from thinc.api import Linear, with_signpost_interval signposter = Signposter("com.example.my_subsystem", Signposter.Category.DynamicTracing) model = with_signpost_interval(Linear(2, 5), signposter) model.initialize() ``` | Argument | Type | Description | | ------------ | --------------------------------- | ------------------------------------------------------------------------------- | | `layer` | Model | The layer to wrap. | | `signposter` | os_signposter.Signposter | `Signposter` object to log the interval with. | | `name` | Optional[str] | Optional name for the wrapped layer. Defaults to the name of the wrapped layer. | | **RETURNS** | Model | The wrapped layer. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/with_signpost_interval.py ``` --- ## Wrappers {#wrappers} ### PyTorchWrapper, PyTorchRNNWrapper {#pytorchwrapper tag="function"} - **Input:** Any - **Output:** Any Wrap a [PyTorch](https://pytorch.org) model so that it has the same API as Thinc models. To optimize the model, you'll need to create a PyTorch optimizer and call `optimizer.step` after each batch. The `PyTorchRNNWrapper` has the same signature as the `PyTorchWrapper` and lets you to pass in a custom sequence model that has the same inputs and output behavior as a [`torch.nn.RNN`](https://pytorch.org/docs/stable/nn.html#torch.nn.RNN) object. Your PyTorch model's forward method can take arbitrary positional arguments and keyword arguments, but must return either a **single tensor** as output or a **tuple**. You may find [PyTorch's `register_forward_hook`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module.register_forward_hook) helpful if you need to adapt the output. The convert functions are used to map inputs and outputs to and from your PyTorch model. Each function should return the converted output, and a callback to use during the backward pass: ```python Xtorch, get_dX = convert_inputs(X) Ytorch, torch_backprop = model.shims[0](Xtorch, is_train) Y, get_dYtorch = convert_outputs(Ytorch) ``` To allow maximum flexibility, the [`PyTorchShim`](/docs/api-model#shims) expects [`ArgsKwargs`](/docs/api-types#argskwargs) objects on the way into the forward and backward passes. The `ArgsKwargs` objects will be passed straight into the model in the forward pass, and straight into `torch.autograd.backward` during the backward pass. | Argument | Type | Description | | ----------------- | ------------------------ | ---------------------------------------------------------------------------------------- | | `pytorch_model` | Any | The PyTorch model. | | `convert_inputs` | Callable | Function to convert inputs to PyTorch tensors (same signature as `forward` function). | | `convert_outputs` | Callable | Function to convert outputs from PyTorch tensors (same signature as `forward` function). | | **RETURNS** | Model[Any, Any] | The Thinc model. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/pytorchwrapper.py ``` ### TorchScriptWrapper_v1 {#torchscriptwrapper tag="function" new="8.1.6"} - **Input:** Any - **Output:** Any Wrap a [TorchScript](https://pytorch.org/docs/stable/jit.html) model so that it has the same API as Thinc models. To optimize the model, you'll need to create a PyTorch optimizer and call `optimizer.step` after each batch. Your TorchScript model's forward method can take arbitrary positional arguments and keyword arguments, but must return either a **single tensor** as output or a **tuple**. The convert functions are used to map inputs and outputs to and from your TorchScript model. Each function should return the converted output, and a callback to use during the backward pass: ```python Xtorch, get_dX = convert_inputs(X) Ytorch, torch_backprop = model.shims[0](Xtorch, is_train) Y, get_dYtorch = convert_outputs(Ytorch) ``` To allow maximum flexibility, the [`TorchScriptShim`](/docs/api-model#shims) expects [`ArgsKwargs`](/docs/api-types#argskwargs) objects on the way into the forward and backward passes. The `ArgsKwargs` objects will be passed straight into the model in the forward pass, and straight into `torch.autograd.backward` during the backward pass. Note that the `torchscript_model` argument can be `None`. This is useful for deserialization since serialized TorchScript contains both the model and its weights. A PyTorch wrapper can be converted to a TorchScript wrapper using the `pytorch_to_torchscript_wrapper` function: ```python from thinc.api import PyTorchWrapper_v2, pytorch_to_torchscript_wrapper import torch model = PyTorchWrapper_v2(torch.nn.Linear(nI, nO)).initialize() script_model = pytorch_to_torchscript_wrapper(model) ``` | Argument | Type | Description | | ------------------- | ----------------------------------------- | ---------------------------------------------------------------------------------------- | | `torchscript_model` | Optional[torch.jit.ScriptModule] | The TorchScript model. | | `convert_inputs` | Callable | Function to convert inputs to PyTorch tensors (same signature as `forward` function). | | `convert_outputs` | Callable | Function to convert outputs from PyTorch tensors (same signature as `forward` function). | | `mixed_precision` | bool | Enable mixed-precision training. | | `grad_scaler` | Optional[PyTorchGradScaler] | Gradient scaler to use during mixed-precision training. | | `device` | Optional[torch.Device] | The Torch device to execute the model on. | | **RETURNS** | Model[Any, Any] | The Thinc model. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/torchscriptwrapper.py ``` ### TensorFlowWrapper {#tensorflowwrapper tag="function"} - **Input:** Any - **Output:** Any In Thinc v8.2+, TensorFlow support is not enabled by default. To enable TensorFlow: ```python from thinc.api import enable_tensorflow enable_tensorflow() ``` Wrap a [TensorFlow](https://tensorflow.org) model, so that it has the same API as Thinc models. To optimize the model, you'll need to create a TensorFlow optimizer and call `optimizer.apply_gradients` after each batch. To allow maximum flexibility, the [`TensorFlowShim`](/docs/api-model#shims) expects [`ArgsKwargs`](/docs/api-types#argskwargs) objects on the way into the forward and backward passes. | Argument | Type | Description | | ------------------ | ------------------------ | --------------------- | | `tensorflow_model` | Any | The TensorFlow model. | | **RETURNS** | Model[Any, Any] | The Thinc model. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/tensorflowwrapper.py ``` ### MXNetWrapper {#mxnetwrapper tag="function"} - **Input:** Any - **Output:** Any In Thinc v8.2+, MXNet support is not enabled by default. To enable MXNet: ```python from thinc.api import enable_mxnet enable_mxnet() ``` Wrap a [MXNet](https://mxnet.apache.org/) model, so that it has the same API as Thinc models. To optimize the model, you'll need to create a MXNet optimizer and call `optimizer.step()` after each batch. To allow maximum flexibility, the [`MXNetShim`](/docs/api-model#shims) expects [`ArgsKwargs`](/docs/api-types#argskwargs) objects on the way into the forward and backward passes. | Argument | Type | Description | | ------------------ | ------------------------ | --------------------- | | `tensorflow_model` | Any | The TensorFlow model. | | **RETURNS** | Model[Any, Any] | The Thinc model. | ```python https://github.com/explosion/thinc/blob/master/thinc/layers/mxnetwrapper.py ``` thinc-release-v9.1.1/website/docs/api-loss.md000066400000000000000000000207231467064331700211150ustar00rootroot00000000000000--- title: Loss Calculators next: /docs/api-config --- All loss calculators follow the same API: they're classes that are initialized with optional settings and have a `get_grad` method returning the gradient of the loss with respect to the model outputs and a `get_loss` method returning the scalar loss. ## Loss {#loss tag="base class"} ### Loss.\_\_init\_\_ {#loss-init tag="method"} Initialize the loss calculator. | Argument | Type | Description | | ---------- | ------------ | ---------------------------------------------------------------------------------------- | | `**kwargs` | Any | Optional calculator-specific settings. Can also be provided via the [config](#registry). | ### Loss.\_\_call\_\_ {#loss-call tag="method"} Calculate the gradient and the scalar loss. Returns a tuple of the results of `Loss.get_grad` and `Loss.get_loss`. | Argument | Type | Description | | ----------- | ------------------------ | ----------------------------- | | `guesses` | Any | The model outputs. | | `truths` | Any | The training labels. | | **RETURNS** | Tuple[Any, Any] | The gradient and scalar loss. | ### Loss.get_grad {#loss-get_grad tag="method"} Calculate the gradient of the loss with respect with the model outputs. | Argument | Type | Description | | ----------- | ------------ | -------------------- | | `guesses` | Any | The model outputs. | | `truths` | Any | The training labels. | | **RETURNS** | Any | The gradient. | ### Loss.get_loss {#loss-get_grad tag="method"} Calculate the scalar loss. Typically returns a float. | Argument | Type | Description | | ----------- | ------------ | -------------------- | | `guesses` | Any | The model outputs. | | `truths` | Any | The training labels. | | **RETURNS** | Any | The scalar loss. | --- ## Loss Calculators {#calculators} ### CategoricalCrossentropy {#categorical_crossentropy tag="class"} - **Guesses:** Floats2d - **Truths:** Union[Ints1d, List[int], List[str], Floats2d] - **Gradient:** Floats2d - **Loss:** float A flexible implementation of the common categorical cross-entropy loss that works on various data types. The `guesses` should represent probabilities and are expected to be in the range of `[0, 1]`. They can both represent exclusive classes from multi-class cross-entropy (generally coming from a `softmax` layer) or could be classwise binary decisions for multi-label cross-entropy (`sigmoid` layer). The `truths` are most commonly provided as labels in `Ints1d`, `List[int]` or `List[str]` format. Alternatively, users can provide `truths` as a `Floats2d` for example to encode label-confidences. ```python ### {small="true"} from thinc.api import CategoricalCrossentropy loss_calc = CategoricalCrossentropy() ``` ```ini ### config.cfg {small="true"} [loss] @losses = "CategoricalCrossentropy.v1" normalize = true ``` | Argument | Type |  Description | | ----------------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | | _keyword-only_ | | | | `names` | List[str] | Label names. Has to be provided when using with List[str] as truths. | | `normalize` | bool | Normalize and divide by number of examples given. | | `neg_prefix` | str | Prefix used to indicate that a label is negative e.g. "!sci-fi". | | `missing_value` | Union[str, int] | Specific label that indicates the value is missing and should not be considered for training/evaluation purposes, e.g. empty string `""` or `0`. | | `label_smoothing` | float | Smoothing-coefficient for label-smoothing. | ### SequenceCategoricalCrossentropy {#sequence_categorical_crossentropy tag="class"} - **Guesses:** List[Floats2d] - **Truths:** List[Union[Ints1d, List[int], List[str], Floats2d]] - **Gradient:** List[Floats2d] - **Loss:** List[float] This loss runs the `CategoricalCrossentropy` over a `List` of `guesses` and `truths`. ```python ### {small="true"} from thinc.api import SequenceCategoricalCrossentropy loss_calc = SequenceCategoricalCrossentropy() ``` ```ini ### config.cfg {small="true"} [loss] @losses = "SequenceCategoricalCrossentropy.v1" normalize = true ``` | Argument | Type |  Description | | ----------------- | ------------------------ | ------------------------------------------------------------------- | | _keyword-only_ | | | | `names` | List[str] | Label names. Has to be provided when using with List[str] as truths | | `normalize` | bool | Normalize and divide by number of examples given. | | `neg_prefix` | str | Symbol that indicates that a label is negative e.g. "!sci-fi". | | `missing_value` | Union[str, int] | Symbol for "missing value" among the labels. | | `label_smoothing` | float | Smoothing-coefficient for label-smoothing. | ### L2Distance {#l2distance tag="class"} - **Guesses:** Floats2d - **Truths:** Floats2d - **Gradient:** Floats2d - **Loss:** float ```python ### {small="true"} from thinc.api import L2Distance loss_calc = L2Distance() ``` ```ini ### config.cfg {small="true"} [loss] @losses = "L2Distance.v1" normalize = true ``` | Argument | Type |  Description | | -------------- | ------------- | ------------------------------------------------- | | _keyword-only_ | | | | `normalize` | bool | Normalize and divide by number of examples given. | ### CosineDistance {#cosine_distance tag="function"} - **Guesses:** Floats2d - **Truths:** Floats2d - **Gradient:** Floats2d - **Loss:** float ```python ### {small="true"} from thinc.api import CosineDistance loss_calc = CosineDistance(ignore_zeros=False) ``` ```ini ### config.cfg {small="true"} [loss] @losses = "CosineDistance.v1" normalize = true ignore_zeros = false ``` | Argument | Type |  Description | | -------------- | ------------- | ------------------------------------------------- | | _keyword-only_ | | | | `normalize` | bool | Normalize and divide by number of examples given. | | `ignore_zeros` | bool | Don't count zero vectors. | --- ## Usage via config and function registry {#registry} Defining the loss calculators in the [config](/docs/usage-config) will return the **initialized object**. Within your script, you can then call it or its methods and pass in the data. ```ini ### config.cfg {small="true"} [loss] @losses = "L2Distance.v1" normalize = true ``` ```python ### Usage {small="true"} from thinc.api import registry, Config config = Config().from_disk("./config.cfg") resolved = registry.resolve(config) loss_calc = resolved["loss"] loss = loss_calc.get_grad(guesses, truths) ``` thinc-release-v9.1.1/website/docs/api-model.md000066400000000000000000001220561467064331700212370ustar00rootroot00000000000000--- title: Model next: /docs/api-layers --- Thinc uses just one model class for almost all layer types. Instead of creating subclasses, you'll usually instantiate the `Model` class directly, passing in a `forward` function that actually performs the computation. You can find examples of this in the library itself, in [`thinc.layers`](https://github.com/explosion/thinc/blob/master/thinc/layers) (also see the [layers documentation](/docs/api-layers)). | | | | ---------------------- | ------------------------------------------------------------------------------------------------ | | [**Model**](#model) | Class for implementing Thinc models and layers. | | [**Utilities**](#util) | Helper functions for implementing models. | | [**Shim**](#shim) | Interface for external models. Users can create subclasses of `Shim` to wrap external libraries. | ## Model {#model tag="class"} Class for implementing Thinc models and layers. There's only one `Model` class in Thinc and layers are built using **composition**, not inheritance. This means that a [layer](/docs/api-layers) or composed model will return an **instance** of `Model` – it doesn't subclass it. To read more about this concept, see the pages on [Thinc's philosophy](/docs/concept) and [defining models](/docs/usage-models). ### Typing {#typing} `Model` can be used as a [generic type](https://docs.python.org/3/library/typing.html#generics) with two parameters: the expected input and expected output. For instance, `Model[List[Floats2d], Floats2d]` denotes a model that takes a list of two-dimensional arrays of floats as inputs and outputs a two-dimensional array of floats. A mismatch will cause a type error. For more details, see the docs on [type checking](/docs/usage-type-checking). ```python from typing import List from thinc.api import Model from thinc.types import Floats2d def my_function(model: Model[List[Floats2d], Floats2d]): ... ``` ### Attributes {#attributes} | Name | Type | Description | | ------ | ------------ | --------------------------------- | | `name` | str | The name of the layer type. | | `ops` | Ops | Perform array operations. | | `id` | int | ID number for the model instance. | ### Properties {#properties} | Name | Type | Description | | ------------- | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `layers` | List[Model] | A list of child layers of the model. You can use the list directly, including modifying it in-place: the standard way to add a layer to a model is simply `model.layers.append(layer)`. However, you cannot reassign the `model.layers` attribute to a new variable: `model.layers = []` will fail. | | `shims` | List[Shim] | A list of child shims added to the model. | | `attrs` | Dict[str, Any] | The model attributes. You can use the dict directly and assign _to_ it – but you cannot reassign `model.attrs` to a new variable: `model.attrs = {}` will fail. | | `param_names` | Tuple[str, ...] | Get the names of registered parameter (including unset). | | `grad_names` | Tuple[str, ...] | Get the names of parameters with registered gradients (including unset). | | `dim_names` | Tuple[str, ...] | Get the names of registered dimensions (including unset). | | `ref_names` | Tuple[str, ...] | Get the names of registered node references (including unset). | ### Model.\_\_init\_\_ {#init tag="method"} Initialize a new model. ```python ### Example model = Model( "linear", linear_forward, init=linear_init, dims={"nO": nO, "nI": nI}, params={"W": None, "b": None}, ) ``` | Argument | Type | Description | | -------------- | ------------------------------------------------------------- | --------------------------------------------------------------------------------------- | | `name` | str | The name of the layer type. | | `forward` | Callable | Function to compute the forward result and the backpropagation callback. | | _keyword-only_ | | | | `init` | Callable | Function to define the initialization logic. | | `dims` | Dict[str, Optional[int]] | Dictionary describing the model's dimensions. Map unknown dimensions to `None`. | | `params` | Dict[str, Optional[FloatsXd]] | Dictionary with the model's parameters. Set currently unavailable parameters to `None`. | | `refs` | Dict[str, Optional[Model]] | Dictionary mapping specific nodes (sublayers) of the network to a name. | | `attrs` | Dict[str, Any] | Dictionary of non-parameter attributes. | | `layers` | List[Model] | List of child layers. | | `shims` | List[Shim] | List of interfaces for external models. | | `ops` | Optional[Union[NumpyOps, AppleOps, CupyOps, MPSOps]] | An `Ops` instance, which provides mathematical and memory operations. | ### Model.define_operators {#define_operators tag="classmethod,contextmanager"} Bind arbitrary binary functions to Python operators, for use in any `Model` instance. The method can (and should) be used as a contextmanager, so that the overloading is limited to the immediate block. This allows concise and expressive model definition. The following operators are supported: `+`, `-`, `*`, `@`, `/`, `//`, `%`, `**`, `<<`, `>>`, `&`, `^` and `|`. ```python ### Example from thinc.api import Model, Relu, Softmax, chain with Model.define_operators({">>": chain}): model = Relu(512) >> Relu(512) >> Softmax() ``` | Argument | Type | Description | | ----------- | ---------------------------- | ------------------------------ | | `operators` | Dict[str, Callable] | Functions mapped to operators. | ### Model.initialize {#initialize tag="method"} Finish initialization of the model, optionally providing a batch of example input and output data to perform shape inference. Until `Model.initialize` is called, the model may not be in a ready state to operate on data: parameters or dimensions may be unset. The `Model.initialize` method will usually delegate to the `init` function given to [`Model.__init__`](#init). If sample data is provided, it will be validated against the type annotations of the `forward` function, if available. A [`DataValidationError`](/docs/api-util#errors) is raised in case of a mismatch, e.g. if the forward pass expects a two-dimensional array but the model is initialized with a three-dimensional array. ```python ### Example from thinc.api import Linear, zero_init import numpy X = numpy.zeros((128, 16), dtype="f") Y = numpy.zeros((128, 10), dtype="f") model = Linear(init_W=zero_init) model.initialize(X=X, Y=Y) ``` | Argument | Type | Description | | ----------- | ---------------------- | -------------------------------- | | `X` | Optional[Any] | An example batch of input data. | | `Y` | Optional[Any] | An example batch of output data. | | **RETURNS** | Model | The model instance. | ### Model.\_\_call\_\_ {#call tag="method"} Call the model's `forward` function, returning the output and a callback to compute the gradients via backpropagation. ```python ### Example from thinc.api import Linear import numpy X = numpy.zeros((128, 10), dtype="f") model = Linear(10) model.initialize(X=X) Y, backprop = model(X, is_train=True) ``` | Argument | Type | Description | | ----------- | ----------------------------- | --------------------------------------------------------------------------------------------------- | | `X` | Any | A batch of input data. | | `is_train` | bool | A boolean indicating whether the model is running in a training (as opposed to prediction) context. | | **RETURNS** | Tuple[Any, Callable] | A batch of output data and the `backprop` callback. | ### Model.begin_update {#begin_update tag="method"} Call the model's `forward` function with `is_train=True`, and return the output and the backpropagation callback, which is a function that takes a gradient of outputs and returns the corresponding gradient of inputs. The backpropagation callback may also increment the gradients of the model parameters, via calls to [`Model.inc_grad`](#inc_grad). ```python ### Example from thinc.api import Linear import numpy X = numpy.zeros((128, 10), dtype="f") model = Linear(10) model.initialize(X=X) Y, backprop = model.begin_update(X) ``` | Argument | Type | Description | | ----------- | ----------------------------- | --------------------------------------------------- | | `X` | Any | A batch of input data. | | **RETURNS** | Tuple[Any, Callable] | A batch of output data and the `backprop` callback. | ### Model.predict {#predict tag="method"} Call the model's `forward` function with `is_train=False`, and return only the output, instead of the `(output, callback)` tuple. ```python ### Example from thinc.api import Linear import numpy X = numpy.zeros((128, 10), dtype="f") model = Linear(10) model.initialize(X=X) Y = model.predict(X) ``` | Argument | Type | Description | | ----------- | ------------ | ----------------------- | | `X` | Any | A batch of input data. | | **RETURNS** | Any | A batch of output data. | ### Model.finish_update {#finish_update tag="method"} Update parameters using the current parameter gradients. The [`Optimizer` instance](/docs/api-optimizers) contains the functionality to perform the stochastic gradient descent. ```python ### Example from thinc.api import Adam, Linear optimizer = Adam() model = Linear(10) model.finish_update(optimizer) ``` | Argument | Type | Description | | ----------- | ------------------ | ----------------------------------------------------------------------------- | | `optimizer` | Optimizer | The optimizer, which is called with each parameter and gradient of the model. | ### Model.use_params {#use_params tag="contextmanager"} Contextmanager to temporarily set the model's parameters to specified values. | Argument | Type | Description | | -------- | ---------------------------- | -------------------------------------------------------------------------- | | `params` | Dict[int, FloatsXd] | A dictionary keyed by model IDs, whose values are arrays of weight values. | ### Model.walk {#walk tag="method"} Iterate out layers of the model, in breadth-first order. ```python ### Example from thinc.api import Relu model = Relu(512, normalize=True) for node in model.walk(): print(node.name) ``` ![](images/layer-traversal.svg) The `walk` method supports three iteration orders through the `order` argument: - `"bfs"`: breadth-first. Iteration order of the example above: _1 - 2 - 4 - 3 - 5_ - `"dfs_pre"`: depth-first preorder, outputs a node before its children. Iteration order of the example above: _1 - 2 - 3 - 4 - 5_ - `"dfs_post"`: depth-first postorder, outputs children before a node itself. Iteration order of the example above: _3 - 2 - 5 - 4 - 1_ | Argument | Type | Description | | ----------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- | | `order` | str | Node iteration order. `"bfs"` (breadth-first), `"dfs_pre"` (depth-first preorder), `"dfs_post"` (depth-first postorder) Default: `"bfs"`. | | **RETURNS** | Iterable[Model] | The layers of the model. | ### Model.remove_node {#remove_node tag="method"} Remove a node from all layers lists, and then update references. References that no longer point to a node within the tree will be set to `None`. For instance, if a node has its grandchild as a reference and the child is removed, the grandchild reference will be left dangling, so will be set to `None`. | Argument | Type | Description | | -------- | -------------- | ------------------- | | `node` | Model | The node to remove. | ### Model.has_dim {#has_dim tag="method"} Check whether the model has a dimension of a given name. If the dimension is registered but the value is unset, returns `None`. ```python ### Example from thinc.api import Linear import numpy model = Linear(10) assert model.has_dim("nI") is None model.initialize(X=numpy.zeros((128, 16), dtype="f")) assert model.has_dim("nI") is True ``` | Argument | Type | Description | | ----------- | ----------------------- | --------------------------------------------- | | `name` | str | The name of the dimension, e.g. `"nO"`. | | **RETURNS** | Optional[bool] | A ternary value (`True`, `False`, or `None`). | ### Model.get_dim {#get_dim tag="method"} Retrieve the value of a dimension of the given name. Raises a `KeyError` if the dimension is either unregistered or the value is currently unset. ```python ### Example from thinc.api import Linear import numpy model = Linear(10) model.initialize(X=numpy.zeros((128, 16), dtype="f")) assert model.get_dim("nI") == 16 ``` | Argument | Type | Description | | ----------- | ------------ | --------------------------------------- | | `name` | str | The name of the dimension, e.g. `"nO"`. | | **RETURNS** | int | The size of the dimension. | ### Model.maybe_get_dim {#get_dim tag="method"} Retrieve the value of a dimension of the given name, or `None` if the dimension is either unregistered or the value is currently unset. | Argument | Type | Description | | ----------- | ---------------------- | --------------------------------------- | | `name` | str | The name of the dimension, e.g. `"nO"`. | | **RETURNS** | Optional[int] | The size of the dimension, or `None`. | ### Model.set_dim {#set_dim tag="method"} Set a value for a dimension. This raises a `ValueError` if the dimension was previously defined with a different value, unless `force` is set to `True`. ```python ### Example from thinc.api import Linear model = Linear(10) model.set_dim("nI", 16) assert model.get_dim("nI") == 16 ``` | Argument | Type | Description | | -------- | ------------- | ----------------------------------------------------------------------------------------------------- | | `name` | str | The name of the dimension to set. | | `value` | int | The new value for the dimension. | | `force` | bool | When set to `True`, allow changing the value of the dimension if it was set before. Default: `False`. | ### Model.has_param {#has_param tag="method"} Check whether the model has a weights parameter of the given name. Returns `None` if the parameter is registered but currently unset. ```python ### Example from thinc.api import Linear, zero_init import numpy model = Linear(10, init_W=zero_init) assert model.has_param("W") is None model.initialize(X=numpy.zeros((128, 16), dtype="f")) assert model.has_param("W") is True ``` | Argument | Type | Description | | ----------- | ----------------------- | --------------------------------------------- | | `name` | str | The name of the parameter. | | **RETURNS** | Optional[bool] | A ternary value (`True`, `False`, or `None`). | ### Model.get_param {#get_param tag="method"} Retrieve a weights parameter by name. Raises a `KeyError` if the parameter is unregistered or its value is undefined. ```python ### Example from thinc.api import Linear, zero_init import numpy model = Linear(10, init_W=zero_init) assert model.has_param("W") is None model.initialize(X=numpy.zeros((128, 16), dtype="f")) W = model.get_param("W") assert W.shape == (10, 16) ``` | Argument | Type | Description | | ----------- | ----------------- | --------------------------------- | | `name` | str | The name of the parameter to get. | | **RETURNS** | FloatsXd | The current parameter. | ### Model.maybe_get_param {#maybe_get_param tag="method"} Retrieve a weights parameter by name. Returns `None` if the parameter is unregistered or its value is undefined. | Argument | Type | Description | | ----------- | --------------------------- | --------------------------------- | | `name` | str | The name of the parameter to get. | | **RETURNS** | Optional[FloatsXd] | The current parameter, or `None`. | ### Model.set_param {#set_param tag="method"} Set a weights parameter's value. ```python ### Example from thinc.api import Linear, zero_init import numpy model = Linear(10, init_W=zero_init) assert model.has_param("W") is None model.set_param("W", numpy.zeros((10, 16), dtype="f")) assert model.has_param("W") is True ``` | Argument | Type | Description | | -------- | --------------------------- | --------------------------------------------- | | `name` | str | The name of the parameter to set a value for. | | `value` | Optional[FloatsXd] | The new value of the parameter. | ### Model.has_ref {#has_ref tag="method"} Check whether the model has a reference of a given name. If the reference is registered but the value is unset, returns `None`. | Argument | Type | Description | | ----------- | ----------------------- | --------------------------------------------- | | `name` | str | The name of the reference. | | **RETURNS** | Optional[bool] | A ternary value (`True`, `False`, or `None`). | ### Model.get_ref {#get_ref tag="method"} Retrieve the value of a reference of the given name. Raises a `KeyError` if unset. | Argument | Type | Description | | ----------- | -------------- | -------------------------- | | `name` | str | The name of the reference. | | **RETURNS** | Model | The reference. | ### Model.maybe_get_ref {#maybe_get_ref tag="method"} Retrieve the value of a reference of the given name, or None if unset. | Argument | Type | Description | | ----------- | ------------------------ | -------------------------- | | `name` | str | The name of the reference. | | **RETURNS** | Optional[Model] | The reference, or `None`. | ### Model.set_ref {#set_ref tag="method"} Set a value for a reference. | Argument | Type | Description | | -------- | ------------------------ | -------------------------------- | | `name` | str | The name of the reference. | | `value` | Optional[Model] | The new value for the attribute. | ### Model.has_grad {#has_grad tag="method"} Check whether the model has a non-zero gradient for the given parameter. If the gradient is allocated but is zeroed, returns `None`. | Argument | Type | Description | | ----------- | ----------------------- | --------------------------------------------- | | `name` | str | The parameter to check the gradient for. | | **RETURNS** | Optional[bool] | A ternary value (`True`, `False`, or `None`). | ### Model.get_grad {#get_grad tag="method"} Get the gradient for a parameter, if one is available. If the parameter is undefined or no gradient has been allocated, raises a `KeyError`. | Argument | Type | Description | | ----------- | ----------------- | -------------------------------------------------- | | `name` | str | The name of the parameter to get the gradient for. | | **RETURNS** | FloatsXd | The current gradient of the parameter. | ### Model.maybe_get_grad {#maybe_get_grad tag="method"} Get the gradient for a parameter, if one is available. If the parameter is undefined or no gradient has been allocated, returns `None`. | Argument | Type | Description | | ----------- | --------------------------- | -------------------------------------------------- | | `name` | str | The name of the parameter to get the gradient for. | | **RETURNS** | Optional[FloatsXd] | The current gradient of the parameter, or `None`. | ### Model.set_grad {#set_grad tag="method"} Set a parameter gradient to a new value. | Argument | Type | Description | | -------- | ----------------- | ----------------------------------------------------- | | `name` | str | The name of the parameter to assign the gradient for. | | `value` | FloatsXd | The new gradient. | ### Model.inc_grad {#inc_grad tag="method"} Increment the gradient of a parameter by `value`. | Argument | Type | Description | | -------- | ----------------- | --------------------------------- | | `name` | str | The name of the parameter. | | `value` | FloatsXd | The value to add to its gradient. | ### Model.get_gradients {#get_gradients tag="method"} Get non-zero gradients of the model's parameters, as a dictionary keyed by the parameter ID. The values are `(weights, gradients)` tuples. | Argument | Type | Description | | ----------- | --------------------------------------------------------- | ------------------------------------ | | **RETURNS** | Dict[Tuple[int, str], Tuple[FloatsXd, FloatsXd]] | The gradients keyed by parameter ID. | ### Model.copy {copy# tag="method"} Create a copy of the model, its attributes, and its parameters. Any child layers will also be deep-copied. The copy will receive a distinct `model.id` value. ```python ### Example from thinc.api import Linear model = Linear() model_copy = model.copy() ``` | Argument | Type | Description | | ----------- | -------------- | ------------------------ | | **RETURNS** | Model | A new copy of the model. | ### Model.to_gpu {#to_gpu tag="method"} Transfer the model to a given GPU device. ```python ### Example device = model.to_gpu(0) ``` | Argument | Type | Description | | ----------- | ------------------------- | ----------------------- | | `gpu_id` | int | Device index to select. | | **RETURNS** | cupy.cuda.Device | The device. | ### Model.to_cpu {#to_cpu tag="method"} Copy the model to CPU. ```python ### Example model.to_cpu() ``` ### Model.to_dict {#to_dict tag="method"} Serialize the model to a Python dictionary. `Model.to_bytes` delegates to this method to create the dict, which it then dumps with MessagePack. Serialization should round-trip identically, i.e. the same dict should result from loading and serializing a model. ```python ### Example model_data = model.to_dict() ``` | Argument | Type | Description | | ----------- | ------------- | --------------------- | | **RETURNS** | dict | The serialized model. | ### Model.from_dict {#from_dict tag="method"} Load the model from a Python dictionary. ```python ### Example model_data = model.to_dict() model = Model("model_name", forward).from_dict(model_data) ``` | Argument | Type | Description | | ----------- | -------------- | ----------------- | | `msg` | dict | The data to load. | | **RETURNS** | Model | The loaded model. | ### Model.to_bytes {#to_bytes tag="method"} Serialize the model to a bytes representation. Models are usually serialized using `msgpack`, so you should be able to call `msgpack.loads()` on the data and get back a dictionary with the contents. Serialization should round-trip identically, i.e. the same bytes should result from loading and serializing a model. ```python ### Example bytes_data = model.to_bytes() ``` | Argument | Type | Description | | ----------- | -------------- | --------------------- | | **RETURNS** | bytes | The serialized model. | ### Model.from_bytes {#from_bytes tag="method"} Deserialize the model from a bytes representation. Models are usually serialized using `msgpack`, so you should be able to call `msgpack.loads()` on the data and get back a dictionary with the contents. Serialization should round-trip identically, i.e. the same bytes should result from loading and serializing a model. ```python ### Example bytes_data = model.to_bytes() model = Model("model_name", forward).from_bytes(bytes_data) ``` | Argument | Type | Description | | ------------ | -------------- | ----------------------- | | `bytes_data` | bytes | The bytestring to load. | | **RETURNS** | Model | The loaded model. | ### Model.to_disk {#to_disk tag="method"} Serialize the model to disk. Most models will serialize to a single file, which should just be the bytes contents of [`Model.to_bytes`](#to_bytes). ```python ### Example model.to_disk("/path/to/model") ``` | Argument | Type | Description | | -------- | ------------------------- | --------------------------------------- | |  `path` | Union[Path, str] | File or directory to save the model to. | ### Model.from_disk {#from_disk tag="method"} Deserialize the model from disk. Most models will serialize to a single file, which should just be the bytes contents of [`Model.to_bytes`](#to_bytes). ```python ### Example model = Model().from_disk("/path/to/model") ``` | Argument | Type | Description | | ----------- | ------------------------- | --------------------------------- | |  `path` | Union[Path, str] | Directory to load the model from. | | **RETURNS** | Model | The loaded model. | ### Model.can_from_bytes {#can_from_bytes tag="method"} Check whether bytes data is compatible with the model for deserialization. | Argument | Type | Description | | ------------- | -------------- | --------------------------------------- | |  `bytes_data` | bytes | The bytestring to check. | |  `strict` | bool | Whether to require attributes to match. | | **RETURNS** | bool | Whether the data is compatible. | ### Model.can_from_bytes {#can_from_bytes tag="method"} Check whether a path is compatible with the model for deserialization. | Argument | Type | Description | | ----------- | ------------------------- | --------------------------------------- | |  `path` | Union[Path, str] | The path to check. | |  `strict` | bool | Whether to require attributes to match. | | **RETURNS** | Model | Whether the path is compatible. | ### Model.can_from_dict {#from_dict tag="method"} Check whether a dictionary is compatible with the model for deserialization. | Argument | Type | Description | | ----------- | -------------- | --------------------------------------- | | `msg` | dict | The data to check. | | `strict` | bool | Whether to require attributes to match. | | **RETURNS** | Model | Whether the data is compatible. | --- ## Utilities {#util} ### serialize_attr {#serialize_attr tag="function,single-dispatch"} [Single-dispatch generic function](https://docs.python.org/3/library/functools.html#functools.singledispatch) that serializes a model attribute in `Model.attrs` to bytes and can be customized to support other objects and data types. By default, the function uses MessagePack to serialize the attribute value to bytes. To register a serialization function for a custom type, you can use the `@serialize_attr.register` decorator and call it with the custom type. If an attribute of that type exists on a model, the registered function will be used to serialize it. ```python ### Example from thinc.api import serialize_attr @serialize_attr.register(MyCustomClass) def serialize_my_custom_class(_, value: MyCustomClass, name: str, model) -> bytes: # value is an instance of MyCustomClass that needs to be serialized. You # can perform any custom serialization here and return bytes return value.custom_serialization_method() ``` | Argument | Type | Description | | ----------- | -------------- | --------------------------------------------------------------------------------------------------------------------------- | | `_` | Any | An instance of the value to serialize. Its type will be used to determine which registered serialization function to apply. | | `value` | Any | The value to serialize. | | `name` | str | The attribute name. | | `model` | Model | The model that's being serialized, e.g. to retrieve other information. | | **RETURNS** | bytes | The serialized attribute. | ### deserialize_attr {#deserialize_attr tag="function,single-dispatch"} [Single-dispatch generic function](https://docs.python.org/3/library/functools.html#functools.singledispatch) that deserializes a model attribute in `Model.attrs` from bytes and can be customized to support other objects and data types. By default, the function uses MessagePack to load the attribute value from bytes. To register a deserialization function for a custom type, you can use the `@deserialize_attr.register` decorator and call it with the custom type. If an attribute of that type exists on a model, the registered function will be used to deserialize it. ```python ### Example from thinc.api import deserialize_attr @deserialize_attr.register(MyCustomClass) def deserialize_my_custom_class(_, value: bytes, name: str, model) -> MyCustomClass: # value is a bytestring that needs to be deserialized and transformed into # MyCustomClass. You can perform any custom deserialization here and return # an instance of MyCustomClass. return MyCustomClass().custom_load_method(value) ``` Since the type of the attribute is used to determine the deserialization function to use, attributes of custom types need **a default value of the same type**. For example, creating a `Model` with `attrs={"custom_attr": None}` won't work, because there's no way to tell that the attribute should be an instance of `MyCustomClass` (and deserialized as such). Using `attrs={"custom_attr": MyCustomClass()}` makes this clear and also means you won't have to handle `None` attrs in your model. | Argument | Type | Description | | ----------- | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `_` | Any | An instance of the value to deserialize (the default value of the attribute). Its type will be used to determine which registered deserialization function to apply. | | `value` | bytes | The bytestring to load. | | `name` | str | The attribute name. | | `model` | Model | The model that's being deserialized, e.g. to perform other side-effects. | | **RETURNS** | Any | The loaded attribute. | --- ## Shim {#shim tag="class"} Define a basic interface for external models. Users can create subclasses of `Shim` to wrap external libraries. The Thinc `Model` class treats `Shim` objects as a sort of special type of sublayer: it knows they're not actual Thinc `Model` instances, but it also knows to talk to the shim instances when doing things like using transferring between devices, loading in parameters, optimization. It also knows `Shim` objects need to be serialized and deserialized with to/from bytes/disk, rather than expecting that they'll be `msgpack`-serializable. A `Shim` can implement the following methods: | Method | Description | | ---------------- | ------------------------------------------------------------------------------------------------------ | |  `__init__` | Initialize the model. | |  `__call__` | Call the model and return the output and a callback to compute the gradients via backpropagation. | |  `predict` | Call the model and return only the output, instead of the `(output, callback)` tuple. | |  `begin_update` | Run the model over a batch of data, returning the output and a callback to complete the backward pass. | |  `finish_update` | Update parameters with current gradients. | |  `use_params` | Context manager to temporarily set the model's parameters to specified values. | |  `to_gpu` | Transfer the model to a given GPU device. | |  `to_cpu` | Copy the model to CPU. | |  `to_bytes` | Serialize the model to bytes. | |  `from_bytes` | Load the model from bytes. | |  `to_disk` | Serialize the model to disk. Defaults to writing the bytes representation to a file. | |  `from_disk` | Load the model from disk. Defaults to loading the byte representation from a file. | ### Available shims {#shims} A shim container is **not** a Thinc `Model` subclass itself, it's a subclass of `Shim`. | | | | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `PyTorchShim` | Interface between a [PyTorch](https://pytorch.org) model and a Thinc `Model`. For more details and examples, see the [`PyTorchWrapper` layer](/docs/api-layers#pytorchwrapper) and docs on [integrating other frameworks](/docs/usage-frameworks). | | `TorchScriptShim` | Interface between a [TorchScript](https://pytorch.org/docs/stable/jit.html) model and a Thinc `Model`. For more details and examples, see the [`TorchScriptWrapper` layer](/docs/api-layers#torchscriptwrapper) and docs on [integrating other frameworks](/docs/usage-frameworks). | | `TensorFlowShim` | Interface between a [TensorFlow](https://tensorflow.org) model and a Thinc `Model`. For more details, see the [`TensorFlowWrapper` layer](/docs/api-layers#tensorflowwrapper) and docs on [integrating other frameworks](/docs/usage-frameworks) | | `MXNetShim` | Interface between a [MXNet](https://mxnet.apache.org/) model and a Thinc `Model`. For more details, see the [`MXNetWrapper` layer](/docs/api-layers#mxnetwrapper) and docs on [integrating other frameworks](/docs/usage-frameworks) | thinc-release-v9.1.1/website/docs/api-optimizers.md000066400000000000000000000315131467064331700223410ustar00rootroot00000000000000--- title: Optimizers next: /docs/api-initializers --- An optimizer essentially performs stochastic gradient descent. It takes one-dimensional arrays for the weights and their gradients, along with an optional identifier key. The optimizer is expected to update the weights and zero the gradients in place. The optimizers are registered in the [function registry](/docs/api-config#registry) and can also be used via Thinc's [config mechanism](/docs/usage-config). ## Optimizer functions ### SGD {#sgd tag="function"} Function to create a SGD optimizer. If a hyperparameter specifies a schedule, the step that is passed to the schedule will be incremented on each call to [`Optimizer.step_schedules`](#step-schedules). ```python ### Example {small="true"} from thinc.api import SGD optimizer = SGD( learn_rate=0.001, L2=1e-6, grad_clip=1.0 ) ``` ```ini ### config.cfg {small="true"} [optimizer] @optimizers = SGD.v1 learn_rate = 0.001 L2 = 1e-6 L2_is_weight_decay = true grad_clip = 1.0 use_averages = true ``` | Argument | Type | Description | | -------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------- | | `learn_rate` | Union[float, List[float], Generator] | The initial learning rate. | | _keyword-only_ | | | | `L2` | Union[float, List[float], Generator] | The L2 regularization term. | | `grad_clip` | Union[float, List[float], Generator] | Gradient clipping. | | `use_averages` | bool | Whether to track moving averages of the parameters. | | `L2_is_weight_decay` | bool | Whether to interpret the L2 parameter as a weight decay term, in the style of the AdamW optimizer. | | `ops` | Optional[Ops] | A backend object. Defaults to the currently selected backend. | ### Adam {#adam tag="function"} Function to create an Adam optimizer. Returns an instance of [`Optimizer`](#optimizer). If a hyperparameter specifies a schedule, the step that is passed to the schedule will be incremented on each call to [`Optimizer.step_schedules`](#step-schedules). ```python ### Example {small="true"} from thinc.api import Adam optimizer = Adam( learn_rate=0.001, beta1=0.9, beta2=0.999, eps=1e-08, L2=1e-6, grad_clip=1.0, use_averages=True, L2_is_weight_decay=True ) ``` ```ini ### config.cfg {small="true"} [optimizer] @optimizers = Adam.v1 learn_rate = 0.001 beta1 = 0.9 beta2 = 0.999 eps = 1e-08 L2 = 1e-6 L2_is_weight_decay = true grad_clip = 1.0 use_averages = true ``` | Argument | Type | Description | | -------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------- | | `learn_rate` | Union[float, List[float], Generator] | The initial learning rate. | | _keyword-only_ | | | | `L2` | Union[float, List[float], Generator] | The L2 regularization term. | | `beta1` | Union[float, List[float], Generator] | First-order momentum. | | `beta2` | Union[float, List[float], Generator] | Second-order momentum. | | `eps` | Union[float, List[float], Generator] | Epsilon term for Adam etc. | | `grad_clip` | Union[float, List[float], Generator] | Gradient clipping. | | `use_averages` | bool | Whether to track moving averages of the parameters. | | `L2_is_weight_decay` | bool | Whether to interpret the L2 parameter as a weight decay term, in the style of the AdamW optimizer. | | `ops` | Optional[Ops] | A backend object. Defaults to the currently selected backend. | ### RAdam {#radam tag="function"} Function to create an RAdam optimizer. Returns an instance of [`Optimizer`](#optimizer). If a hyperparameter specifies a schedule, the step that is passed to the schedule will be incremented on each call to [`Optimizer.step_schedules`](#step-schedules). ```python ### Example {small="true"} from thinc.api import RAdam optimizer = RAdam( learn_rate=0.001, beta1=0.9, beta2=0.999, eps=1e-08, weight_decay=1e-6, grad_clip=1.0, use_averages=True, ) ``` ```ini ### config.cfg {small="true"} [optimizer] @optimizers = RAdam.v1 learn_rate = 0.001 beta1 = 0.9 beta2 = 0.999 eps = 1e-08 weight_decay = 1e-6 grad_clip = 1.0 use_averages = true ``` | Argument | Type | Description | | -------------- | --------------------------------------------- | ------------------------------------------------------------- | | `learn_rate` | Union[float, List[float], Generator] | The initial learning rate. | | _keyword-only_ | | | | `beta1` | Union[float, List[float], Generator] | First-order momentum. | | `beta2` | Union[float, List[float], Generator] | Second-order momentum. | | `eps` | Union[float, List[float], Generator] | Epsilon term for Adam etc. | | `weight_decay` | Union[float, List[float], Generator] | Weight decay term. | | `grad_clip` | Union[float, List[float], Generator] | Gradient clipping. | | `use_averages` | bool | Whether to track moving averages of the parameters. | | `ops` | Optional[Ops] | A backend object. Defaults to the currently selected backend. | --- ## Optimizer {tag="class"} Do various flavors of stochastic gradient descent, with first and second order momentum. Currently support "vanilla" SGD, Adam, and RAdam. ### Optimizer.\_\_init\_\_ {#init tag="method"} Initialize an optimizer. If a hyperparameter specifies a schedule, the step that is passed to the schedule will be incremented on each call to [`Optimizer.step_schedules`](#step-schedules). ```python ### Example from thinc.api import Optimizer optimizer = Optimizer(learn_rate=0.001, L2=1e-6, grad_clip=1.0) ``` | Argument | Type | Description | | -------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------- | | `learn_rate` | Union[float, List[float], Generator] | The initial learning rate. | | _keyword-only_ | | | | `L2` | Union[float, List[float], Generator] | The L2 regularization term. | | `beta1` | Union[float, List[float], Generator] | First-order momentum. | | `beta2` | Union[float, List[float], Generator] | Second-order momentum. | | `eps` | Union[float, List[float], Generator] | Epsilon term for Adam etc. | | `grad_clip` | Union[float, List[float], Generator] | Gradient clipping. | | `use_averages` | bool | Whether to track moving averages of the parameters. | | `use_radam` | bool | Whether to use the RAdam optimizer. | | `L2_is_weight_decay` | bool | Whether to interpret the L2 parameter as a weight decay term, in the style of the AdamW optimizer. | | `ops` | Optional[Ops] | A backend object. Defaults to the currently selected backend. | ### Optimizer.\_\_call\_\_ {#call tag="method"} Call the optimizer function, updating parameters using the current parameter gradients. The `key` is the identifier for the parameter, usually the node ID and parameter name. | Argument | Type | Description | | -------------- | ------------------------ | --------------------------------------------- | | `key` | Tuple[int, str] | The parameter identifier. | | `weights` | FloatsXd | The model's current weights. | | `gradient` | FloatsXd | The model's current gradient. | | _keyword-only_ | | | | `lr_scale` | float | Rescale the learning rate. Defaults to `1.0`. | ### Optimizer.last_score {#last_score tag="property", new="9"} Get or set the last evaluation score. The optimizer passes this score to the learning rate schedule, so that the schedule can take training dynamics into account (see e.g. the [`plateau`](/docs/api-schedules#plateau) schedule). ```python ### Example from thinc.api import Optimizer, constant, plateau schedule = plateau(2, 0.5, constant(1.0)) optimizer = Optimizer(learn_rate=schedule) optimizer.last_score = (1000, 88.34) ``` | Argument | Type | Description | | ----------- | ------------------------------------ | ------------------------------------------ | | **RETURNS** | Optional[Tuple[int, float]] | The step and score of the last evaluation. | ### Optimizer.step_schedules {#step_schedules tag="method"} Increase the current step of the optimizer. This step will be used by schedules to determine their next value. ```python ### Example from thinc.api import Optimizer, decaying optimizer = Optimizer(learn_rate=decaying(0.001, 1e-4), grad_clip=1.0) assert optimizer.learn_rate == 0.001 optimizer.step_schedules() assert optimizer.learn_rate == 0.000999900009999 # using a schedule assert optimizer.grad_clip == 1.0 # not using a schedule ``` ### Optimizer.to_gpu {#to_gpu tag="method"} Transfer the optimizer to a given GPU device. ```python ### Example optimizer.to_gpu() ``` ### Optimizer.to_cpu {#to_cpu tag="method"} Copy the optimizer to CPU. ```python ### Example optimizer.to_cpu() ``` ### Optimizer.to_gpu {#to_gpu tag="method"} Transfer the optimizer to a given GPU device. ```python ### Example optimizer.to_gpu() ``` ### Optimizer.to_cpu {#to_cpu tag="method"} Copy the optimizer to CPU. ```python ### Example optimizer.to_cpu() ``` thinc-release-v9.1.1/website/docs/api-schedules.md000066400000000000000000000305771467064331700221240ustar00rootroot00000000000000--- title: Schedules next: /docs/api-loss --- Schedules are generators that provide different rates, schedules, decays or series. They're typically used for batch sizes or learning rates. You can easily implement your own schedules as well: just write your own [`Schedule`](#schedule) implementation, that produces whatever series of values you need. A common use case for schedules is within [`Optimizer`](/docs/api-optimizer) objects, which accept iterators for most of their parameters. See the [training guide](/docs/usage-training) for details. ## Schedule {#schedule tag="class" new="9"} Class for implementing Thinc schedules. There's only one `Schedule` class in Thinc and schedules are built using **composition**, not inheritance. This means that a schedule or composed schedule will return an **instance** of `Schedule` – it doesn't subclass it. To read more about this concept, see the pages on [Thinc's philosophy](/docs/concept). ### Typing {#typing} `Schedule` can be used as a [generic type](https://docs.python.org/3/library/typing.html#generics) with one parameter. This parameter specifies the type that is returned by the schedule. For instance, `Schedule[int]` denotes a scheduler that returns integers when called. A mismatch will cause a type error. For more details, see the docs on [type checking](/docs/usage-type-checking). ```python from thinc.api import Schedule def my_function(schedule: Schedule[int]): ... ``` ### Attributes {#attributes} | Name | Type | Description | | ------ | ------------ | ------------------------------- | | `name` | str | The name of the scheduler type. | ### Properties {#properties} | Name | Type | Description | | ------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `attrs` | Dict[str, Any] | The scheduler attributes. You can use the dict directly and assign _to_ it – but you cannot reassign `schedule.attrs` to a new variable: `schedule.attrs = {}` will fail. | ### Schedule.\_\_init\_\_ {#init tag="method"} Initialize a new schedule. ```python ### Example schedule = Schedule( "constant", constant_schedule, attrs={"rate": rate}, ) ``` | Argument | Type | Description | | -------------- | ----------------------- | -------------------------------------------------------- | | `name` | str | The name of the schedule type. | | `schedule` | Callable | Function to compute the schedule value for a given step. | | _keyword-only_ | | | | `attrs` | Dict[str, Any] | Dictionary of non-parameter attributes. | ### Schedule.\_\_call\_\_ {#call tag="method"} Call the schedule function, returning the value for the given step. The `step` positional argument is always required. Some schedules may require additional keyword arguments. ```python ### Example from thinc.api import constant schedule = constant(0.1) assert schedule(0) == 0.1 assert schedule(1000) == 0.1 ``` | Argument | Type | Description | | ----------- | ------------ | ------------------------------------------ | | `step` | int | The step to compute the schedule for. | | `**kwargs` | | Optional arguments passed to the schedule. | | **RETURNS** | Any | The schedule value for the step. | ### Schedule.to_generator {#to_generator tag="method"} Turn the schedule into a generator by passing monotonically increasing step count into the schedule. ```python ### Example from thinc.api import constant g = constant(0.1).to_generator() assert next(g) == 0.1 assert next(g) == 0.1 ``` | Argument | Type | Description | | ----------- | ------------------------------------ | ------------------------------------------------------------------------------- | | `start` | int | The initial schedule step. Defaults to `0`. | | `step_size` | int | The amount to increase the step with for each generated value. Defaults to `1`. | | `**kwargs` | | Optional arguments passed to the schedule. | | **RETURNS** | Generator[OutT, None, None] | The generator. | ## constant {#constant tag="function"} Yield a constant rate. ![](images/schedules_constant.svg) ```python ### {small="true"} from thinc.api import constant batch_sizes = constant(0.001) batch_size = batch_sizes(step=0) ``` ```ini ### config {small="true"} [batch_size] @schedules = "constant.v1" rate = 0.001 ``` | Argument | Type | | ---------- | -------------- | | `rate` | float | | **YIELDS** | float | ## constant_then {#constant_then tag="function"} Yield a constant rate for N steps, before starting a schedule. ![](images/schedules_constant_then.svg) ```python ### {small="true"} from thinc.api import constant_then, decaying learn_rates = constant_then( 0.005, 1000, decaying(0.005, 1e-4) ) learn_rate = learn_rates(step=0) ``` ```ini ### config {small="true"} [learn_rates] @schedules = "constant_then.v1" rate = 0.005 steps = 1000 [learn_rates.schedule] @schedules = "decaying" base_rate = 0.005 decay = 1e-4 ``` | Argument | Type | | ---------- | ------------------------ | | `rate` | float | | `steps` | int | | `schedule` | Iterable[float] | | **YIELDS** | float | ## decaying {#decaying tag="function"} Yield an infinite series of linearly decaying values, following the schedule `base_rate * 1 / (1 + decay * t)`. ![](images/schedules_decaying.svg) ```python ### {small="true"} from thinc.api import decaying learn_rates = decaying(0.005, 1e-4) learn_rate = learn_rates(step=0) # 0.001 learn_rate = learn_rates(step=1) # 0.00999 ``` ```ini ### config {small="true"} [learn_rate] @schedules = "decaying.v1" base_rate = 0.005 decay = 1e-4 t = 0 ``` | Argument | Type | | -------------- | -------------- | | `base_rate` | float | | `decay` | float | | _keyword-only_ | | | `t` | int | | **YIELDS** | float | ## compounding {#compounding tag="function"} Yield an infinite series of compounding values. Each time the generator is called, a value is produced by multiplying the previous value by the compound rate. ![](images/schedules_compounding.svg) ```python ### {small="true"} from thinc.api import compounding batch_sizes = compounding(1.0, 32.0, 1.001) batch_size = batch_sizes(step=0) # 1.0 batch_size = batch_sizes(step=1) # 1.0 * 1.001 ``` ```ini ### config {small="true"} [batch_size] @schedules = "compounding.v1" start = 1.0 stop = 32.0 compound = 1.001 t = 0 ``` | Argument | Type | | -------------- | -------------- | | `start` | float | | `stop` | float | | `compound` | float | | _keyword-only_ | | | `t` | int | | **YIELDS** | float | ## warmup_linear {#warmup_linear tag="function"} Generate a series, starting from an initial rate, and then with a warmup period, and then a linear decline. Used for learning rates. ![](images/schedules_warmup_linear.svg) ```python ### {small="true"} from thinc.api import warmup_linear learn_rates = warmup_linear(0.01, 3000, 6000) learn_rate = learn_rates(step=0) ``` ```ini ### config {small="true"} [learn_rate] @schedules = "warmup_linear.v1" initial_rate = 0.01 warmup_steps = 3000 total_steps = 6000 ``` | Argument | Type | | -------------- | -------------- | | `initial_rate` | float | | `warmup_steps` | int | | `total_steps` | int | | **YIELDS** | float | ## slanted_triangular {#slanted_triangular tag="function"} Yield an infinite series of values according to [Howard and Ruder's (2018)](https://arxiv.org/abs/1801.06146) "slanted triangular learning rate" schedule. ![](images/schedules_slanted_triangular.svg) ```python ### {small="true"} from thinc.api import slanted_triangular learn_rates = slanted_triangular(0.1, 5000) learn_rate = learn_rates(step=0) ``` ```ini ### config {small="true"} [learn_rate] @schedules = "slanted_triangular.v1" max_rate = 0.1 num_steps = 5000 cut_frac = 0.1 ratio = 32 decay = 1.0 t = 0.1 ``` | Argument | Type | | -------------- | -------------- | | `max_rate` | float | | `num_steps` | int | | _keyword-only_ | | | `cut_frac` | float | | `ratio` | int | | `decay` | float | | `t` | float | | **YIELDS** | float | ## cyclic_triangular {#cyclic_triangular tag="function"} Linearly increasing then linearly decreasing the rate at each cycle. ![](images/schedules_cyclic_triangular.svg) ```python ### {small="true"} from thinc.api import cyclic_triangular learn_rates = cyclic_triangular(0.005, 0.001, 1000) learn_rate = learn_rates(step=0) ``` ```ini ### config {small="true"} [learn_rate] @schedules = "cyclic_triangular.v1" min_lr = 0.005 max_lr = 0.001 period = 1000 ``` | Argument | Type | | ---------- | -------------- | | `min_lr` | float | | `max_lr` | float | | `period` | int | | **YIELDS** | float | ## plateau {#plateau tag="function" new="9"} Yields values from the wrapped schedule, exponentially scaled by the number of times optimization has plateaued. The caller must pass model evaluation scores through the `last_score` argument for the scaling to be adjusted. The last evaluation score is passed through the `last_score` argument as a tuple (`last_score_step`, `last_score`). This tuple indicates when a model was last evaluated (`last_score_step`) and with what score (`last_score`). ```python ### {small="true"} from thinc.api import constant, plateau schedule = plateau(2, 0.5, constant(1.0)) assert schedule(step=0, last_score=(0, 1.0)) == 1.0 assert schedule(step=1, last_score=(1, 1.0)) == 1.0 assert schedule(step=2, last_score=(2, 1.0)) == 0.5 assert schedule(step=3, last_score=(3, 1.0)) == 0.5 assert schedule(step=4, last_score=(4, 1.0)) == 0.25 ``` ```ini ### config {small="true"} [learn_rate] @schedules = "plateau.v1" scale = 0.5 max_patience = 2 [learn_rate.shedule] @schedules = "constant.v1" rate = 1.0 ``` | Argument | Type | Description | | -------------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `max_patience` | int | Number of evaluations without an improvement to consider the model to have plateaued. | | `scale` | float | Scale to apply to the learning rate when the model has plateaued. This scale is cumulative -- if the model plateaued `n` times, the effective scale is `scale**n`. | | `schedule` | Schedule[float] | The schedule to wrap. | | **RETURNS** | Schedule[float] | | thinc-release-v9.1.1/website/docs/api-types.md000066400000000000000000000261271467064331700213050ustar00rootroot00000000000000--- title: Types & Dataclasses teaser: Type annotations, data structures and more next: /docs/api-backends --- | | | | ------------------------------- | ----------------------------------------------------------------------- | | [**Types**](#types) | Custom type annotations for input/output types available in Thinc. | | [**Dataclasses**](#dataclasses) | Data structures for efficient processing, especially for sequence data. | ## Types {#types} | | | | ---------------------------------------------------------- | --------------------------------------------------------------------------- | | `Floats1d`, `Floats2d`, `Floats3d`, `Floats4d`, `FloatsXd` | 1d, 2d, 3d, 4d and any-d arrays of floats (`DTypesFloat`). | | `Ints1d`, `Ints2d`, `Ints3d`, `Ints4d`, `IntsXd` | 1d, 2d, 3d, 4d and any-d arrays of ints (`DTypesInt`). | | `Array1d`, `Array2d`, `Array3d`, `Array4d`, `ArrayXd` | 1d, 2d, 3d, 4d and any-d arrays of floats or ints. | | `List1d`, `List2d`, `List3d`, `List4d`, `ListXd` | Lists of 1d, 2d, 3d, 4d and any-d arrays (with same-type elements). | | `DTypesFloat` | Float data types: `"f"` or `"float32"`. | | `DTypesInt` | Integer data types: `"i"`, `"int32"`, `"int64"`, `"uint32"`, `"uint64"`. | | `DTypes` | Union of DTypesFloat and DTypesInt. | | `Shape` | An array shape. Equivalent to Tuple[int, ...]. | | `Xp` | `numpy` on CPU or `cupy` on GPU. Equivalent to Union[numpy, cupy]. | | `Generator` | Custom type for generators / iterators for better config validation. | | `Batchable` | Union[Pairs, Ragged, Padded, ArrayXd, List, Tuple]. | --- ## Dataclasses {#dataclasses} A dataclass is a **lightweight data structure**, similar in spirit to a named tuple, defined using the [`@dataclass`](https://docs.python.org/3/library/dataclasses.html#module-level-decorators-classes-and-functions) decorator introduced in Python 3.7 (and backported to 3.6). Thinc uses dataclasses for many situations that would otherwise be written with nested Python containers. Dataclasses work better with the type system, and often result in code that's **easier to read and test**. ### Ragged {#ragged tag="dataclass"} A batch of concatenated sequences, that vary in the size of their first dimension. `Ragged` allows variable-length sequence data to be contiguous in memory, without padding. Indexing into `Ragged` is just like indexing into the `lengths` array, except it returns a `Ragged` object with the accompanying sequence data. For instance, you can write `ragged[1:4]` to get a `Ragged` object with sequences `1`, `2` and `3`. Internally, the input data is reshaped into a two-dimensional array, to allow routines to operate on it consistently. The original data shape is stored, and the reshaped data is accessible via the `dataXd` property. | Member | Type | Description | | ------------ | ---------------- | --------------------------------------------------------- | | `data` | Array2d | The data array. | | `dataXd` | ArrayXd | The data array with the original shape. | | `data_shape` | Shape | The original data shape, with -1 for the first dimension. | | `lengths` | Ints1d | The sequence lengths. | ### Padded {#padded tag="dataclass"} A batch of padded sequences, sorted by decreasing length. The auxiliary array `size_at_t` indicates the length of the batch at each timestep, so you can do `data[:, :size_at_t[t]]` to shrink the batch. For instance, let's say you have a batch of four documents, of lengths `[6, 5, 2, 1]`. The `size_at_t` will be `[4, 3, 3, 3, 2, 1]`. The lengths array indicates the length of each row, and the indices indicates the original ordering. The `Padded` container is currently limited to two-dimensional array content (that is, a batch of sequences, where each timestep of each batch is a 2d array). This restriction will be relaxed in a future release. | Member | Type | Description | | ----------- | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | `data` | Floats3d | A three-dimensional array, sorted by decreasing sequence length. The dimensions are timestep, batch item, row data. | | `site_at_t` | Ints1d | An array indicating how the batch can be truncated at different sequence lengths. You can do `data[:, :size_at_t[t]]` to get an unpadded batch. | | `lengths` | Ints1d | The sequence lengths. Applies to the reordered sequences, not the original ordering. So it'll be decreasing length. | | `indices` | Ints1d | Lists of indices indicating how to put the items back into original order. | ### Pairs {#pairs} A batch of paired data, for instance images and their captions, or pairs of texts to compare. Indexing operations are performed as though the data were transposed to make the batch the outer dimension. For instance, `pairs[:3]` will return `Pairs(pairs.one[:3], pairs.two[:3])`, i.e. a slice of the batch with the first three items, as a new `Pairs` object. ```python ### Example from thinc.types import Pairs pairs = Pairs([1, 2, 3, 4], [5, 6, 7, 8]) assert pairs.one == [1, 2, 3, 4] assert pairs[2] == Pairs(3, 7) assert pairs[2:4] == Pairs([3, 4], [7, 8]) ``` | Member | Type | Description | | ------ | ----------------- | -------------------- | | `one` | Sequence | The first sequence. | | `two` | Sequence | The second sequence. | ### SizedGenerator {#sizedgenerator tag="dataclass"} A custom dataclass for a generator that has a `__len__` and can repeatedly call the generator function. This is especially useful for batching (see [`Ops.minibatch`](/docs/api-backends#minibatch)) where you know the length of the data upfront, but still want to batch it as a stream and return a generator. Exposing a `__len__` attribute also makes it work seamlessly with progress bars like [`tqdm`](https://github.com/tqdm/tqdm) and similar tools. The underlying generator function is called _every time_ the sized generator is executed and won't be consumed. This allows defining the batching outside of the training loop. On each iteration, the data will be reshuffled and rebatched. ```python ### Example train_data = model.ops.multibatch(128, train_X, train_Y, shuffle=True) assert isinstance(train_data, SizedGenerator) for i in range(10): for X, Y in tqdm(train_data, leave=False): Yh, backprop = model.begin_update(X) ``` | Member | Type | Description | | ----------- | -------------------------------- | -------------------------------------------------------------- | | `get_items` | Callable[[], Generator] | The generator function. Available via the `__iter__` method. | | `length` | int | The length of the data. Available via the `__len__` attribute. | ### ArgsKwargs {#argskwargs tag="dataclass"} A tuple of `(args, kwargs)` that can be spread into some function f: `f(*args, **kwargs)`. Makes it easier to handle positional and keyword arguments that get passed around, especially for integrating custom models via a [`Shim`](/docs/api-model#shims). | Member | Type | Description | | -------- | ------------------------ | ------------------------------------------------------------------------------ | | `args` | Tuple[Any, ...] | The positional arguments. Can be passed into a function as `*ArgsKwargs.args`. | | `kwargs` | Dict[str, Any] | The keyword arguments. Can be passed into a function as `**ArgsKwargs.kwargs`. | #### ArgsKwargs.from_items {#argskwargs-from_items tag="classmethod"} Create an `ArgsKwargs` object from a sequence of `(key, value)` tuples, such as produced by `ArgsKwargs.items`. Each key should be either a string or an integer. Items with integer keys are added to the `args`, and items with string keys are added to the `kwargs`. The `args` are determined by sequence order, not the value of the integer. ```python ### Example from thinc.api import ArgsKwargs items = [(0, "value"), ("key", "other value"), (1, 15), ("foo", True)] ak = ArgsKwargs.from_items(items) assert ak.args == ("value", 15) assert ak.kwargs == {"key": "other value", "foo": True} ``` | Argument | Type | Description | | ----------- | ---------------------------------------------- | --------------------------- | | `items` | Sequence[Tuple[Union[int, str], Any]] | The items. | | **RETURNS** | ArgsKwargs | The `ArgsKwargs` dataclass. | #### ArgsKwargs.keys {#argskwargs-keys tag="method"} Yield indices from `ArgsKwargs.args`, followed by keys from `ArgsKwargs.kwargs`. | Argument | Type | Description | | ---------- | ------------------------ | -------------------------------------- | | **YIELDS** | Union[int, str] | The keys, `args` followed by `kwargs`. | #### ArgsKwargs.values {#argskwargs-values tag="method"} Yield values from `ArgsKwargs.args`, followed by keys from `ArgsKwargs.kwargs`. | Argument | Type | Description | | ---------- | ------------ | ---------------------------------------- | | **YIELDS** | Any | The values, `args` followed by `kwargs`. | #### ArgsKwargs.items {#argskwargs-items tag="method"} Yield `enumerate(ArgsKwargs.args)`, followed by `ArgsKwargs.kwargs.items()`. | Argument | Type | Description | | ---------- | ------------------------------------ | ---------------------------------------- | | **YIELDS** | Tuple[Union[int, str], Any] | The values, `args` followed by `kwargs`. | thinc-release-v9.1.1/website/docs/api-util.md000066400000000000000000000241431467064331700211120ustar00rootroot00000000000000--- title: Utilities & Extras teaser: Helpers and utility functions --- ### fix_random_seed {#fix_random_seed tag="function"} Set the random seed for `random`, `numpy.random` and `cupy.random` (if available). Should be called at the top of a file or function. ```python ### Example from thinc.api import fix_random_seed fix_random_seed(0) ``` | Argument | Type | Description | | -------- | ------------ | -------------------------- | | `seed` | int | The seed. Defaults to `0`. | ### require_cpu {#require_cpu tag="function"} Allocate data and perform operations on CPU. If data has already been allocated on GPU, it will not be moved. Ideally, this function should be called right after importing Thinc. ```python ### Example from thinc.api import require_cpu require_cpu() ``` | Argument | Type | Description | | ----------- | ------------- | ----------- | | **RETURNS** | bool | `True`. | ### prefer_gpu {#prefer_gpu tag="function"} Allocate data and perform operations on GPU, if available. If data has already been allocated on CPU, it will not be moved. Ideally, this function should be called right after importing Thinc. ```python ### Example from thinc.api import prefer_gpu is_gpu = prefer_gpu() ``` | Argument | Type | Description | | ----------- | ------------- | ---------------------------------------- | | `gpu_id` | int | Device index to select. Defaults to `0`. | | **RETURNS** | bool | Whether the GPU was activated. | ### require_gpu {#require_gpu tag="function"} Allocate data and perform operations on GPU. Will raise an error if no GPU is available. If data has already been allocated on CPU, it will not be moved. Ideally, this function should be called right after importing Thinc. ```python ### Example from thinc.api import require_gpu require_gpu() ``` | Argument | Type | Description | | ----------- | ------------- | ----------- | | **RETURNS** | bool | `True`. | ### set_active_gpu {#set_active_gpu tag="function"} Set the current GPU device for `cupy` (and for `torch`, if installed) and return a `cupy` device. Will raise an error if no GPU is available. ```python ### Example from thinc.api import set_active_gpu set_active_gpu(0) ``` | Argument | Type | Description | | ----------- | ------------------------- | ----------------------- | | `gpu_id` | int | Device index to select. | | **RETURNS** | cupy.cuda.Device | The device. | ### use_pytorch_for_gpu_memory {#use_pytorch_for_gpu_memory tag="function"} Route GPU memory allocation via PyTorch. This is recommended for using PyTorch and `cupy` together, as otherwise OOM errors can occur when there's available memory sitting in the other library's pool. We'd like to support routing TensorFlow memory allocation via PyTorch as well (or vice versa), but do not currently have an implementation for it. ```python ### Example from thinc.api import prefer_gpu, use_pytorch_for_gpu_memory if prefer_gpu(): use_pytorch_for_gpu_memory() ``` ### use_tensorflow_for_gpu_memory {#use_tensorflow_for_gpu_memory tag="function"} Route GPU memory allocation via TensorFlow. This is recommended for using TensorFlow and `cupy` together, as otherwise OOM errors can occur when there's available memory sitting in the other library's pool. We'd like to support routing PyTorch memory allocation via TensorFlow as well (or vice versa), but do not currently have an implementation for it. ```python ### Example from thinc.api import prefer_gpu, use_tensorflow_for_gpu_memory if prefer_gpu(): use_tensorflow_for_gpu_memory() ``` ### get_width {#get_width tag="function"} Infer the width of a batch of data, which could be any of: an n-dimensional array (use the shape) or a sequence of arrays (use the shape of the first element). | Argument | Type | Description | | -------------- | ---------------------------------------------------------- | ------------------------------------------------------ | | `X` | Union[ArrayXd, Ragged, Padded, Sequence[ArrayXd]] | The array(s). | | _keyword-only_ | | | | `dim` | int | Which dimension to get the size for. Defaults to `-1`. | | **RETURNS** | int | The array's inferred width. | ### to_categorical {#to_categorical tag="function"} Converts a class vector (integers) to binary class matrix. Based on [`keras.utils.to_categorical`](https://keras.io/utils/). | Argument | Type | Description | | ----------------- | ---------------------- | ---------------------------------------------------------------------------------------------- | | `Y` | IntsXd | Class vector to be converted into a matrix (integers from `0` to `n_classes`). | | `n_classes` | Optional[int] | Total number of classes. | | _keyword-only_ | | | | `label_smoothing` | float | Smoothing-coefficient for label-smoothing. | | **RETURNS** | Floats2d | A binary matrix representation of the input. The axis representing the classes is placed last. | ### enable_mxnet {#enable_mxnet tag="function" new="8.2.0"} Import and enable internal support for MXNet. ### enable_tensorflow {#enable_tensorflow tag="function" new="8.2.0"} Import and enable internal support for TensorFlow. ### xp2torch {#xp2torch tag="function"} Convert a `numpy` or `cupy` tensor to a PyTorch tensor. | Argument | Type | Description | | --------------- | --------------------- | ---------------------------------------------- | | `xp_tensor` | ArrayXd | The tensor to convert. | | `requires_grad` | bool | Whether to backpropagate through the variable. | | **RETURNS** | torch.Tensor | The converted tensor. | ### torch2xp {#torch2xp tag="function"} Convert a PyTorch tensor to a `numpy` or `cupy` tensor. | Argument | Type | Description | | -------------- | --------------------- | ---------------------- | | `torch_tensor` | torch.Tensor | The tensor to convert. | | **RETURNS** | ArrayXd | The converted tensor. | ### xp2tensorflow {#xp2tensorflow tag="function"} Convert a `numpy` or `cupy` tensor to a TensorFlow tensor. | Argument | Type | Description | | --------------- | -------------------------- | ----------------------------------------------------- | | `xp_tensor` | ArrayXd | The tensor to convert. | | `requires_grad` | bool | Whether to backpropagate through the variable. | | `as_variable` | bool | Convert the result to a `tensorflow.Variable` object. | | **RETURNS** | tensorflow.Tensor | The converted tensor. | ### tensorflow2xp {#tensorflow2xp tag="function"} Convert a TensorFlow tensor to a `numpy` or `cupy` tensor. | Argument | Type | Description | | ------------------- | -------------------------- | ---------------------- | | `tensorflow_tensor` | tensorflow.Tensor | The tensor to convert. | | **RETURNS** | ArrayXd | The converted tensor. | ### xp2mxnet {#xp2mxnet tag="function"} Convert a `numpy` or `cupy` tensor to an MXNet tensor. | Argument | Type | Description | | --------------- | ---------------------- | ---------------------------------------------- | | `xp_tensor` | ArrayXd | The tensor to convert. | | `requires_grad` | bool | Whether to backpropagate through the variable. | | **RETURNS** | mx.nd.NDArray | The converted tensor. | ### mxnet2xp {#mxnet2xp tag="function"} Convert an MXNet tensor to a `numpy` or `cupy` tensor. | Argument | Type | Description | | ----------- | ---------------------- | ---------------------- | | `mx_tensor` | mx.nd.NDArray | The tensor to convert. | | **RETURNS** | ArrayXd | The converted tensor. | ### Errors {#errors} Thinc uses the following custom errors: | Name | Description | | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ConfigValidationError` | Raised if invalid config settings are encountered by [`Config`](/docs/api-config#config) or the [`registry`](/docs/api-config#registry), or if resolving and validating the referenced functions fails. | | `DataValidationError` | Raised if [`Model.initialize`](/docs/api-model#initialize) is called with sample input or output data that doesn't match the expected input or output of the network, or leads to mismatched input or output in any of its layer. | thinc-release-v9.1.1/website/docs/backprop101.md000066400000000000000000000704061467064331700214140ustar00rootroot00000000000000--- title: Backpropagation 101 teaser: How to trick yourself into understanding backprop without even trying --- Imagine you're a project manager, somewhere deep inside a vast company. You have an inbox, an outbox, and three people in your team: Alex, Bo, and Casey. Work comes into your inbox, you allocate it to someone in your team, they perform the work and get the results back to you, and you move those results to your outbox. Some time later, and potentially out-of-order, you'll receive feedback on the work you submitted. Of course, when you receive the feedback, it won't be labelled according to the person who did it --- the bureaucracy above you neither knows nor cares about Alex, Bo and Casey. All the tasks will have an ID attached, and you'll pass that ID on when you move the results forward. Later you'll use the ID to figure out how to handle the feedback. ```python def handle_work(team, inbox, outbox, feedback_from_above): ... while True: if not_empty(inbox): task_id, task = next(inbox) worker = choose_worker(team) results = worker(task) outbox.send(task_id, results) if not_empty(feedback_from_above): task_id, feedback = next(feedback_from_above) ... ``` Because you don't know when you'll get the feedback, you have some state to track. You need to keep track of who did what task, so you can route the feedback to the right person. If Alex did the task and you give the feedback to Bo, your team will not improve. And your team members have some state to track too: they need to understand each piece of feedback in terms of the specific task it relates to. You want them to be able to get feedback like, "This wasn't ambitious enough", notice that their proposal was way under-budget, and see what they should've done differently in that specific scenario. Alex, Bo and Casey should each keep their own notes about their projects, and the specifics of exactly what they should do differently should be up to them --- you don't want to micromanage that. You have a great team. If you just route the information around, they'll take care of the rest. So to make your routing job easier, you ask everyone to return you a _callback_ to pass along the feedback when it's ready. The callback is created by the worker on your team, and it should wrap whatever state they need to act upon the feedback when/if it comes. With this system, all you need to do is file all the callbacks correctly when you're passing work forward, and then retrieve the right handle when the feedback comes in. ```python def handle_work(team, inbox, outbox, feedback_from_above): pending_feedback = {} while True: if not_empty(inbox): task_id, task = next(inbox) worker = choose_worker(team) results, handle_feedback = worker(task) pending_feedback[task_id] = handle_feedback outbox.send(task_id, results) if not_empty(feedback_from_above): task_id, feedback = next(feedback_from_above) handle_feedback = pending_feedback[task_id] handle_feedback(feedback) ``` This system definitely makes your job easy, and all the information is getting routed correctly. But something's still missing. Alex, Bo and Casey have feedback too: about their inputs. They are getting feedback about their work, and are doing their best to incorporate it and improve. But their own performance is also dependent on the specific inputs they were given. It's always the case that if the input for a given task had been a little bit different, the output would've been different as well. When incorporating the feedback on their work, the workers in your team will thus have feedback on the original inputs they were given, and how those inputs could have been better to ensure outputs that would have been closer to what the people above you really wanted. Currently all this feedback is getting lost, and there's no way for the people who produced those inputs to learn what your team wants from them. So you need another outbox, pointed in the other direction, to propagate the feedback from your workers to the people preparing their inputs. ```python def handle_work(team, inbox, outbox, feedback_from_above, feedback_to_below): ... ``` Of course, you need to make a clear distinction between the feedback that your team received on their outputs, and the feedback that your team produced about their inputs, and make sure that the correct pieces of feedback end up with the right people. Imagine if Alex had created a proposal that could potentially run over-budget, and you had passed that proposal upwards. Later you pass along feedback to Alex that says: "Not ambitious enough; client asked for bold". That's a feedback message for Alex, about Alex's work. The team who made the input proposal then needs to hear Alex's feedback on the original inputs: "The client context was originally described as 'risk sanctioned', which is ambiguous phrasing. Please be more clear when specifying the requirements." If instead you passed them the feedback intended for Alex, the team below you would be misled. They'd move in the wrong direction. So you need to be careful that everything's routed correctly. The feedback into Alex and the feedback out of Alex are not interchangeable. ```python def handle_work(team, inbox, outbox, feedback_from_above, feedback_to_below): pending_feedback = {} while True: if not_empty(inbox): task_id, task = next(inbox) worker = choose_worker(team) results, handle_feedback = worker(task) pending_feedback[task_id] = handle_feedback outbox.send(task_id, results) if not_empty(feedback_from_above): task_id, feedback = next(feedback_from_above) handle_feedback = pending_feedback[task_id] feedback_to_below.send(task_id, handle_feedback(feedback)) ``` With work passing forward, and corrections being fed back, your team and the people feeding you work are operating smoothly. The corrections you're asking Alex, Bo and Casey to make get more and more minor; and in turn, the corrections they're passing back are getting smaller too. Life is good, work is easy... So you start to have some time on your hands. One day you're watching a TED talk about management, and you hear about the "wisdom of crowds": if you combine several independent estimates, you can get a more accurate result. You only have a crowd of three, but you're getting a lot of budget estimation tasks, so why not give it a try? For the next budget estimation task, instead of giving it to just one worker, you decide to get them all to work on it separately. You don't tell them about each others' work, because you don't want groupthink --- you want them to all come up with a separate estimate. You then add them all up, and send off the result. ```python alex_estimate, give_alex_feedback = alex(task) bo_estimate, give_bo_feedback = bo(task) casey_estimate, give_casey_feedback = casey(task) estimate = alex_estimate + bo_estimate + casey_estimate ``` Looking back on what you know now, just adding them up does feel kind of silly... But the rest of the TED talk was some weird stuff about jellybeans and you stopped paying attention. So this is what you did. Anyway, the estimate you sent off was way too high, so now you'd better give everyone the feedback so they can adjust for next time. Since this was a numerical estimate, the feedback is very simple: it's just a number. You don't actually know very much about this number and what it really represents, but you get a bonus if your team outputs work such that smaller numbers come back. The closer to 0 the feedback becomes, the bigger the bonus. You incentivise your team accordingly. The first time you just sum up their estimates, the combined estimate way overshoots, and your feedback is far from zero. How should you split up the feedback between Alex, Bo and Casey, and when they have feedback in turn, how should you pass that along? ```python def propagate_feedback_from_addition(feedback, give_alex_feedback, give_bo_feedback, give_casey_feedback): # What to do here? ... return feedback_to_input ``` One way to think about this is that there's three people, and one piece of feedback. So we should divide it up between all three estimates equally. But you think about this some more, and decide that you really don't feel like micromanaging this: you just want the _combined_ score to come out right. So you figure that you'll just give all of the feedback to everyone, and see how that works out. Sure, your team may be a bit confused at first, but they'll quickly adjust their spreadsheets or whatever and the combined estimate will get closer and closer to the mark. There's also the question of how to pass on Alex, Bo and Casey's feedback about their inputs. It turns out for these cost estimates, everything comes in a nicely structured format: the "inputs" are just a table of numbers, which were all estimates from another team, who are passing information into your inbox. So Alex, Bo and Casey all produce feedback that's in the same format --- it's a table of numbers of the same size and shape as the inputs (because that's what it relates to). Alex, Bo and Casey take their bonuses seriously, so they're very specific about how their feedback should be interpreted. Each of them gives you their feedback table and tells you, "Look, tell the people producing this data that if they had given us inputs such that these numbers were zero, our own feedback would have been zero and we'd all make our bonus. Now, I know we shouldn't leap to conclusions and base everything off this one sample. And I know I need to make adjustments as well. If I make some changes and they make some changes each time, we'll get there after a bit of iteration." So now you have three of these feedback tables, that all relate to the same example. How should you propagate that back? The only sensible thing is to add them all up and pass them on, so that's what you do. More of these work estimates come in, and you keep passing them through your combination team and passing the feedback back down. It's kind of a hassle to keep track of all the internals though --- it's messed up your neat system. So you have a bright idea: you create a little filing system for yourself, so you can keep track of the combination and treat it just like another team member. Alex, Bo and Casey all behave with a pretty simple interface when it comes to these estimates, because the data is all nice and regular. We can specify the interface using Python 3's type-annotation syntax, so we can understand what data we're passing around a bit better. The inputs are a table, so we'll write their type as `Array2d` --- i.e., a two-dimensional array. The output will be a single number, so a float. Each worker also returns a callback, to handle the feedback about their output, and provide the feedback about their inputs. ```python def estimate_project(inputs: Array2d) -> Tuple[float, Callable[[float], Array2d]]: ... ``` It'll be helpful if we can refer to objects that follow this `estimate_projects` API in the type annotations. The type-annotations solution to this is to define a "protocol". The specifics are a bit weird, but it comes out looking like this: ```python from typing import Protocol class Estimator(Protocol): def __call__(self, inputs: Array2d) -> Tuple[float, Callable[[float], Array2d]]): ... ``` This gives us a new type, `Estimator`, that we can use to describe our worker functions. As we start combining workers, we'll be passing functions into functions --- so it'll be helpful to have some annotations to see what's going on more easily. To make our combination worker, we just need to return a function that has the same signature. Inside the addition estimator, we'll call Alex, Bo and Casey in turn, add up the output, and return it along with the callback. For notational convenience, we'll prefix the feedback for some quantity with `re_`, like it's a reply to that variable. ```python def combine_by_addition(alex: Estimator, bo: Estimator, casey: Estimator) -> Estimator: def run_addition_estimate(inputs: Array2d) -> float: a_estimate, give_a_feedback = alex(inputs) b_estimate, give_b_feedback = bo(inputs) c_estimate, give_c_feedback = casey(inputs) summed = a_estimate + b_estimate + c_estimate def handle_feedback(re_summed: float) -> Array2d: # Pass the feedback re output 'summed' to each worker, and add up their # feedbacks re input re_input = ( give_a_feedback(re_summed) + give_b_feedback(re_summed) + give_c_feedback(re_summed) ) return re_input return summed, handle_feedback return run_addition_estimate ``` We can now use our "addition" worker just like anyone else in our team. And in fact, if we learned tomorrow that "Casey" was actually a front for a vast system of combination like this... well, what of it? We'd still be passing in inputs, passing along the outputs, providing the output feedback, and making sure the input feedback gets propagated. Nothing would change. After a few iterations of corrections, the combined-by-addition "worker" you've created starts producing great results --- so good that even the vast bureaucracy around you takes notice. As well as a great bonus, you get a few new team members: Dani, Ely and Fei. You start thinking of new ways to combine them. You also make some quick changes to your addition system. Now that you have more workers, you want to make it a bit more general. ```python def combine_by_addition(workers: List[Estimator]) -> Estimator: def addition_combination(inputs: Array2d) -> float: callbacks = [] summed = 0 for worker in workers: result, callback = worker(inputs) summed += result callbacks.append(callback) def handle_feedback(re_summed: float) -> Array2d: re_input = callbacks[0](re_summed) for callback in callbacks[1:]: re_input += callback(re_summed) return re_input return summed, handle_feedback return addition_combination ``` As for new combinations, one obvious idea harks back to your original "wisdom of the crowds" inspiration. Instead of just adding up the outputs, you could average them. Easy. But how to handle the feedback? Should we just pass that along directly, like we did with the addition, or should we divide the feedback by the number of workers? It actually won't really matter: the team members all understand the feedback to mean, "Change your model slightly, so that this number becomes closer to zero. Also, give us similar feedback about inputs." If you give them feedback that's three times too big, and they make changes that pushes that number towards zero, they'll also be pushing the "real" feedback score towards zero. You can't really steer them wrong just by messing up the magnitude, so long as you do it consistently. Still, messing up the magnitude makes things messy: if you're not careful, it could easily lead to more relevant errors later. So best to handle everything consistently, and make the appropriate division. ```python def combine_by_average(workers: List[Estimator]) -> Estimator: def combination_worker_averaging(inputs: Array2d) -> float: callbacks = [] summed = 0 for worker in workers: result, callback = worker(inputs) summed += result callbacks.append(callback) average = summed / len(workers) def handle_feedback(re_average: float) -> Array2d: re_result = re_average / len(workers) re_input = callbacks[0](re_result) for callback in callbacks[1:]: re_input += callback(re_result) return re_input return average, handle_feedback return combination_worker_averaging ``` Looking at this, there's a lot of obvious duplication with the addition. We're doing the exact same thing as it, as part of the averaging process. Why don't we just make an addition worker, and only implement the averaging step? ```python def combine_by_average(workers: List[Estimator]) -> Estimator: addition_worker = combine_by_addition(workers) def combination_worker_averaging(inputs: Array2d) -> float: summed, handle_summed_feedback = addition_worker(inputs) average = summed / len(workers) def handle_feedback(re_average: float) -> Array2d: re_summed = re_average / len(workers) re_input = handle_summed_feedback(re_summed) return re_input return average, handle_feedback return combination_worker_averaging ``` If you only use each worker in one team, and you keep the team sizes fixed, the addition and averaging approaches end up performing the same. The extra division step doesn't end up mattering. This actually makes a lot of sense, considering what we realized about the feedback for the averaging: in both approaches, the workers are going to end up making similar updates, just rescaled --- and over time, they'll easily recalibrate their outputs to the scaling term, either way. Summing and averaging are sort of the same, but surely there are other ways the workers could collaborate? So you go back and read more management books, and everyone seems to be saying you should just listen to whoever speaks the loudest. None of the books say it _like that_, but if you actually followed their advice, that's pretty much what you'd end up doing. This seems really dumb, but uh... okay, let's try it? Your team really doesn't communicate by speaking, so "loudest" can't be taken too literally. Let's take it to mean selecting the highest estimate. ```python def combine_by_maximum(workers: List[Estimator]) -> Estimator: def combination_worker_maximum(inputs: Array2d) -> float: max_estimate = None handle_for_max = None for worker in workers: estimate, handle_feedback = worker(inputs) if max_estimate is None or estimate > max_estimate: max_estimate = estimate handle_for_max = handle_feedback return max_estimate, handle_for_max return combination_worker_maximum ``` You combine two workers, `Dani` and `Ely`, into a new team using this maximum-based approach, and you can almost feel your bonus slipping away as you put them into action: surely if we're always taking the maximum, our estimates are going to climb up and up, right? But to your surprise, that's not what happens. The worker who submits the high estimate is the one who gets the feedback, so they'll learn not to produce such a high estimate for that input next time. Dani and Ely aren't competing to have their outputs selected --- from their perspective, they're working completely independently. They're just trying to make adjustments so that their feedback scores get closer to zero. Is it weird that only the worker with the highest estimate gets any feedback? Shouldn't we be trying to train all of them based on what we learned from the example as well? We actually can't do that, because we don't have feedback that relates to all the outputs: we only submitted one output, so we only get feedback about that one output. The feedback represents a request for change: it tells the workers how we'd like their output to be different next time, given the same input. We don't know that about the other workers' estimates, because we didn't submit them. Your `combine_by_maximum(Dani, Ely)` team works surprisingly well, so you decide to break your usual hands-off policy, and actually look at some of the data to try to figure out what's going on, even going so far as to set up a `combine_by_average(Alex, Bo)` team for comparison. After a bit of sifting, you discover some interesting patterns, especially concerning two of the input columns. Based on the estimates and feedback, you see that if the inputs have a 1 in the column labelled "Located in California", that generally means the estimates should be higher. There's also a column labelled "Renewable Energy", and a 1 for that also leads to higher estimates, generally. But when there's a 1 for both columns, the estimates should come out a fair bit lower than you'd expect, based on the two columns individually. The `combine_by_average(Alex, Bo)` team is really struggling with this: whatever they're doing individually, it's not taking this combination factor into account --- they're both overshooting on the `California+Renewable` examples, and when there's a run of those examples, they start _undershooting_ on the examples that are just `California` or just `Renewable`. The average doesn't help. | California | Renewables | Alex | Bo | Output | Target | | ---------- | ---------- | ------- | ------ | ------ | ------ | | 0 | 0 | \$1.5m | \$0.5m | \$1m | \$1m | | 1 | 0 | \$6m | \$4m | \$5m | \$5m | | 0 | 1 | \$7m | \$9m | \$8m | \$8m | | 1 | 1 | \$11.5m | \$12.5 | \$12m | \$10m | While the averaging doesn't help, the `combine_by_maximum(Dani, Ely)` team manages to follow their individual feedbacks to an interesting "collaborative" solution. Effectively, the `max` operation allows the workers to "specialise": Dani doesn't worry about examples outside of California, and Ely doesn't worry about projects that don't concern renewables. This means Ely's weighting for "California" is really a weighting for _California in the context of renewable_. Ely doesn't need to model the effect of California by itself, because Dani covers that, so between them, they're able to produce estimates that account for the interaction effect. | California | Renewables | Dani | Ely | Output | Target | | ---------- | ---------- | ---- | ----- | ------ | ------ | | 0 | 0 | \$1m | \$1m | \$1m | \$1m | | 1 | 0 | \$5m | \$2m | \$5m | \$5m | | 0 | 1 | \$1m | \$8m | \$8m | \$8m | | 1 | 1 | \$6m | \$10m | \$10m | \$10m | It's hard to overstate the importance of this. Nobody involved went out and learned that there were relevant subsidies in California that reduced the cost of renewables projects, figured out that they were throwing off the estimates, and included an extra column for them. And later more examples will show even more subtlety: the subsidies only matter for certain years. That fact gets taken care of too, without anyone even having to notice. The `combine_by_maximum` approach can learn "not and" relationships, which is something summing and averaging the different outputs could never give you. Once you start looking for places where summing and averaging fails, you start seeing them everywhere. It will make a great TED talk some day: _non-linearities_. Previously when you thought about relationships between quantities, you were trying to decide between three options: unrelated, positively correlated and negatively correlated. This often comes down to "is this factor good, bad, or irrelevant". How much salt should someone have in their diet per day? How much sleep should you get? How long should a school day be? There are very few relationships that are linear the whole way through. It's much more common for the relationship to be linear in "normal" ranges, and then non-linear at the edges. Often there's a saturation point: you need enough sodium in your diet. If you have too little you will die. But once you have enough, excess sodium is probably slightly bad for you, up until a point where it will be extremely bad for you, and again, you will die. Almost everything is like this, because almost every relationship is indirect --- we're always looking at aggregate phenomena with a huge web of causation behind the scenes, mediating the interaction. So you'll always have these pockets of linearity, interrupted by overheads, tipping points, cut-offs at zero, saturation points, diminishing returns, synergistic amplifications, etc. So the ability to model these non-linear relationships is no small thing. And it's happening through this simple process of feedback and adjustment: with enough examples, the individual predictors are getting more right over time, and you're able to combine their predictions together to account for "not and" relationships between logical variables, and to interpret numeric variables as having different significance in different ranges. Business is good, the bonuses keep flowing, and your team expands further. As you succeed further, efficiency starts to become a factor. Instead of receiving one task at a time, you start processing the work in batches. This is helpful because there's a bit of routing overhead involved. There are also little waiting periods after they finish their work, as work is happening in parallel, and sometimes you need to wait on another input somewhere else before the next bit of work can get started. Batch processing keeps everyone busier, but it does make your routing a bit more difficult sometimes. For some of the tasks you're given, the workers will take in a whole table of numbers and give you a single number back. For other tasks, you get one number per row. For this second type of task, you think you see a useful way to do the batching --- but you want to do a quick experiment first. You need to know whether the order of the rows matter or are they really independent? ```python def with_shuffled(worker): def worker_with_shuffled(input_table): shuf_index = list(range(len(input_table))) random.shuffle(shuf_index) shuf_input = [input_table[i] for i in shuf_index] shuf_output, handle_shuffled_feedback = worker(shuf_input) # We should undo our mischief before we return the output -- we don't # know who else might be relying on the original order. # We swapped items at pairs (0, shuf_index[0]), etc -- # So we can unswap. shuf_index_reverted = [shuf_index.index(i) for i in list(range(len(input_table)))] output = [shuf_output[i] for i in shuf_index_reverted] def handle_feedback(re_output): # Our worker received the rows in a different order. We need to # align the feedback to the view of the data they received. shuf_re_output = [re_output[i] for i in shuf_index] shuf_re_input = handle_shuffled_feedback(shuf_re_output) # And unshuffle, to return. re_input = [shuf_re_input[i] for i in shuf_index_reverted] return re_input return output, handle_feedback() return worker_with_shuffled ``` You decide to grab Alex for this test, and do something just like the "combination worker" you created earlier, but this time with just one worker. You quickly determine that your trickery is making no difference: the order of rows doesn't matter in this input. So now you can handle the batched data easily. You just need to concatenate the rows to form one giant table, submit it to the worker, and split apart the results. Then you need to do the inverse with the feedback. Give it a try! ```python def with_flatten(worker): def worker_with_flatten(input_tables: List[Array2d]) -> Tuple[List[Array1d], Callable]: ... def handle_flattened_feedback(re_outputs: List[Array1d]) -> List[Array2d]: ... return re_input_tables return outputs, handle_flattened_feedback return worker_with_flatten ``` By now it's probably worth dropping the allegory: the "workers" in our story are models, which could be individual layers of a neural network, or even whole models. And the process we've been discussing is of course the backpropagation of gradients, which are used to iteratively update the weights of a model. The allegory also introduced Thinc's particular implementation strategy for backpropagation, which uses function composition. This approach lets you express neural network operations as higher-order functions. On the one hand, there are sometimes where managing the backward pass explicitly is tricky, and it's another place your code can go wrong. But the trade-off is that there's much less API surface to work with, and you can spend more time thinking about the computations that should be executed, instead of the framework that's executing them. For more about how Thinc is put together, read on to its [Concept and Design](/docs/concept). thinc-release-v9.1.1/website/docs/concept.md000066400000000000000000000334231467064331700210220ustar00rootroot00000000000000--- title: Concept and Design teaser: Thinc's conceptual model and how it works next: /docs/install --- Thinc is built on a fairly simple conceptual model that's a little bit different from other neural network libraries. On this page, we build up the library from first principles, so you can see how everything fits together. This page assumes some conceptual familiarity with [backpropagation](/docs/backprop101), but you should be able to follow along even if you're hazy on some of the details. ## The model composition problem The central problem for a neural network implementation is this: during the **forward pass**, you compute results that will later be useful during the **backward pass**. How do you keep track of this arbitrary state, while making sure that layers can be cleanly composed? Instead of starting with the problem directly, let's start with a simple and obvious approach, so that we can run into the problem more naturally. The most obvious idea is that we have some thing called a `model`, and this thing holds some parameters ("weights") and has a method to predict from some inputs to some outputs using the current weights. So far so good. But we also need a way to update the weights. The most obvious API for this is to add an `update` method, which will take a batch of inputs and a batch of correct labels, and compute the weight update. ```python class UncomposableModel: def __init__(self, W): self.W = W def predict(self, inputs): return inputs @ self.W.T def update(self, inputs, targets, learn_rate=0.001): guesses = self.predict(inputs) d_guesses = (guesses-targets) / targets.shape[0] # gradient of loss w.r.t. output # The @ is newish Python syntax for matrix multiplication d_inputs = d_guesses @ self.W dW = d_guesses.T @ inputs # gradient of parameters self.W -= learn_rate * dW # update weights return d_inputs ``` This API design works in itself, but the `update()` method only works as the outer-level API. You wouldn't be able to put another layer with the same API after this one and backpropagate through both of them. Let's look at the steps for backpropagating through two matrix multiplications: ```python def backprop_two_layers(W1, W2, inputs, targets): hiddens = inputs @ W1.T guesses = hiddens @ W2.T d_guesses = (guesses-targets) / targets.shape[0] # gradient of loss w.r.t. output dW2 = d_guesses @ hiddens.T d_hiddens = d_guesses @ W2 dW1 = d_hiddens @ inputs.T d_inputs = d_hiddens @ W1 return dW1, dW2, d_inputs ``` In order to update the first layer, we need to know the gradient with respect to its output. We can't calculate that value until we've finished the full forward pass, calculated the gradient of the loss, and then backpropagated through the second layer. This is why the `UncomposableModel` is uncomposable: the `update` method expects the input and the target to both be available. That only works for the outermost API – the same API can't work for intermediate layers. Although nobody thinks of it this way, reverse-model auto-differentiation (as supported by PyTorch, Tensorflow, etc) can be seen as a solution to this API problem. The solution is to base the API around the `predict` method, which doesn't have the same composition problem: there's no problem with writing `model3.predict(model2.predict(model1.predict(X)))`, or `model3.predict(model2.predict(X) + model1.predict(X))`, etc. We can easily build a larger model from smaller functions when we're programming the forward computations, and so that's exactly the API that reverse-mode autodifferentiation was invented to offer. The key idea behind Thinc is that it's possible to just fix the API problem directly, so that models can be composed cleanly both forwards and backwards. This results in an interestingly different developer experience: the code is far more explicit and there are very few details of the framework to consider. There's potentially more flexibility, but potentially lost performance and sometimes more opportunities to make mistakes. We don't want to suggest that Thinc's approach is uniformly better than a high-performance computational graph engine such as PyTorch or Tensorflow. It isn't. The trick is to use them together: you can use PyTorch, Tensorflow or some other library to do almost all of the actual computation, while doing almost all of your programming with a much more transparent, flexible and simpler system. Here's how it works. ## No (explicit) computational graph – just higher order functions The API design problem we're facing here is actually pretty basic. We're trying to compute two values, but before we can compute the second one, we need to pass control back to the caller, so they can use the first value to give us an extra input. The general solution to this type of problem is a **callback**, and in fact a callback is exactly what we need here. Specifically, we need to make sure our model functions return a result, and then a callback that takes a gradient of outputs, and computes the corresponding gradient of inputs. ```python def forward(X: InT) -> Tuple[OutT, Callable[[OutT], InT]]: Y: OutT = _do_whatever_computation(X) def backward(dY: OutT) -> InT: dX: InputType = _do_whatever_backprop(dY, X) return dX return Y, backward ``` To make this less abstract, here are two [layers](/docs/api-layers) following this signature. For now, we'll stick to layers that don't introduce any trainable weights, to keep things simple. ```python ### reduce_sum layer def reduce_sum(X: Floats3d) -> Tuple[Floats2d, Callable[[Floats2d], Floats3d]]: Y = X.sum(axis=1) X_shape = X.shape def backprop_reduce_sum(dY: Floats2d) -> Floats3d: dX = zeros(X_shape) dX += dY.reshape((dY.shape[0], 1, dY.shape[1])) return dX return Y, backprop_reduce_sum ``` ```python ### Relu layer def relu(inputs: Floats2d) -> Tuple[Floats2d, Callable[[Floats2d], Floats2d]]: mask = inputs >= 0 def backprop_relu(d_outputs: Floats2d) -> Floats2d: return d_outputs * mask return inputs * mask, backprop_relu ``` Notice that the `reduce_sum` layer's output is a different shape from its input. The forward pass runs from input to output, while the backward pass runs from gradient-of-output to gradient-of-input. This means that we'll always have two matching pairs: `(input_to_forward, output_of_backprop)` and `(output_of_forward, input_of_backprop)`. These pairs must match in type. If our functions obey this invariant, we'll be able to write [combinator functions](/docs/api-layers#combinators) that can wire together layers in standard ways. The most basic way we'll want to combine layers is a feed-forward relationship. We call this combinator `chain`, after the chain rule: ```python ### Chain combinator def chain(layer1, layer2): def forward_chain(X): Y, get_dX = layer1(X) Z, get_dY = layer2(Y) def backprop_chain(dZ): dY = get_dY(dZ) dX = get_dX(dY) return dX return Z, backprop_chain return forward_chain ``` We can use the `chain` combinator to build a function that runs our `reduce_sum` and `relu` layers in succession: ```python chained = chain(reduce_sum, relu) X = uniform((2, 10, 6)) # (batch_size, sequence_length, width) dZ = uniform((2, 6)) # (batch_size, width) Z, get_dX = chained(X) dX = get_dX(dZ) assert dX.shape == X.shape ``` Our `chain` combinator works easily because our layers return callbacks. The callbacks ensure that there is no distinction in API between the outermost layer and a layer that's part of a larger network. We can see this clearly by imagining the alternative, where the function expects the gradient with respect to the output along with its input: ```python ### Problem without callbacks {highlight="15-19"} def reduce_sum_no_callback(X, dY): Y = X.sum(axis=1) X_shape = X.shape dX = zeros(X_shape) dX += dY.reshape((dY.shape[0], 1, dY.shape[1])) return Y, dX def relu_no_callback(inputs, d_outputs): mask = inputs >= 0 outputs = inputs * mask d_inputs = d_outputs * mask return outputs, d_inputs def chain_no_callback(layer1, layer2): def chain_forward_no_callback(X, dZ): # How do we call layer1? We can't, because its signature expects dY # as part of its input – but we don't know dY yet! We can only # compute dY once we have Y. That's why layers must return callbacks. raise CannotBeImplementedError() ``` The `reduce_sum` and `relu` layers are easy to work with, because they don't introduce any parameters. But networks that don't have any parameters aren't very useful. So how should we handle them? We can't just say that parameters are just another type of input variable, because that's not how we want to use the network. We want the parameters of a layer to be an internal detail – **we don't want to have to pass in the parameters on each input**. Parameters need to be handled differently from input variables, because we want to specify them at different times. We'd like to specify the parameters once when we create the function, and then have them be an internal detail that doesn't affect the function's signature. The most direct approach is to introduce another layer of closures, and make the parameters and their gradients arguments to the outer layer. The gradients can then be incremented during the backward pass: ```python def Linear(W, b, dW, db): def forward_linear(X): def backward_linear(dY): dW += dY.T @ X db += dY.sum(axis=0) return dY @ W return X @ W.T + b, backward_linear return forward_linear n_batch = 128 n_in = 16 n_out = 32 W = uniform((n_out, n_in)) b = uniform((n_out,)) dW = zeros(W.shape) db = zeros(b.shape) X = uniform((n_batch, n_in)) Y_true = uniform((n_batch, n_out)) linear = Linear(W, b, dW, db) Y_out, get_dX = linear(X) # Now we could calculate a loss and backpropagate dY = (Y_out - Y_true) / Y_true.shape[0] dX = get_dX(dY) # Now we could do an optimization step like W -= 0.001 * dW b -= 0.001 * db dW.fill(0.0) db.fill(0.0) ``` While the above approach would work, handling the parameters and their gradients explicitly will quickly get unmanageable. To make things easier, we need to introduce a `Model` class, so that we can **keep track of the parameters, gradients, dimensions** and other attributes that each layer might require. The most obvious thing to do at this point would be to introduce one class per layer type, with the forward pass implemented as a method on the class. While this approach would work reasonably well, we've preferred a slightly different implementation, that relies on composition rather than inheritance. The implementation of the [`Linear` layer](/docs/api-layers#linear) provides a good example. Instead of defining a subclass of `thinc.model.Model`, the layer provides a function `Linear` that constructs a [`Model` instance](/docs/api-model), passing in the function `forward` in `thinc.layers.linear`: ```python def forward(model: Model, X: InputType, is_train: bool): ``` The function receives a `model` instance as its first argument, which provides you access to the dimensions, parameters, gradients, attributes and layers. The second argument is the input data, and the third argument is a boolean that lets layers run differently during training and prediction – an important requirement for layers like dropout and batch normalization. As well as the `forward` function, the `Model` also lets you pass in a function `init`, allowing us to support **shape inference**. ```python ### Linear {highlight="3-4"} model = Model( "linear", forward, init=init, dims={"nO": nO, "nI": nI}, params={"W": None, "b": None}, ) ``` We want to be able to define complex networks concisely, passing in **only genuine configuration** — we shouldn't have to pass in a lot of variables whose values are dictated by the rest of the network. The more redundant the configuration, the more ways the values we pass in can be invalid. In the example above, there are many different ways for the inputs to `Linear` to be invalid: the `W` and `dW` variables could be different shapes, the size of `b` could fail to match the first dimension of `W`, the second dimension of `W` could fail to match the second dimension of the input, etc. With inputs like these, there's no way we can expect functions to validate their inputs reliably, leading to unpredictable logic errors that make the calling code difficult to debug. In a network with two `Linear` layers, only one dimension is an actual hyperparameter. The input size to the first layer and the output size of the second layer are both **determined by the shape of the data**. The only choice to make is the number of "hidden units", which will determine the output size of the first layer and the input size of the second layer. So we want to be able to write something like this: ```python model = chain(Linear(nO=n_hidden), Linear()) ``` ... and have the missing dimensions **inferred later**, based on the input and output data. In order to make this work, we need to specify initialization logic for each layer we define. For example, here's the initialization logic for the `Linear` and `chain` layers: ```python ### Initialization logic from typing import Optional from thinc.api import Model, glorot_uniform_init from thinc.types import Floats2d from thinc.util import get_width def init(model: Model, X: Optional[Floats2d] = None, Y: Optional[Floats2d] = None) -> None: if X is not None: model.set_dim("nI", get_width(X)) if Y is not None: model.set_dim("nO", get_width(Y)) W = model.ops.alloc2f(model.get_dim("nO"), model.get_dim("nI")) b = model.ops.alloc1f(model.get_dim("nO")) glorot_uniform_init(model.ops, W.shape) model.set_param("W", W) model.set_param("b", b) ``` thinc-release-v9.1.1/website/docs/images/000077500000000000000000000000001467064331700203055ustar00rootroot00000000000000thinc-release-v9.1.1/website/docs/images/layer-traversal.graffle000066400000000000000000002346551467064331700247710ustar00rootroot00000000000000PKMSS]c&9 data.plist}iȖ_]U) NuW0 ʵz1 (/z?s2޾}NVʰ=Ďώ_Gn^iON "SL~~߈.KSEi`s/>Ȳ +SC'>e~UU곝-`_ie=o |vJ秆͙8S'~ЭkY63دysעk}N$t}^4Wtnn6;F 3< ݼ(7AO^ 혥yj_6_̊'8X#L&(/6j©ųIXAY)*2JXYZdwA5*xC|.rHJO[sRl:Eɮؑoh4~'buςs 4 U~jC*g>Y'QjiG^N;Ũ^kKS}@7thuk/oGJl{o vmXlhQ♌h>c r=oEV!FǹBi8-EEdk/lɡK>@oΦ8I^!KOElHQ2>l5j - bADrkW-SX W6Fnd$&| zuqw௰/o>x/r;&B֑F;jXBgzuD+줄UG{G:=Ҽ4xksӈІ[ciLmtvKCG+2xWV._$uG04R? A=SCCZ/lW]R`aN+uc:PK 8ׯ}G~f+2Ül'-ޥc{` 0"p΃Yc`Pq % OmP(+,4lj.NhB).I`;= "D (,0A"1 !2Bc*2=2I"4fcG`]a^EρbG?3 jbd`b=%W`bQx8DnT$)dz:^9(&Q'X/#JX8% O%oKb&6UKilG=Q[ Y Q+ ͓(0"cobs<Yda"D1@19VcM9FcNecB:6:y6 UIQH1ҊND&Ekl f):K !6 }l2Cq`ʫqRg5,F^( y_\G0唓(!RT%)f& )9n2WŜ!sS| p`9ՊS^6(ݸ!BPSȂ0C.d0\`oXxE%.N""ko:"KWbE]z$W-^"Rc2,QJĤg8X\lK =ɚcYP^ΰ%Eń"CWsj)'_(ULըxQR.{0,\R95ZBuoVT-M+zZPz1h6RJAj*R63繽ppg}dgb!'r+#~ֳ-峢 ^!9-POB  !"w~@ZBQ ;v( `Q 19ɰ;pGx.bGD,ierNu.k;CD~".cq`3ډl%&^*x:(K L⇍9dd )vdUIe\hVM _A]%ڮ̈`c00C oH9a"ޕ^Ν% <$ C{b-PsF9 ^k\J& *:xS*loyv+BE#pv\_+>pbaK󞓰xAAXу`:z Ʀ?J 437)%rΛf>fӽ At6eE~hDQZMˍ;{8vxyc}7 {W}l/skZcܨ;y7F;{ݼ/PImfi.Ҍ__ ֜kBNOl{]_K?|U7B<}X&9! LjԢ&хiM0B{:CO_x.L~5w~0s ,?woy>7IB?jdn9W.=~ 7䷹ &8*u :pV{/q?J_L?o{::cȘ1q5&i 5"~ۈAO|X?x|D7WFď>&~߲IL緈<߷I-"EQ {B?^{t{Pi>{t{B?nW;Nt8Jo&x۬f̭5vмM孋?XY`>¡~px&~AO\ O Y U1Fd'Bf!C T#~jd 0[W2&"  MXHuC$Y\j BgH1^UkFB#u%X" @"}^$>Cʑ@X\5DV"Te(Pia 8 iP'"6oɡN/mG=8U[j~w{^miLcAr_)Rtu U )(D"ȶߑhoUV6gVz\9yob86P>*Y.y.~U4*Oj!~ Hs'/-H W]=BBΐmeL@mՠÒs+MLS \3x~Zڰъw}`ͽȉwEYq45:753d[Rhp>iFjīOUJq-W1i2>tӟp65'upur8\k i%hUv,z]睎V`}Mɒ%n*x<\@.Rr]}'4+ZŲj!/_oZA WܬװǑr_a # )X0R&g q(gObwg9m]R"#`ϐ,-,z v o+:p ݛF djlȊ̊]Ԧ{,Em؏*Ǟ!߫{[;+dZy[Hl=k "tefH*kRuTڢɵrw])+$n#QrF(v^|NkcF5C[=0Dqd =l hX"V&_h:&xs =|f"؉YPV#@h:D$,`(9h#@$1" Mh܀*-=J#G@GFEZ6&^`G$Hb\Fm"2>pCl16 9=w#Q % !qכ Eқ_^8,=/D (A  \#b0`b30ԉ[8%R=trxĀ؍a8D.*(+1(+ydx--Q[S9LmRNEcBŵ 5twhm]$lSfc*{z M]t ՙXt lюlLf$WձN~٣@M򎋐(Pi $(PrI^!%PI_(UW]L( RQL'@VQPD;CQBu {jʮGϢIRpyz6ai;W( (C{93Nl 9E+Š1Vkzv ޞ!1+ rvl 1w1!pM09!GDfNƔz 3lFPY,Y^&8yM;+gmlFJ[B[wE쾬y-''0OWUFfC㼕'[v| _A'i+w:CNd1hJ.H<,#,ܗI"ֺB-tµ݄_\Z!POptf"gGSQ.b%nO  ~na 4)J2{˚r/X8BX(6reXN2{qv8ŃC,Ba*N0@seIU8\RdcK0ş8YiSjuf%'[SŒW=Zgl€D#9.JhdB(#*>VDCR(R\cūD)%e4p*ZUH_Q۩@f4|o\2TcTSvvP-IݫSmA`8 k;rhXsxCS=.yak}y}Z&O5ӳc0B:"]zp)S!OG=5B2ҼaY62̦)R.͑ښMK/-+ړ0 SԚRl;.Z7ebNu0 wV>׾"B/yl '=1գpNcLu'5YPSqBgG`ǒQFc'lOYaw$XP7vjӞIP =)0bfaPLC: }zfm!r^)n";n,ּRT֎b\n,K!KT V Am7O;4 =U\ܱ%e H3Cu'3D;S7tMgޕݖn3S{r+]/.ֳ+r?C/c\Ԯ7/^9+4ܼ(f|/q'sE.,cX9x{*F!+h1g}=g?p)e!˃q06VU5W0*DЫL*8* X,vgȚ>V2[A}eQZl>m[i>t(>T0$,iLz^ aTaF?D[#XfooUG%$ eQ0M:҂h =2rChPcm:,bzh~ʤ}"?ݲq#h '>0OӉ,)!CA6x( Ҟd~7c_1}n;mQ?<iWL .q58pikFuu+x&Bg}YHDZ="} \bv^ @ÎHNJj@`%by6sLN0]ǿ&-奕}?Ai M/^6-zWTރhˏw)@7%od~+{nLҊv)$]Va/o73/ufcu$ִiDs7oA -4 筿<qifV~) I+ݸ~|S-"oxz0!P&ݺ*1& կG"۳|+"H=;ԸZ_sKxNTf53vU^p-ޛS7v5]g옊 u!䓯|1 S(;kjF0=䴴ГYk:Eqj]3bV.[!+!|&w;I3gijop&/|W7Rd5mqg yWPyx]Z?;}')8beNjYpeR$V"^W4:n |540=OU8cG3^KSdJC5GUZ'HcWЫXo;l8GeǦn 3"m: zUN$Cm/#1<ܴϫmř5obS;FȼFmBʒ>G(3Ҳ>]Cf\ܒ))*l%mYt.QKN<cVVf2Ev@ S|CtWL t:̫vus>.Z$n~IiG6\+-\Ma)Iۻ8P 4pfn7?yUle_ퟔO8v RdR:_hAG*68,t8f ahm /_@\c:WomU_q'kWoϛUo67nwr7WMm<-m~꩓N28os7=~=~{o:3q2;rk{x.ޱ^nvnZylvu~׼}U]s^s~w:[0NzgW"nx898zhNFZRD,|ۻӿIO}o}WR:Fmj[ ~@9@ P4` ,K /h.@e@5P4=0x@`V'A$ r# $ rqxC hH"$y)4A^Cz!)g:dJBE#DF!944inܦy@M󜦊 $M(e@@GPc% FAbh-.Cii9iEhhUiiMimhЦVѶNbi)tttt*tt|r*<1K{g7a0?L3Yü`ᰇ0 6#003 t,B b*ƌ702018ęԙ193bzT+33^̧0`dbfrE7KKK#(WVV^qX[X?8٤ llilUl}lpF\ ~ ~ /k[df0p(xͱ k.]nղkʹSӆ3 g=83W4W;.,.nn3n?4WܓX*@UGp=Y{!k7doޏg}XQhh1GG޿('n ~SPd8HA?DsH㡴C=4JN%z%$JIfKKHiIHJMIH^I鐡V<|㲻dOȆʮKgוG$F9#JJJJE/+?R>uH̑ΣtGE?R*Z&fDmF}zeLI529OV3WsA렖scy<xz\xw:tLuRu>u-)5'<3P>xՐaC'=N0g)Sƀ=&&MNӟ69vz와3g9Ϣş;v.ܸSof3gf['˜~AgGc㲓SY9y%υzj+eחn\Z݅{I\ 6y]zuG'gxyOh||8oycͧ6{nLjfA5oo1r6pHbFyhmg =‡#T#2q.R>a$%6+ptr4)&+V6A,5>]R|]nw 7gݫ/r?F*uBrF Sw䃓j>:v,G[mkgeDgd:edeUeNΡəb鑧rrsynyg[)?{V X_HS]KgD^xX*\:TfX\~BQ%geTFڱzƢ剗͵uuy{^qo`j@l6^k\nrhiF5oh=Ͱ]CөYZˮ#]oTu+vWU|[N]UrOk{z}M  20<9b;8zu73F@!#O'NL*M:>=}vz|fˬ,i<|b٢bg\B\_Xyz`bMs{;QcPh4w#;; D_|\K1|R׬=Ph:d= r&_/ k=Z_/M r?| SA8 kV(@#/w󴗗u,}RvwTb6JnboM/|aაmWt+MFvB4( @ &@ia L  т r#Ey:ܭ,}JbEx02 ?p𐂢*ut N=gjfB9[;{G'gO/o_7CoG܉Jw?)9'OsWTVU׼mnimk|?084<2:65=3;7y ucEW¾v-Y]Za9b:UĸO G/”jh_S,b5h44(CBF@101Ҙwc}k pZZZw7GmS(t&(ȤO%(O7'( J} e',(4M}|ҧy |_ b !h2㧊Χ H;Nލ"A:TStK1O!?M9X%ϡ];>OiEnsEca&T`cTNfMgG6-ΈjBTVj<XR٩@y w2PSPEż %b})HRI&|OyB\ Ex?:Fb@oHGYT in?n?n?n?n?nvD7@^{ 0meaTZx=@<%'Y_Ji6[]<,pB8e6?}iT]N*>M3ZmTo z,;eV.-x[o:soSX/y`7ch瞑cڿ\"\/k-`u!|?p+2`>S Z6 < OVaNh<;~w=FiݨMz1O #? %-C+~nHНȪa=laY ɇb,L“">`| `L"xdEq+hD{OeϾ̣%xw4GJCuݟgo$HƟOc[0#Ө\ZA/hEa͝<. TzGOp:4Q /ly&>הܾm{']{^8)$Xtxt_EOVuGdNH}a z"7uZq/P]BǔK<w'݀l8}(;TDxJ!⊗bHQՠ͵b0ъ,,)ig)w4&KmI;W~{!9Q.f.4z)w6L͌PU^[X[}rOy|ʤ,Na\98g@4B9hJYL1qj-r]׺dBV1&=,hWG΀ H^!d3gQN%f]_,:(@qy3u\ēo|n),ZDFD}EʴVU5 '#+3LYh Mm>B-h#Zenҧi[Z2QR+Ms?[` W'ɒo|n f> Z#HskG~mV?2`wSS̀q˱Uۯ);]4wW'D Jf( N=1XB-җX&Mԁԡ'esPU(_|#oAIaNۢ0fl'?ޗ (gC7}~{Ä@O"[?cvhw0  23KauL fC%;,% =_>?|>X4ovTKK{ElBv5{F:Hè`"4`r!('3CQ_(]*9.Z~YuI{5F8絝Ezu=6`wG9=5n~|CSZc35B<+DY luXenId|UVi};tt\> 2MWѫ ^u0%Boz2OHϿr+ГO B~0IEhJr$ɐ vP2@%EM!Z*ыm%kncFt`zxcI/,Ӏ"g"nM}Un{uj%>.hX4=3Akh~m\f |s\n0 l) FnYΌϽI7r;pF[V6권Ƞ8b@PiEǥ!%dpeRXDe\)'䫸xKWE]˾'*b*j ;q_l4It(g;U zuԽʿضKE^FC"БZѯ3r9M`6j1 (avh ;߮S[꒷ȱ/&l4i-uΝp*}Y='k׏Hȗ]l:1ΑA}7#**kaAo{vLM~:4g0V$Z\^lUii'|uu/˾h,XN8T?3 6zHU0͍u'б YŎvO!#O/sA|%ltF P V;?oܳ/Nawc}9"bԝF2~ڦ 9T)CwwENz cH9x|CoTqt{(ᅅŀ= /1 Dؽ25 \^Wأq5ClZoV /;TL"8֎>$q(>rػEr\0ڥ7+5@^ũ()<.SVS(o!3$ |̍ =t EM?4hS&4=Zș>"e[(D &23VoP m\!^Rz]+᳂GJ>t} MT6Ɖ^t3p˩r)Џ +e͋^H>-Z2l/"7JZWH []6M4,"cQ)2%Nۗgׄjo ?z>$Vt|*qs5?7-|/]@&*ST/c'(L׉6$63XYF_ PH焚$i v3MK7Б($gaE,oQh\<"IYhˎ],zrw+h SF⚙rXA:L jpo&+UBӁǥ|'eEiخs*)k}dgwZNA#T"ew ]Vkٞ65,#bM9'ɊЍuL Nuƾ`Ռ2+ynn18qT`*%Ohb.xF ̎]#q[086XR{]IR*.ť?cg]~ྟ] H t%Ij=վM_nҐ [\6ƞeHkGrغ2M`C`Vi 4sICMU_}auUʽk 5u#I 8"PǏVzE]ۧORUKRJŹ> l-uk6KdLƐ9F @yWz_dM8(a5a"%@3*LиgG7ަ.wtUg;QlּMca&|f(qv'cTAO mH׻漅t϶p](SbXZ&ռ LI'e T, A4+Ã^A vKV9w>2/L4S1 ׫) Jnkޓ6 0O#zf-suJ#T&q(^<;h S=3 wCSЎ6'J2K6lǔ7;*EP/6>5 ^~ܭ|S5):4`NNU]O=j&a>fy71z[Ai}Tpoj2&,b0z lkJ7 mL'49 afA %:~y19kVV I۵-iIoNu0od\r"'|St}'`r3AqWp02j1.=PXe=:Rq;AMP^MaI%~_Ph8V,OO5ȏ{ U7c"j{#5 NSڭcabneS&>xA; EM`uAˤ87(,%՘JM"g'T[h(@{Z[%Qfyzo:g=#/Ž+֝9%/Z:7tUL?Jw#q 4(ʝEɠ`{̭@˝@sŘoEK9.,9B50k#-xo0Oʃ2K"NP%AG "). KÉSZQ*P Pp3a/hp(uG 3Et 9ǟ$ׁ e9-[$]qpbgZ\sNmoӿrGll|m[B7r+'Vk:p6?x=+*p^%&J2tV@GO%P;bL3Ķ*6 /V; "T?RIAR 'wSn)=fAH: gd#7$(_J< n%9ݬL=sC{[~ )LPЭ(^ĜzCwܬ̬,HrAEʄZQIXA CF&|9 htDXJ_p|3 ΛO,_qۤ3TTKX5<UI&<3U[\Vǟ xY_sd,'b2"ӡZ/≲q9_$7ICh$bWnHg9ZO\Ա.ҒR$WәDD=?oչ7oDzEt p`$8I jggc[ \>Ħ(sf&?'n5GJGde;hA;~Ʒe3 $zoɂf_T1b5lXTbפc"mΈѤ;$E K 94.G+ϒva R&$Aa?j*ɽ-9N='kLx{ _9<q׶@z wxe],eÝI4tBT.=٫vn7o)KgfOpY؆5p/gMkY Owܨ^*b:fau>e-2d=MQvzo<_/W-X$ ^-=lLCh9p᫤3(vc}tCG6zиF"e[E$+!۱UE"|rw=rh>)G/GRB_v_=] ڟs&D⁠1Ws[{e۷ t]BCrE):9exHʯ{ᝐs$pН")`F+cF)hìv\M]EoW> u1 u6>ʹQ"$]Ǝ@5$ݾ[#x-Sm*U9ovxԁ>@@XH|FK$}Qt,ނ d嵣 By`28L:d9z'k8$r+̪!OWH46Q@⌘]!(<%*%# K)fwV]_Xj7gB(B9ܯ>fdf(!-Ay7у̪jL  P(bQurJcص&CTHU*@{F\J؇ft9*srIZ4<FFB%`y*jO}U,LzqkD!QPoQ9Ll0xOW#YN .՟p/|y=up Z AP#DNPs՝*2 v&yֳjVVTْwl+n-m䷷ 3W}*}Csf&آ сLO%I ³$<$_BQsOmc1Ҡz)4OSPWkSΊUw"$_\&X%Џ'}y|f~cIH R:K;N=&"X2]B3 ϸlڕKN #lM5#ˣXL"2-Y󪦦Udk 3ƦN qG8159*d9) 9Xץq0K_(BӮm&fӱxK2fEa:CطλT\9o=c%x',z4it`UuY6W2o'C16·wZ\7sAH>(NӲrine䫢eWig+Ȝ 7ɀ`]b#6J&YG} a_PPJڭg_M (l7 ޽\0WN@H#:w-2Xg{^oe[N`w/Aw"T Y&OԽ~O͛`f$$$NM}ݷA3&Q4  Ff18FKe ++R<_.,$1ՒԤ%(; ϖ3+lk=b}u Q+a(A~Aqjު,<;ƹȃܫP7 2;CG3yIW^<qUcr~F/U*̷P2k-E'\4A*.V`r 7,?kyGPw odu>HEBRd#Ћ%qzD${G#Hz7=)ćRgug5K rM_ @'f,S ǒKa nt~* ![L?=))ʮ/M|ylnt(=+sKL)7lX<,w 3!Je钕"!Q;+ ZQ|rS3r\pS՘vLGPW 5vPMkPd! }̻6}Q{( [77]H!"1\A貅UᯭhzeO=_z>?:eLGb )G5amaʭO`MCz<\^Bx?PA-̎ޜ2̡mѽ19 a\P;0?(GҰWRL0*EyRħTD,wBܟ y|}R.!Xy~ğ^M!~ˁ8h\rj"4+vz3MY/Dբk=#o( `8@"Q'F?m)R%c9cJf#DRQ]j93XE\Sކ!9q4Csӎ;bN*cMꓤ7> Aa'ZhA<}y7IC@7 \hM) JČ(L~6LY _vmsK$)pu a6ذ *z[:PV\k LlX_ rp("Zj3 ȼȩ2^cÒ2\?H&y/IH/|$Ɍ9EFr[柳~觉3m96:z `EUQG.RCI=upy#yЎdk'vp,.nJlT.>9Bo56RAy |5."GJT*܋~JrOW5C^(qI:B P>bJD_$.Q-pQ^nhNBw +0DyDyfbߧVNa7!V%G$OB=e̤qU "@׺_D[P#d7|PPt܌ao3mv.s+61Zj2;))7/~{P8)"d;PY/{J^?w%lּ>⧂f|" +J,3C5[ų 'Z\wy`˨@!l!гz Cp| 6 tiqS,`J-;^ p+!]ʘ"?jb(I)ͦN<9J%z9h`G&9y>c$ldb>7EsNU1uhX"JS.˗DzI 'UP%\,(t$ZHۿA e #l$ \ՆVGD!gE YD']%|v:=C.-=oEJ8h-%2B!שT 8ћR'sKЪaf߽6ƺ2jNDOHӱFB',Ϗ/]9Es풞;ǨnѐS/Z儒i/̽ӓ[=gkרl=}uPD<;R*k\=>l$)N$߁Wwl3}gj{68mz'I tnS. Oy 9G:?@8#IKBuf]zझ:kǾYfD%8--mNS3F~3/ě$9 >tA՚mO*W@ˎ4^ R ۧ^AЛ &1-&"洝[Fg| V poۜi*EZI.X=>öI:(RaWvDYҝ_Ҷ6bNaJ0#u>j7 uv=sxN|+$_o'Dr .Tv{`ц:DO_#9g7\ֵh2QnH !jXru{%hBY Ax]g CCXΙ TݑR%az%xjq*!.]f8ܫ_yMhq Rk7קs1nM=%wVf %bӕk1T hC)YYrPQ̯eRNk1I&DH- :T_;,*|^FQ{I:w@d)1dI^ޢ쁅x(3~PN"HMsWHMמX+5r9fиq-łt̀Zh, sN|mLY)mCÃ,q?@Ϡ/Q#r,mJf|rgXחiƸoQk / Ry 14D'xG1-kmI#(t{:hbY 'ּgζW\xQE7%?o eTw :77JL38aǙDJ |\j)-߶ 7)M۝xt^;Ժ(ޚvÍ@0.y/ [/dv wL|S>RO﹍VGz>ų>PGeFRذ`i3?!fljeUlpW. (TVV&[J}W/.Zj_Fwhؽ.z!)5 |`fpҝbAzCo)!{>gKXB!@Upvo#dـb;?/KPsMK1J1IG0 ܱ"D+;o~ ?B6zS_ fZ}2h{uA Ɩc-u1,UpL軗_ (9CLt2 -Xy$pEbigd®ʫS7#lè`|,T7\87cs6r+!k"_x _+Z#__›"{LŅ7#f^NX4uI{?I "FP2Hp0$ǤIV@56flsFɢaaOK')}IC}%eAG} 8'% g]z+;I~JN/Kizt`3;aT=Z 64|-cScx-vIYBn[$;p)2,`1%,m-iQ1̸8=d2Ȗ3GQD:|{d;;5:Yi*?j mp?H \.ϋ*uwOwFM~"ti\nxTr7tHuMy]a߈.ShQ'oq32xr4f&wIg+,\3ӌW>WJo, H>XrcQ`= !s)aqhBDdvg!n0ڈ )ce#O4:Ξ7o~ԟg%9:3|!2n엒WܞL%*Ns^82OzK +RJ?h|NKkcZ|arxSDyWv3cc%x@4'TEⅢ+uw}It.^1A^;&+F#d19ݙ s\=Cy ELf'qn'D2iq-zq)eίU ?R+j٪KJ͟@>uMˮ95Gmձ:JI5a?HEw'D^ӗ՘ĝYJood/̔iH'TvvDeGEƄObp%A)>GO T 0|?cM|!Ӯ{b/wA/(\ v~K> *߄]qPs4^(qȋgΧfj{ᨴCtf4EA- IU|[)U3F}i$ށwȃ- 쟕fT&4N)d~yd7%) Ӽ @puUtCBmWi\[hF,F,ÙiVwǨs=cV6:0|y lu20Qϙsj7ْs?z"xX>)wC͖YV[M.teǮծAfRL|s:j^q"_^p'%ŐY*@+p3dnMT}7SG~l҈9 ooVM~ z=y~@!47BF,ħӖ :avTHbE̲_"xݔ!u7tʎ -Rp&bN3EPϸBd\7ԀCyPCE uKF(T#*Pasx4 "c-N#{t?gD Yyu"ҙ٢`m.IL1{=ģp|f8!t[Ɉ2lҪID}sL3}fUzDw5[6JuwPWh!aell DOH gtgLzl!'1*.jƎ5I?~>>0/!B+ӳCdC iCV%2:7u=\eIJnI՗CRce1^jwT[f_./^݀ݓI[O f؏_=[dũ>1Vu I6A89J9Ѥti"x#$8Q9*28%kIRbۃccVuefX%:?_~D\ 1N}>&lcV7qO<~Veـh=Av$-!2]Ү(yIU%>4WF:PxCDi Ag_+C%g}7UT:v%[ӷC/xRДTb1!%e}| 'եnևiĴv )yEz9EQUU+}Bvyy7'Z)x`U%MH@ xd8#^ p+d>L{A:i#ET` D|@LI h=b!qXwEtO"s6 ^i/|,pm\9_ۄln`ev d^?flm"ӡY*}>!UI٫muO\(?~IylDhǒ5w$w[ =r"f1E举cs߼apHx/Z+ze.hEJ;K3%ƕme3n#շuiHAbO;~ƥyqA\+ ) /#!)@.B6{-5= =|(`m@?oR~e.DAMJ^XX[=7q WYvA{hjK1'aA߷]9ߵ5.qXI=DE(k` Z{1 psxbW\=0AϮw::?&; !ٴvjɥCKS>yVIAǺ?7RwNmx2f.?됯pa* m~ԺƈWq_ B!˩ʣal|J*!w|A>.Vg*p:}M4öʩ@/[@xd)x2!sgPH*@v$3, '*bkI%0V M@8HOrC ( 6SwSzrTBfkf? `y>_iI_?V,&.7 iEBp{ o;HL4h\/h/h/h4o' &"MԴeq<&ʍ~A MfFh-Br P!%I}b-RQ' [ε<Ώ%S/ͨ8hw609XE ]P:]F򩎯m2q ;/EN"7&yh|F ?@I/{P"c&dyI^*-dhm _ͩdW]10K:ToKK-ɿ_=fhvQad[8XT:J¯G:a6&a1 &2P`0 =Kv=M$>J, _E9ʊOڙej8B0l|DNcWВ Gu fĈhZj ճ9 *qФ]ȐAWʮVh,xp37#y] @>EX ڝ,P9Sl@欌阒Q;tUrİ=E/^DVBaJĕ'fTG1o bd\e㗓kO@^"b鬝oW`;+i:v#KOV}C(+'/Y ""$S^9tp q ZYx/s|j"YPڇݰ\[Շ*x\gLuJU:{ƎV~Keh%EÑ{cRz-fڋ؎EJ1L$jƵd &I 9Dhzԯ}1$b,EхD>.{@oU Ӗ8m% .h޸Uōe Ѯ1L#3@?T#(gIBI E5kxr}n,ꜷ^c&B4LwJQa^+ecezO|HtXFaGsU-Re㭪y}TK )'Wūt*@7*|,)-Jw4Xz :0 r0ԾRM)@l!FjtLUs̜+|-v%Cߘ,0KS.B*I=Nb6^n_1v h 04q2zw][!=AʖKK HN;[8qAH "ɛ;iq. [+GqIwSد=7i:by|d-߅ $58؛cq |Uêl^VgX7j\5$Y-\:BD@S  K[0`qS@%kRal5aHyoP7qMCrݴ['3w4%a*A 'c ̆ W4wg}F1#!&6K1L\ɾ3p(0+oz kBü&L׬ fF OUE'P*]/xijd<5u,ZxBќ-%7L(s K Κ3)I TN5)/}{JѶAgbٰt<iI ϕpR*}A{1Nc.D->/y?I:A[@X;S6̀z`DYibOL!ȒDwq{h6A3dsv<,kQv5555q>FN1\Kb{:\k8g3SV>0T{kSEEYoy*Jñxnрo\8^*tZC5z#׼3t&xo&Wvp=b, ")nqmXNYxoJ ҩOߏIw0:Kf^aָ:˔ݾ7rlb3{}wImlEj>+~E2-tE-j ⲇfa랯<￐:pge7nI!WJP~ɡ|_9S])C7aph_3 q¾XK.^(p>R qnE4 ZHRI}]#Y?=#`{1xwc[w2[ 4aEľ=<`cyUwB3[5_Ha> ͔  HC,3Dْ_ |k(^3 )hG"^Ԙ\j 3Mnpke":8ћ+ك@`nQoW-H$[@p)S 7βJ)P&]~)WBIK֙Nwڧ(?kqiGg,#W;6@f y#@HӸ1THPweXO?Y0[ 6Q2s#dFLDbZy2Ո N#b9uZTCɊxʨ29b$vWqKUfqPk6`V"_ o T@>T]~Eu@  lN >z'gtPx"0:L@ly@avk ڢ6Bt}_iB2a7S8ڒ/AKP|J sX*t|gqS2&}GP&ߠFb2[!6E*0 0PҁčXC9L@ ٬`8v-[3R𲂡=`&Eq3-\ p)o 3on\Zw؝uN5h_|\xT`@9b,bfJ} zN, CSmޅM^aTܕ&J=AVz7pS" ZbSa[!)~ZR5%:s0M65جXV֢@2Xz?sw{ $=8gDF58Wٚ_>C; e%O #q[cD4܆ ad1J 3؀lgfUL,$Vo]LxIrk yKJ'{Il1SIsv!iJn0Iɔ^tAv*"ɯNߚ$Kip> ݮ/0;9W( fQISCIaCu αb,ǝ Ias [7`*pAHkGNS! cT ]x 8gajQ5#Ur-e/)}@?l$ hSecW%R.%rw9xxD-Zf(ؖ+FL `M^1N>H :U\__LK[kclo,6ETD'2Y-T`*d\Q|VTb=p[NO$?.pp"+]LU{<&sdӽKke zuO>~,|_sPp}Hk+JZޓPO֙]cr+@%̷SCI|&k gW3fS404#>CO#O0|_YKg8J\g ,2.]sNcQlܳT S3 P8? xlC*Avjľ &~)4$B6H1kq3d @/pF-6{C *G;;pq}3Ul6 &/ҌVy;4I{:ЕPulIzL7$9۲ ,) \)U%8N3co˺V?ibGA[sB3E}T8ʵI3E>_o0f;S Y>m%;Y1{ޱ^[F{mFKokH` xhx  $@h ww&7h}?"̫&^ `[:sO#R++##iSDR#VY#Q*B@/rSL_m){k0lBi6a0,۪~)i?oM*"Kt&pt P+u䓸'F-5wOiMxtCk%H6&؍l!0kbj`wWi+FڏJ/Qbk{w({؊y MsQ;Ӧya;̯m9TiVl$ 4z W7:K/vJ{^Ԍs #.ҭPg.o냳OaꍹU/lwxw2olKv$1ZX$ӗ7eeYWe;Iu>k9Abr{G0_->6Ot6p3 }Ir{E_Bhz*Śšʎ:ucj-LTSj2^Nv(a~"i8V(pd^.*ٷsuNG+(olf\aT 4qx pvIwˎ ۛ90X\hg_ f6i#]~9{=mGLk@!\,MT蕅$d,Tx\5M `(?z\@Gn6lD(zs|M4$] Z|]BCEeDڪjWi4,_mypL̗?gRpe!_+}3ۨy 25nhLiz;)QWϏWFv Diiⲳt:3bĝP[N@gMl5R2,<w%G}ՌFoL55N:2?%$am#;HNjNlOaދ=a;r)X0S`INCSIĂ Z!H|U%{ yAZx3 bA+vs~EEi7 }`v{X<Gn[l:@vO|PN٫ğIt}/t0d{i{w̲7fm s{ ${hr`1di䄖Xg҆KC17r|ݟn?X" ҾԨnGl}Z0XpO3ww/%cǛ YUʽ42tKݭ>S.n3\Dj\iHm'똑wQqTƇATzK s6|-HHKqxfqBAL}K۩W˙WOTf&{7ƈy1(|CcR'ۭ҆N.70,I8,ZVVJ95#kX憭]1.wR&c%<~W'm~J@=[W:Z}`DO;ް+tڄX@&W)V YӈuGA2 oKEoY![kڔ%͍/;(K9عx\bs, aBNMq5)=4, T!Y%i- \羔.o=aSnR/̤Ϩ9fa`3@@heS_ 15).`FSD_5_{F:Tá(Nr5*t6|@0%5-_:2ݛg[l}_6yokY?{A^ȟS *f(C_#Z$n2cM^'13ZWNOx'~#skbpo׮>OkrJ\$M$u%-?Rl3hPF#=8pX<]yzUjbu]oioܶ8o?tFPPJb1x(C_@A8sI%X[6 oQP|J64~C, FlI2ײƭ9 .D:YDcd U! f0sO@# FnK851jDE*>OC2%XUz{[eݰZҕ%#?ֆ>HN7JQﯾ>qΰbjd֥S7jO! Ah&/]Ʉ!33#bv=[&t'ӿ$ jSZ}tMFLk"[` l3X{uL@DZj1DW{fخ' @,* FPFRTШ{l54/@lLa^NwG.,LtO8t]byAhh.:M>$jFpM}^VV;6tQcMc&=~ݒH+ɳZL=p爵ˇ)\z?奨@){Cx>חM!D5g?w-ޥpG^U3G (I?7{l?^#`3IT ϻp – ɐ)6/S673öUcϢ+c"w/ Fc(o׏|S{VsVN01K;E9t#i1C-/4\65)G xȆDžξ+r$K $v䬋< '7N]x 5(刱8,$W[') 6OL:ӛ`l() W$X\RLê9o6OPʭ2u#Sbs#ZA T RmUA': dr3ʒ';,;X!rtP26-Y۔Zh9`k'_2^]-Z!#Zj*Xut~ u1<髞3J̈X!D2UgBGMң<@|Zw)3z3w#vY|M:nQ_8R=.{9RᷚiT[[1dW{q=9S;y)B~M85 t"ܶd< sKr"R٤3 q#'LxCY~wr%hEX& }Pߙ0+v*DKç@Xz.5As>viV_lDthApO`9<pfa1PARr> ''/Ѣnvx52ω˅ݥ"._L8l]8Q'd fс'C+=]ZRx<8uӁ:P юo hM+;k_쪪4u면}nǔS~x-5q[2OY?4v @x՝\fSȦ [nb$IZqza:@\T(7gShdz% Ҝ}VmqA&H ?Xnܚ'$uTNXSHH߿Hhx*&?vW}̬(9nP8B4 ,YV;IsG<wQ9R{׮vtMM7pql58]ۨ:)6ӆnO @6#dr\8=bL3,ɕenAO'Qwo<^.Kgvg?FGf iM f޾eyO3[RF?Mvyb/زHk<3uo]E.mlV*˼=j%\8ԛewp&11^DpGֽ0V!ah6aF#g/@tUK9~eߜîO $43ەvƛcYXNIJu?=g ̰A|TT(bK aZ-~yJ6=jij)7,lM9\Mioup^_9#S`8cgADMk7$W _w"%NCX_\)R/@^^C&P@3**D ϙ\il$ਫ{~c(/S3a\u 9PK >92{` |H~C{IxYͶjWjn:|;Իؠ҈?y-;QKTO:~,|Q_p @Y Vt<<{ukltX~8̤*PgP2aȂH!6,Ն>hLj'.Oѥ߶_ot%CoP˓{"L%If73N'1"$(n⧑O2j0O/q-^R#IB \DkDuGOZrZkE̓(۲Fo[A\*EssqT&B6B Y^k#{޻SY>w( cωzB>PN*SQv` f(ݱ'x6D5Ѽ>MLgݿg@cSCjdXj ,OV.V8@I)VXm{ 쟹P(qf~>|;}>e)/8iTeWAjC_?h/?H&Oܞ`I1⬥9;MLi/sNK?16G= (LN qhS s=QڨZ&-e8qmrIR+CE*z͘YˉwC\O얅ǭl/Nݴ޾|i|碰M|ͅ#Dz9ӀyX;ZP$LI8UY tXN}ގi㭟GijknO1p3s-Aƾ D4#1U-z{2EYð/ILqc//K)L ؈פd#GG|^U)Urﯝq*g&7I8M2/| $,VJދ❇Oʝ(slpF e_,O=c[_cNݖoLf-иJa2C׏^\YAܯ_>3} GcHbdܻ3B :',T?FBɟ(q;-qD֒W=e}?#PdKOq}1 *4>'C.XucÿLv>2L$\34m=e=Ԛ{f}ouqX&h{gF94m-~U1!cAe|41iq`#ŰLBf걊 I FcIl&:AmHWrL|Bl؇2Ѹi*ԕbB%efw~ueh~3MCyB ԎneT|:%(D4,A]kNLD#yE4 F^\Yx(Ě+ͅŤ.wܧD3HcC߭+04k@AА1>8~@콺w ; ]5dON1 Iy3z}xS ck#E>B'dt/hZE!c LzG -Zp)ÿLO߁"t-u _:oʣ J'zFrJVrVpfD$N0D2ٍgzjinI*Fܐ8Nk N5GWOGИzFT&8BN(4mC{2nq0u$f &ѣI\u,PA"h> Gt2r\Z爁7O۬4壙/+,.䧉Va(Lz ? Swh *p gS}jKES놮|EAY___-D>^e+oW՘O3{y"*_gXS].(%*(HPTJDDň (&"6QQQ Ho"RI %,Ir{~|wg̏$+kα1=F Sq˰һ҄ Ӭѡq\(g\ _OH&/tju?EK>v] xCArҼC4=ďF^(.*10xʧZ̴XZ{B40aeٞ'%->[ƴJZ\$ݰOͤg8а(>huW팻 c3we8YLIz s_0l9@zj2IWiܝ]yjX  nC/=a𳮝q3J}0-6rKvݳu{azˆY)_ DJFKbJbbal|DyR݃>6';W7b#Ͼ$efĽoeW K;(NE-ry , n|gzc}S=ݹܾy>w\`׷J'Ͼ]'TP-Qóbm<ՃU4"k+FdQuV\T奅~}D/Wer'k f+=rn;|,헌ֽ֞[!>i[Pҽhk WYI;´dg ҠhDlS>滭GK_Lqպ5|4-,Ź|46x6,´gdŠYoH3 *{nu7n뉤'ߜ!gĖtEM#Ux3tZ8޼A{m^VS 2.M 'Ѱ5/m$=QS1 fEdl5@ `;u*<}21 =q?k@sߒUf3g3޲"ρa|t2ؽ--";x~'&A!E$^ua/Y1}ax}b[cBAڨSQ ;d*)Xwo~{+pK 1za֓lZ_-MVnC8ATiǵحE1jynY: Lu{zğY^/רXr мs,4}tLE7'[kggz8s1 m |s_6"u|t(po=0dnbR֫??4Sk=Nr](޿0vA4Hd8Aw4R,Gt{ةe{嵅9Dž(w}\DƷ+ۅ%6U ⪴=,-H4M 8hY2aS얨Q jxE.huE:Y"S:v ^i=]c6dž2eʭ& IE17Y_*hbH&\M`*zƚǞ3vj,*Vc`B8A"j$ύ< WSt2~@]zCCϸ &!%qVK#EeAw?M!"Hy1;lMIT+t#XLniw'N)悽<#ֽ]$+&QJ7kPqmBU\$,\_AhiO˹ٶgi|xh%zN83 6x+Փ۹y5~b` l%K_|Tǜ\4dy| vMy~fؐ|s@r}%Iiċ۠&U! IrIq *^rSy: #zscg(ZjG"{n7͔_c!FnrYcs`/Q':fע;\] 9;ꛟ6T 1CHYQ#s󲢑wWE[CNxCjLRJ3kNtS]&2 W ywჅ=a`-wbÂcr]˄9ۼK\P1gX݈;@X a+`*v^Ox[phW[ϔrp?u@ bRp!Α~]??s7X%ע+4Ο5*c_>YB9"qp\QGQLhz2To+_I"4ӣ9Gӥk`~k--?xH \k^K ӈYW#l Lja6 O.\Tܝ|8H#=ӎQGcr?nm7[7}HR7e/EjB(e7Aɴc6߭_@F{ztٚ< L[Sg+wkx'W/߉|&&1([N Mзdh(ǿUFN3@8~CTO,Lccચ\X.0w(&xIEq"%ymY B~R8CX짌,ױq >3+M/76ncnӘܟj%X&Rvs}d n#Q 6)y&S_ sqt[rwZ *|;Q:%=Kk S)%?& d 8^ؑ7l2 )XIK@F hX=ZW ^txyNooC_־EkO [Y"އى5ϙ?wFfUwn,J^Uرy|+A#a +JASl\bٲ3 tY;|RPߕ95] <:TiT֕Yln1ttuaj:uxf^ Ex^@>:<J:k=__7d14kzTw5IM"~ѝt ysN[^Pz)XpB<$uci0QOgfѭlQf igЬ'i 1zk(F뚾m#&ћb(gX3v6$N-b+MhHTpΏԨ0_UYX~(5#k{IeIxÞZ/I6#N]Ц0(^|ue!t|.zg^pZ9\L?;;B&^OtN7`Y(=AKܾa<߯u7KʺaG`xb5"$i(`h7x1Z|[s 1`} 8U~CŘ2܄Y#6x!#WӰPCdH&".~;3  PߩQs:MLo/|~]}+J+ 21'0Rz*W UM&ģ+$hꭷ݆H|EQ !<6G_cy/QhV 0eM35zxQE6c>n>Cc1Qq0RW%ۧVktL M޷Sg"Rx>IXP6 ⡪4̻.vA+EtH}]'-`М8ee{I~&oM@TvYr΁ ^w~=È_ $#̲Emn}[wg_ ouZ}⫍muq{ؙݭ҄5r]Gcڧf9ƥb_Aw#SJ jZk k ^$% 1RU FCw [[^ί?9yRO5= =Bܬݕܭ9:tY2XJ4b{H{A]o<-/!T-&~~d#offIa{^k[yxu{%N2[YW~%wOiK쪵:)g,t?EkgN|fI*w>Y|<1i qHz?q^ :a8_ާQ>rwH/>=+@C0B&u*-ŀ=Ӧa2UVNӹx)4k1*_[cc('e2æ۳Ӊ咏!nH׬aeU(aVrxK{3Ē} 7rE-ew\6s0,+=9V7F4UDfg^Ez~r-&"Db$2޾TAI1S-XQ3>f- ǴW+4}Rj/y}k-dTiÍYMcBS f_{Kigwk$ȚxY./K$E^ E҇:^Z~6$jU:*,K o`E8#]!)6XЌ5)tc!Uuܸ&)ߢF4;psc۽jZUt ՄW΅/EZ#[M;8(Ǭ(;u떠Jg4bxcbX}g {Qvf곃1_;~ul"ao^wښB%݃7g{='+2g`SfJӽiO^ύx)(GǞnJzIӷȗdWo)]4E+ҏ&=)81}CO?ex!2}]Ww@_ -ܒm۷ n-T(GA2⏮6 ѡ;O^Auh8z%Ӄ,a1ğ:CAby"l]=_H 4SO3uX51RH|j?XieTŀ]z[J_?kTA@0RvsecE?g ]g[uJ8At2k_3ۂ$cXⱅTcQ54"ckfr , l5Esxp;uw0gW_/q!n  pQP:x}hɥv8Ζ9&#P $T`/,_Oܬ䞳{bѥئ.XCE˵L) Xhgcǁ@1i~Ugϧ|9Yv%`Ds,R],exB[)m}m|)|\u'+ MMZd+2ζLկ X\%1Sa_ &2*5ꏅylM+j*KnU0x. )u*Eڔbpd\(2-=8A4J,{B-Sw([~2 :I*5ԼK__;Sgs?!ݤJ~A_>?SZ?U;~MRǡBv/GS oϛ~Q<ᆭ. %)Ty ȳ $F~pMKm)4#d:@85ozvLO>\[~r6]2GbtpZΆZ$04,aU2oBMo8.fYw}[bJ37@ngBۑ??ǃjO*S~UZJCA:3y6>wO_ #o1F7C2E7nf8=tF}:(ϗm -6]2 Os+dЌΈi'澺== Wx"T_%wLNJit}"Bщ0XL ^'ʒnP#eŮ.DoZWL#|fcuCLʫhQWk}\{?\"!9W0^Xz(ŴYAkġ,Y tXA x =q!ܺ LI9Џ[NO7NnF\Ά4PxmNc5vg1W\mߚ;_Kl=Υx{&Q(g>]-M$%;Cl)z*Ȩ`?o79pX,a=.#m g5?'{#巬Y:acl1⣎Y[]lggl{)2& ߋ{#辉}`"WgT" 9 @ 33С&ܙ3T(KtZ#݅Tȸ`plH"d5TiﮮpGOW) U 6alx\0stB?Quz6Ɨp FeaemdwZ(ymQb s6a)}3/ >2QٹZf__NKҒ^+M[);!@ tf.p0>ε;nS Ot} a]iq~1W8%Ò9/Xl:6ozD;f ,,tbOre&2(m%wGp(h24E 3Q#Qx'lEvCDǖ瑧*"BcOԫ]{_j^$L`x?ꛚm&ˣ()<듎N| #Ӹ[DZk^ɅVc##6.LK"7 Yt)1UF1XX@'D~C<Ư}o]f8nؑnM"jRF0M4,5HJyC!S)% q/_]-Os~394=`P3]mYQtp-<4x:oնWc,C|3xoV~AD"?+4o~`Ami]ӸM=-B?*w6[$u͗f*ث^Ð%z).`lVj =1?>mqIQzt;[QxHPa9 l31^ulOcƎQm/q]*é x D(Rs'w]ݛ0G*=zL䅣կ0VJ}II=z5㽤NlD1F'L*2 d0:/sSƇU3`wnX)-E1Om\"5s~0QH`qoxJ|%+"FcK e[%e\i Zaē]2t!if(3ƕN ؒ]4w גb+2GG 1sZ W?E YG\\XlV3iv&]G0ċY2*b:ze!:RLR aiv$`߹ġCmUϷfOv9݋x63w))BZ?E1@e%k e?eH?~Hし^wV]#t(Kie{&=>;Hod(X#QQo[YG%%֞|O-zZtEN'fN%ioyל.w2;H[ X^ߠaK^XS|0[E|ՠ_&oMgB}]ucaՕMwxG+ wwpu^4ڼpbDuɣ&teCyۆı6R*֪ݻPċQJL6y(@?T}$'X4r2NRm pV4>ށ!łEC߸ 5$noI'mmh7;n a/P,E$󱵢U{Nv2K,0k/d?_b( ̌Y66W{0b}\">m`׶/$qZ+emY) {@[xS. g:t,<`I5s~`g_SZU m Qzhwx֡{̛׸8sa55KYQu%nhɦ.z;ncHd1oSEk6!^-w,ދ,9䯼g3L Ŭ-olW:^(8yw8Kn>MFҮ2 JI:w=K-l efa-qz(gK\NILbw_iZ7*jyHCN,iqEk=JMAu0(5N|PS?qG/\mt:sVwJ#Lt.zp,ɒo}Nh@DI%c5sfo^xt6D6Sm:\(:?@啬&" et d_cU,_o{rfUk3eLBv!|UAՂGP,)c- 'Cpspjf7e8q畿zfqh7#8l iHVxТCca:֥ԋ!HdpqeT8q:[q`lXwgY ǺC8ăhH3Xg~e`?'Ax`=(z)ֈMQ2(^Xdn x}יɪUqkU\Z׿כzj,Ŵ%g"ڬ ɺa\=z$JGݜ/?ɷHjF: yy:_)5Uww~H4i:ԚI"FfrD}5UD+od_نB92hhB&PIҝ͚nS꛾w_[gFVD ٓ+ivzfIy]_vGabD4/:ޯg:֣!l?>L>u;%c#Q2%m"&w 22+q^][a4y6m%'<#я,qCo|7Dcv写,ߞ8X\8x]#SijoC3jjb-J'Dnϴs#oDh*XU X@Q,~Ź?Cnj7jpyATz_hCE6LGM*‰?2`F(pk?Zj?0~Ub[تV%J2H*r1vKiޥvcs4qn96kDzz6*0h+ e.hi*#Y{# C qE搾fZRwZp|RɯbuUb[تnǮ{#Wg#AC? u-`Ø \tlR5l9њkm>9owlGut2:bj-]FS$^ܗtG!M KlN_qo{";tŴs} DS$6IgR0{9C'GtYge<ֈ6>v1oYEc7/?%7]~Ձ@.O\.&L ehXN d{ddkvT N0Wdjr_gdO#^>~COpX&/OSLYR;Dv&9ki <%r^{p?@{H _5ҫ[2V dv"7YEo-ٻ̿[ *2~oOT"~-2W@j>o8\g ,àS8XXt֫s:~nj|R{ iMN9":#_\w]*U@0VhA";me peCsχ MZ%EoNIgK@'2t%'_%/@meE5œ%83gx 41>IMrz}buWiTʿ$~& , pC Ȓ\|2KxGpF+C7(oetA9'b5&ŒQi nA|уTQ8нȚnW': &*1(hL_w>It%Xӏ=zb: 㸰 VrnIXHc.aM/<+/j~ =mep{Vtk,kiZf8_\/i8B@1szAbxN#B_eZj#"b ,r~{9緍' RR%M.;:wݟr>vk[_lo w> ՉNDk ~9V#n*Q:`"0^3cv}u`Һ+v]"@  XX-3.}~ڵ}+ۥSrd<ՉN?7ї!;噃1o1;.*0Ͼ &q0(&=G 昡 GfwSSQ4"˃'#_vD(`%k'EpOш/]NqbkU1;z׿U3׊Dsރwl) cnl,vHL&/q%sMsy1d&ܪ{ @*dVLdzżo#dt>lH3i.["'<Ҡ>2 |{R^aREwe,v d8`֒txbeHT42aJty" w4ʃF -Ne;^?tg]эYMA"}ڥHŮ:R: 6NjHܵ +1kceL|nq= 9M{6fzP#pܴrvCJOHrqG T]zfoy ˊg|4qa /+/&&3IOjEG 4_ gfӚ;[QK7VΔ&~]݊Ķꚿ?H6-KYe]m藛X!O83ė7gzMY[% FeH8E/F nSo2zrraa8(8o;ZJ6rxyњ(p8zNN0`/fC͓[TFcje .p9Ur`י^\#W3?āA=&dzW;[+.heV$ 7lW9@ b~UL;Dp9i T#Ƙf/XBc,!fjOD1ur.M;1$n$QQSC; k7iɿ&t{5f~CWr&d1nDq=)zsnno :4\730KAstZoOz:v4lIbG:p^ LQ)doM!M*TvbZYw1AC)Hfs$>Z?ܘ*(\[n'F4ף(uO#v 7 9#jn@U)5j7XStMx}2t*1p'ż:'%P(9:?4ۓzy+),z1J>l}-Э%ḱMpRAK\(N=ʻtp̄VY}za}}1ݳo}?DiۣҊO^"ȹ)d?[G{ -AE(<<@ui*Ȑ^)28&lL8Pؑ$κ6vԿ_&{4w^g؋=%TSP]Tr/g*xgs<7ў 7>QTM _ \b5WD1MVHM^;Õ!>ϊ% Ǥ7[5:]'GD;еSݳޔjARѽ_BT*QP5ݱS#\e癞ϓm MwH;EvKܯ>7033𩠽>/{=Evledr>T!K^œFc^95Ye_Z*R" <4v6 Nt6y\Ĉ00@iEuBI7OWƖ9WTE${_{Ri9CR螩8$nYz.1\ = Iu&OmzF +"c#Ha=:Esy3V^|!H/\ы^5ë|,*&Ls#+x{jKg#x;׃LdWU-i&E BodtbNAF z ?RGƼnS._]jeHQC6Xm`Ug.!Rz. qK&czT A=ռW1sI8z>ZΟO,Hq7Y9oիYjA'{'©$GbtVRQ]eǪs׬XWD9>-]2U3oVl*/:}nT~ac{+J hfSG )ULkZܲꕊ%al²uoO,HS?~^zV-2'^6`.?;2S.L {WiQM_xp}}<)bC+D(3WYN\9sgۑ.vy6bH( L+p>B][}Q&"=Ez?⑑侂wO*{ _+1W^UWbI Y}J1E߉mU~IIR=!wėdxG-mʿ)6B2e:Dhal+G+ghKd Ýh SN@#*(_|w}qqS8iiys】J꼚6بw<6үIL ~T$J3_O*'h6cr rl~@?}eȳjsKTξ2s7"џUO/Fa2Eυrl/ER4}U#%ʿ tH)ϼ#Z1厯eFT73UF?FVnZar bb\2<6VDZMX/01q8 .% EoC3KXP;ٟ~j#ȔVqo;%PZIJ*rzyu£GQ~H?Xӌ>CA[ +c= 77%ߤMjx[C1ŴkZ;80bq_H#7P`8iLU??}z˶M5\&Пz\x%^^ HMMUTdˡsɱbLvCO"Nʻ? \(0^9>#-ǩmKX̍MsM![ON_3qTVNɆBec 2x*H\U儭]Q$ʫԞTQ8 MZp`W+' jqǝdپuʪ1QaݙSUooͦ\Dqܫ̄s"՘Э#@9R8]Oc?1aҒYq%r,]YoAkeFT5=5ɫaغRm0ʦ"Ӆ'N&C8ڒ;˂K߸W6()-z-Ԓ^-3|֝ҰVNJ'pu۷$cy&}eRd4y(΅lCH=<*ᅶ'緊(.|Oem=/籟 Ty=>0?|˸ZEktKl=~V&nCPqTe5{6F5BkfS[6XL~͸6Ն8VHp1/d9W*?N6Ǎl,mMbA˧_ l?#;Cagݫ"# FInBV屹wFVw3䛐rJwz{()D9tdaA$-E3mM=̚!N60yjώ̱PɍZ=_ڱɥ>k*zw7ՄS/v" ˹.\LQvp՞8w2ƝSiSv2"@D>Cu q$7U@) gC嘳~*h%g ޫ/P1R-(K( }AqFl2&>[Rf , x1\F&_QԷL$Ԑ Pyy5׎׏g}5+N2̣ ?kD4CMN>xO@=g&ً1M?jB̓vU#@>g%/ZQ8bs%a(*_Ke[dBsYzMoo[v55૗M-yv .s$X휺ISuײ7Q--mɒxVUzgxPa-{+Tޟ vv460X%G6/W>o-I./4N95ħO_zH"W)o3koߕu_l 2Di:r//gޗd23c2%@ KX"x nƴIf#qK)FnKa".u?]Xk8v䬌}"oܚD0z"X2HwQ8^>WɠBi/Xۮkt}у%:+R-=tT۫s9zR2l˔*5 a_|6_j.#ϑ#9 9h-Z:8}d~"hcE~-taZ-jem<"7ڿmeB>XRtDZ"I9޺Ie4)PpL̹#y~WM_WɫD\OZqbe]O ץ`Vsry2uЦr/d$D0R"!قz~TQs5Rul_HOZ-Ii ENLYM | Nܐ%![$Yk_`Gr(8Sf=핮Ms檣]O_qyD_<T +Yeqfg:;@/ȿ gm;)o+""); =VV[-CAC _Rf{ڷ)!iZV[ @+Ô[?$N;`{q?4zD `3VwA1ZLCy뷸_b>+ifrIw94̀7n X'W{4{t#5G$]qIw~΀2Cv$øB>lխ~DHyJ#͸K,$:ėGm#uzB1[4U@|LƐY)W ͶvMMK͕ݗr]&Rr7_/uf䰌\ʇCqW/eR;]P-`{ zj:U$B8)Sֹ|'p"Ѳ6n e7P ?b"z7rG0=ٛu!vT!t5Q>u[3z.QEӦ=K]m+޳] ġ- T#}Wo]&w5v&Y"tu |38{]1R{OmD\j-n/M,-Jp޼qgةwM>ʓj68[%1P]-JȈvKlx^^5)>8EgƶukJ*-Z.}'S Nb*(-Ji<6M^43K'JH1iu"!ߧxGc!0F'4n%6'jblWOQQ]iigWÐ_sR;x򀥥'w]}pQB@?-O}T Y#w*>ļeEJɖHP)C;\]}^9hn6S/7Yץ/lWj:rp0I;Ѯq':QӘ"t .@+Zض_q!k_=ۜ&kF5䢒-7C֛ ` zV?]uh_&=#+GS߸~x=-KBa`fEn |߳/ GrwX ?s XPkw9#o@Je%wyŰyz/Alt6:ހTq}o>>i[QW^ NzXq#z^{[?Sv<=u$~).w~96,0$|6 >[ĺ |a<%![-8U{̶^r}2E@ófܯxv „K W,yA^<Ba0Lto٦KQҶQjGw_2S ?iPvT('mu߿2pPuT́ ~&L8/q݃&o"V{_:9 $A;S%GSX rrܟ^n~}6{'qs'2 *3>%P !ZT\a\zERv⁴貼P-U:{4.$z?^@6X_m|Q,#,X](BB/ky`cW㻁f~B6zO{4]$;bI3}SHpVG.Z3Fr#yAq#uR OTminue#㲘KtWH[ލ:rGcCpq) `ب׈ӕP>uUO\zMWI{tw!ZNWFA-zo>֢LN\Ĕ[f-hD ۻ(?Zz)]M-ňb@R9ڗZ<ԓ~&ޔKr*=*vN9?i ڌ:\֛,o*/ͫwy(u~ܑ2lKw4GP~Gb(ՁS5pC?Hh(yzm!*0B/u/@9R.F?J>!Yv8A29(nOYTIL1E1K29Llbw(LaYu*V>ч0ls/{vaE,en4QW^m}{=0A0|+& #epː8"c@BZ9jL4?xX׭# k]7_X+J.9?L!]әG>?g$:hmqXk#tJ@2qKլ*^˂S.؅F>4 ZN'LjؤZSneD_=A^㙑&UjRbj8>f5*=MeC`'﹦R4V s @p'%ɷYRnt˽Xʟpj6yqT;Q PL6G5|XaYɵgIJrv#q)(>DErZy['\B'f#]:2*\]cǾTVpVE$Kb4ex1cYÍ% n+6M \%@.jXL".MbTQ$q 륅l3%$͵|7Ǫ״Pg5'M œ0#W>o\~9/r݃DiVyfڥw˅\l*c<:s!T!Y:ւ ao }xOYSoOմ!pk`BҸP8{;R 8Uۙe74AM;82(xI HWl#P"8F'AOM~v5.NќJڱWL-kOvA{yX@qMˉ7M D]8U&IdF|O>=\?I =-w 38ˠN&{⼐ܱy{Vw'EK|m a@Aى>x\ȥ6xN y͈KNtN?PUI\ tuB<7OJٷA_L%I |]19"\zҬÅ⓼l;NEu)_tN:Id|j 17{̄@uh![HKݹwSZjws?*crd~B1^InrMxG7>v]bHK3h_Jm272gnꉞhc~-ПY.JTE6=/+ڷ|?`z ;~[嬑-?N~%nrQG}ڰ ?xĄ FIůiTw^TRK SH0{PqHO b^yOgyl'awO,A2vz" SdpLz_[~u[֒ 't%y{GhC7 Epf 7N\+ Bo)2lq`HUK8w@/2}mFԁ丹jH))?W :D6}xof PӮTATHS XON/9wǤim_B5V&I|2AT)+ XYSƧ-㉬9M@hoUNيR[d U\HJrW'GX;:QMں@W}EPy0Ɛٌ Iکw4%6HGqۙ !i^ Kt-HZnS:أ nPVк+8y(z.#0?]Fcb4&9_y wP!EJzE#&ʑd[|Iؒ%X}7|:s:5HoBVApH%"- bYOd"0 jOj;ޱCS[^4##7I- U@S aQKEPQɒLp p6;c :SlFl+G'1+ְ=[ox*RE0@ȇ"!Pkk}ԡw^_<~rը;&-ȈMn̖11M74#S+㠏;6Ɇ9!# (>gE\ޫK; CnZ?/)beyUlXU{9eLK]uI Wzh9h iZAJЈ5N|HKa>]ZXQzKM7KaxT7ݨ:V3n{ 5挙&s/PȮlb#àS里HHc$$4\vs,RCwЋN F|+n˱bn9]ʤHiTŋATqO(B#D *;b`U9V' rQ WSFZ/pMvt^L $skeND$R;Ѐpgp, }D_ ^ }G^]pcQ݋J <*a$b1,H7Zcz 2v+7-Kk>}N7&0 h 6+3-{1}Psg>sZSن[Id0^'oq8Ҭ|gtoY٦JJ+/[' ?f80k5x/,^^8WZMNjz¤ Ljx±lhy!2_ 1 Rޤӝ\MTkm|"CSo[, rWH")#BCڡ_ݼ>8r{gv{`6MϮ*r+?D 9j=(y{%H _!{gϲ߬<E߆kK/((r)L1V;ҝ|H1%6ATE-:j 01OtBGygOk ]P(DߢO.2Rt^2j[>BͳCA#%Q3v =.7O|LioA3CgߤQhuomMůڝ{{y6`uhT# U*7>M" }78цU?9/C|=c!D=LiAdV_{{8UPQɏl0tUsĦOOh _0Ui#i%0=C! M;Insi:_#QZav`4!S#\ JN䝘@. ^b/VY~gzI{)$R  ưP射)Ĺ=y=lҟp|`Dz1-hl%ڗg8:v 5_\Jp0[!.exԊ[ٚ{z-ڸCoOdn܇ͽٹRs>:9I0`CԪbϾ[{fM+rK߹Yt/;nld7Ncj0Ocl0G N9{ &|iIPQ">CqOSWVYy7Kw-_@źׯ1+'@Tk~/*•A}^8 G=>+yii#yBIp*GBc4TczC[Ԑ 3Rm!~Vte({c D>Mxü[ݡ3?բ!Gfr˜ʑ{9Z\hixc /3G^q(<|b+ON 8R8w+zp'j =(T ~:yiH9c8{h-2YA}\B*u[wku܎X K;"\g#vlF&ooԪ0ӗu#M:YYhdbs!ٯIoSu0}r{۰qԜ# p & )7)߅ݮ ;tclYWfw^{ڣIG1@ ]&6&>`-ha8ivyaSowav2k肗CQItba ͩ)sgo~-Jkaø$-?*Zj֧Hӎ*|M?>n)CdSHG|;+Ow/j~[MHwFޅ0D +r>>Ы}ՇVmƯSg ԋzR ia:&Ga4݆?#3Ҝȅ"$wrҦ}Ȗ~Pm%Qwfj7ĐV" ZY&dQ.w-(RZ13y{[%_h*qFo`/_?HοT9Tlԯ% {ù0X[>IE]٢˭ySGP&ΦdzAgÈ@|#H+׻F6W?l~2۳غ#\1yT zʊݝMJkEy{mZ4keb/|dߺastũ㐓Z% Ugh"hn=ev`k%skɾ3!+sJLTcxg;?E .qs Z+"x'^ٮ?6%Thzxq&`(^m 8>ak8Sލ'R"7?!X]b1\p[dx}G|'eEVT_A "AOP27o p2l=("hUl*Շ jl66!ٓ(uIl:[1y{Afe:Cz<]޿q'oeYSO`u[ C*8w1& GZ1%:)2NzZX;^2;qƗmrc^^'KI"M{[ [Nl΂%@+ %F yjGS6ο^|಺ZYM _2J!>?daǖ$+x@*/F-(w&=y>mmbx`a[KZ%^_ͦ̕ny)cM&+L%(jf}t8eOtUI!sttWJeq/_,m+(|*-п*Y]PWDž# \gYsk-Ӌ?h溺}@}<fE0HQZWUӶooZ,OIi3v|像`W0h3.pgdw;g䀓o+'gd4MnpL Q%0V{3G4U(hl݋ZL NMAGcJ;Ϧ !C\-bHaSK [B[4$D:J#'dkլ«KR C[hQ-4饊Ϗ-Sk\|Xdo 9.Ӄ.j~nWNJ2㽙B-2[=QFEMѥ>W5)7?Q #ݑ%SB$Q|ϓ=3w!rk]g{WM%=t,`*v5 W'n╖=4 ahKo܃V$iP u3T6\<[U^-S|e3fX?'JC0f)#ʩe8ت+m-bd֩ܩR"ʗ2vZқ?du{Uk6&G>׷t!r@l~7>o_KA A+";6Vy4)>y˩nZbl06Ϥ0^#qB&~*SQ1+:Ex+W.EdqOTdQT$й"sw!WEV4rpK/r5eu|O#x yH[R9Ӥ -JzhZb?q::=JBb(RV(3H5ȺεA^g BS)bK*/%Sn- ''P;i{hF ¼$kM-x['zxaA6'HLs(E0 uۿH>7wAsAuE%~:=K(_zH S#&/71g` `7vj$^~`lPZ=%(֛ٛN]0В\Ͳݫ3|c dћ%:QkW/iŪu}3߅wZ=leGݵ//VەY>N_⓿myW02g_8zq NVvVH|g)sV@(Hw^ͦhF~>C?Wq`QJ@J^x _SozOL S<l૵̧:pUodѬFįX /$Y8A7_9ttYPP-"^v}qϊlسdi{%S݃"ug6I[{Ͼds)/68 .84U1v>N{L iHdmnHd!h;ӟy[d}m)e5yh:c|H3:OkT1!}?4!6\WỒ8mSee2Y‚_Kzn5O?*:e ѵIƓǓ*[Tፄ 3]$_r4C|KX&,gkdlO+T:*E~tYr -V_i70g1KeYb?d Uzys>ƺWh2WCxK-\ nC%N*G^a'4兕+ęXT|doP-OwnWxXtL⍘-߃}ΦWw wv וL gˆs7ǣM#Myzxiem$5ܐqxj(Ɖ\$,1^_z1% _/] v? Ө6OGh]^%j;e!p7D8Rd>m˥,iz}oÓ J5Mq&6Zv~6fcTx`jXlN.piܸT7?ZU꘴~)4F?\hoڻք4VAڛ)jJ.!⣽&ï3C'`*g1NCkWaP{Q?-gߒ`yXDU) `z#p SWtDU_]>~qnWqQ1J(p6Ͼ>79;o^S|[hLPWn7ߑir$MQ~ qA0v=bD_ɭY U)oP]Zm8L!]5*ݚ*f@n%` tRrP EԫtTuvo$tpK^,W|J|jZً ~bW}ީg@WɆ&_9FN?fNpDq[(q' z?f+eݹY$=G-j!&(lƖ5&銛V2#_yKz*0j4'@\6X cjf||%nupc鱖\LM7n]p¸OuuU?b\*v>UA*+׻qDjINfj;ײq"wަÏ=u"mfWu?T?I|9}v]>t*uvu'lN{r1XhP8% Ш`CalђUFd[2a`vhDҝ *ArHXE{/Gv%3Va1!!!!!!gn?Av8U3c\jNƺs~s|'H\y#: ҔO+胙i➈wC3hRƂ~-bPQq.;6V5_3[SU!?*w,' !F(]5 u) Y0'STeDTP[ |Yp߱~*HwT#缲z_x"jbc%àXoMͶ3Y/n+/xpزaTI4 p~ѦeRq9SN$ж#0Pnz;,PS|Z\={ˆ,ڲH w𬠱*߳0_L{($G1nWYהw2̘PY}92^>#f1y1F䵣a`_tuN%P6kaeM$z8B}>@)KĜ΃=WNTTqkrC7X]zz!"f )q%qKl麮WK`@LfMaB FDHK8qb"zsP 󲾬_n 3!K+-h0_ =/{A( |$/X)'2@2KE0C0C0C0C0C0a-,^1r^-zOn@81- 1ܯxv4J3!͂lהN ?v\ŐM.6\kU#=_I$JHC'Y*yUG_b=_oN\1ܰ8M`%jVդ[40}'m~N({3{' lԎ锆jw@]g4> rUw;`)qs`uv!umP9/]K e#|_$e|_vyoPKMSS]c&9 data.plistPKMSSD!W~p1 &preview.jpegPKr%9thinc-release-v9.1.1/website/docs/images/layer-traversal.svg000066400000000000000000000351431467064331700241510ustar00rootroot00000000000000 Layer 1Layer 2Layer 3Layer 4Layer 5 thinc-release-v9.1.1/website/docs/images/schedules_compounding.svg000066400000000000000000000111551467064331700254120ustar00rootroot00000000000000 thinc-release-v9.1.1/website/docs/images/schedules_constant.svg000066400000000000000000000100521467064331700247140ustar00rootroot00000000000000 thinc-release-v9.1.1/website/docs/images/schedules_constant_then.svg000066400000000000000000000120331467064331700257330ustar00rootroot00000000000000 thinc-release-v9.1.1/website/docs/images/schedules_custom1.svg000066400000000000000000000107771467064331700244740ustar00rootroot00000000000000 thinc-release-v9.1.1/website/docs/images/schedules_custom2.svg000066400000000000000000000105031467064331700244600ustar00rootroot00000000000000 thinc-release-v9.1.1/website/docs/images/schedules_cyclic_triangular.svg000066400000000000000000000101371467064331700265650ustar00rootroot00000000000000 thinc-release-v9.1.1/website/docs/images/schedules_decaying.svg000066400000000000000000000123751467064331700246600ustar00rootroot00000000000000 thinc-release-v9.1.1/website/docs/images/schedules_slanted_triangular.svg000066400000000000000000000110551467064331700267510ustar00rootroot00000000000000 thinc-release-v9.1.1/website/docs/images/schedules_warmup_linear.svg000066400000000000000000000100221467064331700257250ustar00rootroot00000000000000 thinc-release-v9.1.1/website/docs/images/type_checking.jpg000066400000000000000000004640101467064331700236300ustar00rootroot00000000000000JFIF]   <|$P'ee2،l&y;<(-i&bbH 5]hc-}DQԝJ^^-j0#׊ VcQҖp9U=׽ԅeU$XqN~A%) gxi)'pao?ЖZot t'@t7F- ;1}6lun6ݢg/P|ts Fq5ˁɹ%/* J|1]4}o^;ChO_WtϭNBOv]jCv?/Vu{"8o{ělr+rQ{{OM SV3vNM9%N]ՐX<;$UW# g^MxQ}Ľ0s PFj^rۊK]FC}Uh0 C)-n+N0Z]W=i>2癯\ג":&}Ta/39~?%/`>ttDl~>npэe@ˆx#QoMup4-wе瓖}FRv[m8׹ bqnЫv[ŭ=f9FU]=߃-?>_KwHT5 89_L]~Jcųz]Af4ϦMm?ۼXVO~,I}>EU٫+;!=D,v FyccQ'#t5T=xψy5MXE94v־c49v[VA`k`]_FhYL `ܦRȷ[]~oUi1UvΚɢ⽐Bn,JlMa9|p+&d Nl1_hW@*K]PWո%KrHӿ@λ*690;wzjSK11Ue=_QSiN·oLw5+ cTjט[IeBW+㕾Z8|e: hz՟ON·k9ޫoߜkQs;~Ҝ_!Jok?15=`kZUGА9JBz*~bk{L{T产K+ f'T@wfJt9DRGmok_ >E@Y [}*U<{i >LR닟ރ̬qM<Θ]eV׷E{ceWSuMJc .7P*P۔>O MwXվց΀+W^&DU&G@ sor`FiUvE,&G*}pזĬ*zH1;5oʣO>ۺf6 KH$CS1;5o5Ur^t1iSgrVzi]Nc|jX so Q7@վWyއzso [P( ƨSmދs~_B} oT6؟n}F¢ ZaeIlZnQ?T|}/wJ#RmE} ]B29z.~zQ.|eC#\vЋrKKm/Sk^cn9%Qf:I|so [sЅ{s<ƫנɪ幗|m-/^6˓YΫ[jݴNn,J+yEºY$Ϭ7;X-4- x8f]$`ݦrv'Q84nRm8]W[{BK.{'1KL7 MA&$ /6վLEϚ.(Ni2Z}t \ TXM2fik⵹1ma#Uo,Bg܂Vd'qɂ´7qPR& bSA٧ m^"zjmIxXeyOȗμMm}`dw0@! H `"4oL@ g&c|jX soኀ31gђ# %t[hk-wY;4U}h] 35Eݮe7x>H ڷ`<]96n=myqY|ǵLG!sOojm'~χ4 $Gf"Z Ic[`]oO|_F;\b;>\\W7Wc|gΑf'm~yf?>ьo<_D JL9/+b,eQ'vtsrx+5Y3r%=u2@i}sd|˺^i6+JNFg֯sf}/+/XD*/ɀ_``nfoNv:S՜@%E%OB fhl/%+O>ڧO7seccvVm0*YXԾ1FI.i `l.{+a Fvym\rVhΒ"JyOYy/ψ-f)*SC~"{C^kW~px#XYƳMfIDRfEHV8&wҳ)5ZczϜ}FX4βVVV੫k;ȵ51SY՗\v۞-?btY(9x?R?-U,N:rx<Ĺ5)3W {߷;MY5eƒ*rfYb?q;e;w ̷65˚i+?{]cyMFo6Mf5J;fJy25` z,P(>'~]fu=Xl\jX͔3ˮ=x3<ܗ\od}͗R|{9xyBt^n@''&5kqsFʚ'&,m,{7m]Y=^J+؞@3`6@@3 x,9 cyQqغ͔3ˮ=x3'&98%8_fRg/ûNN>Lk6)ήi*k|rq&1wfbYssg\|,f% C[UՠPq` s.058/&r9$W8s㓍u|U7rt|<yɍe=pǡwüeR8\kqqp*B,e pelPJ%D(,(%,ft,Φ\tK) %K, aD(JB(ijX:*,\`X?N'X:nG_<_}o)o) 7x7^t/q/>{wG?<鳓Y;93ǭs[7KE~"fz,.iMYh `/\7J3i|J]"jYǭi)3 _Esɚ^9޼Sqg~9q됹ksH_AJ8=ע^1>1;Bq:γ: ,'px_/kHz!S޶΂w 4>ev:^ ~z^]zvη#>t}]P?P R"a! #$012356Qst4CP`u%@ATUpGq7BSrDEVd=i_[e`NB N\~~OQe901Nb0O  eo]QNOfQ}Z5fgtbb7vLlW,=®+fHQ< ~YQc8KF^8Xi`JX^@^ SG/3qYUbZ5<4\5> =ĚNbL˗쟓ڮ ^Ǩ>k41s)g[lft1WڒJd]ei/lLtwӺ"→u1o堪s)rYn@[;5@e nA_^թAE@2c)Z"1`-يJ#Yf:SfRܧ v0>ܝNztc磛i/dXZVKnjsUekek9Hx b !ZrV9{ewb9AL][1hTZF_.XJkzհc>(2E:\ȼ3UrTcg#'*[fucuD<fQ[Mʇ,,<[̽ I W+Rg@ ֵIJzF,>KNfAOU ؛*sVr::ոѱ9k-t"LQ[h׵jPuQz(.?L0R`0Zԝ>H`gw%2{ bpsƒٿ#U Dx5]jpz glIb^ѯukc2z01^%"ͶMU/,WdP:1Hsřzr린Uyt+t)ݫ̾v_H"zSU%e%"n˛IԀF d/d:CWH&1}u &16 c[ G;Fq{òLqFm/Cdz]ϧfiKfs-9DAdxV8:eٜwfyBh쭣XLr~qʔp^l~>bl1˜(uKڷ-3޼Sll+bXR>s!|1lO(Fj+߁Ce#E~nV aL R;0ꝶj^+Va.38dܸ"̩7q6eOeKDja`|wZ&^ s5çFKNszO70Hs$1M:0Ve&# L:fŜ[VYp6G߈sn~cMG5/Z|/jGxsZhQWo5n1MfywvNu5Tc9j*uo (ݰZK}8Շ1*x}i1nAXpmX45vE~;?VtpZqkÖ4@J1qgT. b$o;s\~{*?s?@ռcg銚Ѩ:eɪU jzKZxt/&b2g%ܷu<#](5o?nBxġ2211uZ rEYE }؉= ka qda rͿ>X)$;Kx%)\S!0_K/NBnB/!M0z}cџ\l*pIl눇6egkA1ǖ/&"p3.92II4zɋ4bB^܎žu.K{a>6'Å(}#?Xuw32iu_>w[3j&8<ݘze *k\s,$?>bݤVaKcunwVIdS睟Z6 ?+jL%fcg3>jx+򄥧{ɸN,QgHH;_yK"P&QDg>a%h4&"C?GԽs͠׮!s l*9m׹Nh3@SSSb%f*  zeݒ$!+׭X&i.8- *@_.F6!4QAJqo',)sMA"郯€6}{Ol͜Χ /TS'HQ`2]v/䭸aK:_zoTfy5],2 j!XT"fj}U_]vʯ܂MzSWұ̈ET/"X, D6dYCN2y3mZp#)rYUңO X3'NέqV,13fk6ULO]I{P zu:Vٱ\4!rGl)8c`aȑ윇JjaLHI>>58q6ʴ%K5=Cؕ Rt`)iT)3dhdGXGsc"8OF3ۙ{d0/V'xRLAq..uŽc)%`=4\5> =ĚNbL˗ڒJd]ei/lLtwӺ"→u1o堪s)rYn@[;5@e nA_^թAE@2c)Z"1`-يJ#Yf:SfRܧ v0>ܝNztc磛i/dXZVKnjsUekek9Hx b !ZrV9{ewb9AL][1hTZF_.o+,$TP 'q${=P|Z*@1k*YLF|mרI/9ɏ" c /׬i}[d˭<}qۋ"%%z'07\QIbr~ 1ĝެH~;n5lm@pL Dzp&؇] yƭnYdyo5S4hk3ъm2ޕ@RܵkmJdd/Ԡ^b3) , MZ)ϖV(aC-/l5󜊠c5]uz .+"[FEo_v0p10@AiNz;)Ѯr59fG46Nʱ3,.}5oAHuUd asq 74XG *zݼ p6mMJ]hv[ޔv#5[ao?5ң _B$q8*uKv[~0"Ǿ28\Kcr;9cnAmg+zJWv5#10a=m\~R.g֌eAG״e.kBScχ"a&+OS0Z$d4"8EH9$~CC^i3U`acHf;x9䯧⼷NaLǢs!{XK1𐱼"xm8`򶭾v✊8~B"G 嶑.֦>"qXXO&COBsV5?T"_nwX2ҏJ)IT(Jǖg? ].G2}3ې1(Lb8cF81^]\XKŒ07Z Hǧg{2܀WK^DaԖ܋R"}U'G@\4Mc.]]C ({=su~=P CXÃهZ9]XF+mZkvu&J6!O&YFQ1b1#}?RTbGvѝJ:a"".sx{X㼛%<'݆#w5WgčjAtvҵB7=F]{Jvb#w ;nX)v4fk LdH 픾U~_Ug-\ lyU~_Ug-OEr\Pկq72%]*42~ۉ kV_/)dJ:Ȍ$ FHg{Yz.vWX-\#͵Z)fh r"*jlRdX7^ۯ_lCT;Yd%}Z%R]B0H"$6sF 0H)B_|2c^Z!ŕ9i$T]0uXP5kT¹QfC#*[XVS"a yV$,j /lUS &cM-1wђ1Ʌ!8 bS28,HJW)ht\ۨl NXXE}XexXbP]v6WUX %VǰcgcUgg'PKqZfD.DkHed\f+ *k31mRY295ҁO&bm!\W{mvL`8U`H2A.Ig:g~{&SWgˁhfRc]R-zľB/60!@"G8a _[ !gp;@';[ujшT&& ,Y] ENxF[63`IPRƷ^d[ 6VjiDZi\m ۶kFz›OMYPW";0GbTaYCYO#!E(<#T\yڕ%(rFXZֆ"  0AMtWZʛu$Z _G\mׯ]Rb*wM0ص/4Fjd Nb-nKԑOv3RF̽}|';zn-3`)y}wPؗ9N J3dC=F. !`đEnOՈ,7U\ey O^F꯮ỹJMSuv,pHRm_n|#6,UbM)+eݶ!$R[NOQǷ86SWYZWݛVUUgjr#W0ϭOdki@_":u&:"Y; >_U+.F:\7F ,, h3r9r59ߌ$'N #)R]TmU, i)G7Y]ko\H `[P"ܹ3_`njr#,Vv$^ЪN%\lg>' p,&"$#NHMGH#J4bΚm뫳`CY&ч'>aGwU5yZ(K"%enrWe(ʑR{fR ^e}4ce&ϰhvB](Wܹv 6C=:οwSe3N܄oD.Zm3e#O[-[rFrɢk]F9`f́s+=J>=[mh/Fnls2Jcc}ZehǟolN)Vdfn`Smَ7(`v(9whǼ'qi(d Mݻ`RbN.}v0V.Np*ţjf`hmʖ WeQؚC*떥^1&3-?%eRbr)iee˞Fv!f3$J۶68'ՠVVy嶱,*Vpl'0EcmRdvܟ.? 5v▾ 54!,MoveLj]|Uv6U]9Ν\V~)TsYokillY><]냗1ܥ?VmxO\һDCk[z&Ar֛i)}j4[3MȍYbr웋0k=LCJ>ZJʊLXn3*'= JPM` =tyRz#e[ݻbJvS= 4oSVʰ!!r*پ`++U@-ɤ{^ȬLMՕn6 R>br6=2vlV[մ{n\Sm *8CTY9j=cUx1NWUYCu;aK:{jVR̽fmݱfC:5R՛M2%ex%]t<`KqگyU8#|PDpK&f."-' L$FL9jT-Niq!ysb&h{z61ik2zmfHYSoY02[+D9a8$@Gnd>g:y15S¸Op,(`M.*.=alN~hlRhػt5JXq˚F,ϝlǼ iT5(7JZ,-\aL}\WȲmw^G s:mOQ\J,Uu@c[q;*V=tzhc: m,Jī{n.+YnrKh~Y$)kq־jk2)d *HaIE._8p?4 ~ov˚n$a)yFS6g4ŬGs QakGQQI"oFI0A vNu膵%_am,m*|;F#01B8csNLJiWԽ`v09ڝ+3HVWÓ8}Kp1TgH~ʦ$UoP¸.;dZԂiQ/l <+5ݔqhYnYSgd DI;rפoFo T%@~}55YR@#W@C:(vkpE|C6#ȀD ˯YrdhعiO/1AzbMfpO#0R`%vA9nK0x,' =Qog,I8lYyNj-˶3G}cgJYg=1?f1(oƚYr(iܫ&t+/sQᎦ^ރLC=okuѝ{1f(#jZ-Y-ݸr qb JƳZ,6;K+E&vs;̽Y~UwayZ'#@Bп?˫c9q81&?KM ,&r Ohy̒uE2^n;nI:Xb}[{RWTWȠiW׭%;qO*pfTw=є^+i{)`)M|g05~\)YYi!)姱c?&>knzvqcٿ?gOº%Ce7NkcCH%B$WҴlL\Ry5!= iq޵pv(b' Hӳ2KmZjd&Z]ݬSWX5?xxjZnɱmԽ.ڙ)I-lN}eT8e[mw)),/QqΝy2{fP_>݌ԑ/__ ޾uk ~_q]6%zNaӂ@{R@uL4PpыHX,$D|jõb m-fwBS׵Q` 1nTb݋"E4jWۨg% 'ŕyؓbJbŤiwm1I,rT9{q |pV7fG1Ud81܈5#3x,#PGNIs{wϗJKr%97Tl⛮1&_^c&fK\ Ce leN3ŧ`}ѻ#f^|7SՙA=[mh/Fnls2Jcc}ZehǟolN)Vdfn`Smَ7/NqW"ƭ Vs]weTUKdXqX2똂Pݴ۶ U&$۽a`gZ8Ffk+V8ܩ`[qvU1띮jYujjS;[Zijr\&]+v 9-"/&^&\mh/Fnls2Jcc}Zehǟn[k¥j s^6+/VMi(=l٪['m)kSBffTƩ/ 5Wce_Ӝeg貕K56ő>yoyS9s]fۡzP4+LT8Q6d-iٲѭCOչ^#9d|Ֆ+]'.ɸ[fT-,t47ECƤkʖkˍ3\lg95OBX$lsk{lIN gF*s[:V$$.\X7,erJh4kѣɶ&_#5@\q}fX`yN͖j`Z`pbQm˖w wVmGzj'-WbGjB&)]7ngl)gO|VY@ح[,3g[&JTzI&\$L䫳nBnj n;Uo*s$ouú uDâupED=5RiDɘg9Qc@-3$/.snqf].jڬ fd]ۗvb7Uv2uFӶ,*/ۜJך',6Q۶$m`A3ٺӱVp"] =+R7GW|D{ʕ |y,sW8UGn0}.fQ!O@ycْ%A@`L 3#sIQDrD{/Qdݮo@vt?h)YqQ8ΩR⳩9+ 8̠giDЃl1۶cQKX +LO!"{$7 7.̀c;Z{j7P0fuA)3 Lb#߹(0H$Bأ $D ;':CZ׉xvG?6g6>#NC!F1zp\A9_'&%W^ŀX;no$ z _%dy'(SBޫa;jU!6vIQa(Dbc;3>8 A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p A\ r5?8k~p11d& tGe '=FA $s$b8YvFa^g$۝c1Eo0R D`91JXdXsm4aYG/{vurk@֡aݻ{ dtT-bдqӄo˘[]\Oߌ([6Eed+NȅfA46ّcEYQwI̭T]Zٌroٙ`w1)Q?g-n&l)۬7V#[ "o3&=yn皠Z`Wz5 {^c )(%ӛҡlZ;:VGܢ[oxwɬ F݄uH-3 ؐڅpߣ\ZUpm%zK$~%"x K!'r/Kg涫"|ȵn+Y`h3-[^u Wz|op/QJV"AIKJ`H;;3>uYm֫R(1:o}7ji6\] LڽorQX"e_PZz^_w8;9u7 ;U6oAj_U{~!]:AL'túBSYr%XnۻDŽ~vᙍ͍Ź8g`1Mc֊p*Gl@UDYI|J^خ wdc#7ՌoõaN$z.&pmo;OuNSگ XbB$Lz9o(ۖUν%/DUbp~G5,) *!vRBRG*ٹsq[+Lv(OT9Hz>(#فQWI>HvjT:y̥!TՀ(+P a\ @d#8gӸ`\ X#aIEdɡǴldy .ˆ`0Î"EP Dlg bX3gLU`H|͠.X\]s.34Nf+1s&8#Eq{QWE2B/BLOYD 0Zh!}}_\i.=QTqqmg9j&?C3:EGqA@ p揣<>=[ݦ&mgNi4,9>Ϭ4O6R Ϋa)״6q~ڶn̊նPlL~|w^MZZÊ<0w=^kkd]AH` ?8nzdYtMշn /ۨ3g bp1(ɭD6@@ "$ cwpכgQ,*a3}adr}ue*!ӿsMKPSZ6"+u\c7؟b9;=QWPtdo|uD&"dZ nřK9119ӷ='^c81g3>wEd9Wev0#y:#i_gIgcqW_݂0(fWץ!o\`(2YWw!B^lvbZ![뙂E:0Kb3vJppç n5=|(.]a] [Y Fr*,A|rynTثV8H"6XOt-=߸ |c-+)ؙ??_Ӡ|#-0 b{B#h9]HlAq.C9qK8q7Nɸ1j'^ed陕gmoX*ra]S'!5wwP%潬OF- z<66rG$ Y@zeڟ_izڼG/%25UvA1(c+Z=ٵ?  kz\;`:`YF{c^R>pb fiyqIX%d9 LSrHZXc|`5xL8Y$@hB$J R7N8I"|#&s<{4'9qh2h~hU)ɁC1 Đ!N8r}`f"ٌuٌ~\3D(9Guh&9t ː1\ڸӈ9128e,R]f 0 XyNڸS8K1dp,&N@vt-K}(_r#{ 9o#5 n3 F`X)cVhJk@yڝz19 ˍIRxq;@~Y(XpֆQm@B>T~ݧ.x R+ ,,` MZ(xpt?l1nJZ8d#Bk#ceSջI7^,G15Q:F,1栩lL#aqiGh̹e8a?:=lWsk l,1zok8VQV3t(&j|znwpN0TsVü8wm|il_k\KRZZ\bLٺH$&"in#ul3+JW4md2 F(ۃ䏣HvuKtQeњ+ w_˜ 5m2rm^IR++X+Ę\[2'/g`\cX@GfC>@ok@ɮ8))jDZrc0mj=Rd4Qi9fMإ״KV@Q50Y*s×9L&vu*20pH{5̉DzgZ% W1D(ya98#fyUH4 32D~9{%6ಱfʶSL3}U~~cuu$u%#}kx&l3Y9~գ^kH,$.HYCuhjA8 {sPB9~ihU0.F]Y^Mf^J %QЄV|ߕU*TYbMS\I>y\;0B@x"8WK4/Pzcnyfq {q${,{pX)x2~СhGq<ѿ\(^ƒ K7d,f/,Hz'[@9cˢc3ӴR1:{/v1f:u19#4(Mݐ㱊UYxQ\$W!&,T/!ABJ:!:@ؚi M9Ǥy9. R3+PxXȲF~n}mδ?YaG/{7m wʪȰȲj#GxqcWu۪IBS+p#%,EEJ Xޣ5eU\y4[TNu)JhK!E{Vydklo]V*g% 7}O\Q/Kv"l 4x /],m h_qmݱR桐.m}bS$f7yqFT&s4RƤ9Rڮ*5ߊ8piJ҃tGضZu336ɘDbuiNrULSU f4+]mR<qcJؼmV˙^͹ܨ~ݦH`N;}orE!Zo6/Q }VTV^|<~շ| ID/q`$>*%b4E DJ-- ոl1L'(vTS5GRz!e9#ۛGnثX'F O0YCl/hfw * 4;i yvЙ~qGII%gXY"akoZwԬ+;1k:tsdn^nfQvN%R (eT:ZWkf{*6!KiIrLQdtPFkt}1#*TQ]SGJvɍ0֟^@U4%V¶'ۖ6-dMJs)de +uv "mUfݠ`3ehEP`] ͯ)lWT J2.v7TB*t՛ݴM*"Xe(t  o?y-%O.%ai>,a%-KvIAİi*A fOJm\FTOZicL+ifz~}#ݕQ`‘=Щga/1=ֵ5mu%ժۏߗ텧aՅ)%UGRx).K*-8nSdXy\j*+L0,SonH`C+ƸVHNJ eK5MlFJr^mkPVT"o僖6\\])&=m8DzvqcYuIvl+gTtf޶S,#|I<n5R/,륜5nnqUq'*NfMķÂ3d |5.oC!ZSlo[m嬪`˲%|`Dwq( 8AԩZ82\ȵƝ.BXs `:SW|7ɦ2niDEKdEnb_=c&,F ;C_xcy{ eF a QxfDK'#%ʼn|8*)T0gjʹ\?>vUWdʞr"ֲW3G> NQJ'鉜_iJŭԒMpPuSG_H2 fH-yJe*ZVQ˶ՔyQ _y/ !g']0r>T_Zo9 6E}p%ul + U0FqɓBnyy볹.85CDz6lO%ZT ]fo+[dv6h 41X4SCV^A(.D;1Ns?݀Y4H`JOwX 2kV3JYe1n"*@1K>xEG0,Uk0ԜIah? Ւ΍}W,V?K/I1=ϔ "񌱉c11(ı0G~(9bPEl3<|Y6jSG3c0!rh NȂqtO;ZݻKD,ڋ>7#9%z(,mVB~{oq]ާ[Bmj,GNn6lu{*wDm{Qj%rŭKD+T޽gDӘ!P_5yuBö˷/W%B$WҴlL\Ry5!= iq޵p_I*\áV%%;hzi+[y[ì &͵(}JxXvm[EGÛ*yA$\Y]}`iXFgP۟nVGs%9r,Xi4[˵7%Gq`ADFV\O C1̿.>;ZX8cvV/ok!6.I = TFo]W j[ompfcfwGV#>RO{*~qUΎƧ :hݨmAg WnLqfK@4B"[+q/vdjf N[-OV,f~F{ݤ32HT#s.5"MHL=AX$}3[t6TMgni gn鱓fk}P}k3uZ%S"?/ٟGq׉;Y~7̷I*/MnUb@==MQc]{)A=C;]rԳB݆$>Ԧv'L]*V@sw.ZE-1_uLLs_;d:Vd)[v я?~ܶ1ŅJ mV^nQ#^z%.?#ܽQc*Afr! Y8eC(Fuq/to6יpT-fY ; VdmuI#O8# n%(Yn{ig ^koiQ5Em3,K{.U U?l-kIva7J@Y(ϣsRqUd L>K=0vs[:v19Ѫ-TզKQn;ngźeOPd&ufhL#mF%PYIHD`wmڝ7єDzVa"R+|3lJ#$[.rZՓ!s;ƭݮgr8&eOp iF{ّYTmLs׃fP]awvoX/Q_[%J1Y\3!ٺMi۶4Ylxw+co"$]ƐhU^uBjS.a%ڟcS}VY@,Vz pq_ۡm֝FYv]*ajBw;Z6հ1\L˶B R;UB2%xeEib,UJq[u(&|h ]62%Zn1?8yu+ ~zCD Μ A8Mٞ/ӯX\{!(d8tH _lf&wn foC$;:~ݙ=s\:o1.pPc $OmQQL f0q0ٞ89x9ӯ NvBHjdq#ӄHI }pFIׇpЯ\98).*\Cac7f{gP7?Napv!Hj fHc8۠v3 @l 1p=ר_󇟧^;y4B P 8 q,0ALݙힽBޟ<:Y)neZ(U qc11ṫ>v {{OvpS4x e D\VKybgVu*C"X'Qa>_W 1#MwxȐZ2!^dKNid^\&ugRd2/ ł. _U e1"~O¥LHcK`OKHꋿ.RUH%aVI]>nIkbB:G]9gGoid'uUhF˕je2\+A nJq- `OƓ.,0d@S8NmoUD6b#~TBǗ.`>#\vo:*6'n!̌tt8f:ߴmT\޴ǃO{-$!9ۈF=0# ky sCjV {`+Mi?F"׳Nn3~ڡPicSkmSؕ˸0mZppBUbmkT΢0# jXHvbߥkxu Y^;_ݛaK|em,)^yvwyMS|] #J%1G+TC [";bK+"+mHCX7uŮ6ڡWD6G?2^J/JzZVvT"Df zsޞgE3#`-J(vu "vU'Dr\rtݚ?I$ *^[iG_jOٯ ~kHيsWV:޿: o:k|M[U:׭6Ds6Tқbq W[Ҵ˄.ެ:oyD"Z?~rju4̛YxHNv@嶑o-:RP'.22$VacT@V؉CtYo*Mę$-hZU1jԎϕ~S7tmJ+`صO~Z(#es<%YkSr19ohѰ#cRJc@Ds?WG+j" )l6 lZyg@ d~" rb%񦃂eI|OVB]8!?^Cv扶,E ?酭[gf8l[mZn)7SmםjYcZPUм~Vpfr q7B @$i8Jb -x[*W\}j笯dJn[G3 ۯ d fեo?~|T9ZI$hO<60޻l~i 8|%S+' r+kkSd(Q.hOףҷR4Ң(|~w[JIBcLo~ݮU_֪X)cEvH!L̽wυ}lF|t‘^$QM( _@,FÑ4UPmG0,zRIbը*duFhm*Yc1F&\BnZ7UB/g´ ݬ𽼪C0-Z9FcvFsTf^x]@y"26$1\)~|+G .˨kep,@oPY7y@>_ Bg$۲+GH.W+Cɼ)/geMt)P(ļ\l2;*ӂ+g٣ c9z@VubH_v5W16r\K1=l5̓rLFS h;!Б)N%Al e]B {gލ#ʴWso HXө V G;ߝJ!L""Jv=."Rjb` +b7[\ڵ*PrGg5i摅#̝pp_ʓB?-B`9yڥC^zey4rWzt.֎(8 ~E ݻѵO3FADuT8" Rjc|ݗp5`w#? j^Sޢ >R>efDG&F88{:E&^?~3"eo1@7&ɔGƣp8fM 5BBj$EZP!.3Qp/G p#2AmB; kx^*|p-M"\9nV#B$r]_pKl.maʸ%Hoi.ABJSh%e[ۨ~꿒9 N~XW^&1?^ B5q3!dS3،f^ޔ& 0\/*ӣG;1?%j7͔ݫ\EN_ |i+L=iJ+wCrZ]cjܮ${%lR[.ƽ9ޥ]I[:Oۗ;+6Lq ^yRH~:P~~kk_T"E~WۚjLШ[|^ DO[ZnfrʩԞi%&]d ~P?~"֖#ۚXG*u%~>Mƌ%7\,(};{B6䶽?Uky x0ǧw܍}M}Mu kVÈϕ7[e0wu)*[|E~zz<#o4E.i`8}g]xRxX|e>~ɕ `Yip l-Zu(b~t_+3ƌ_I'Irı^\y-u=nA]~ޓ,S+3ƴB"x!c")1N"5[$ X 0L}jVC5{۳Z,Xp6ڴ FU+g4{. T); cv!ldE:7̊x#*_lN-\3[mzauemsVZuCȨ2ޮC#쑰EK<|?5%|-I<53 ^VSj#ӹ)yOͧ )Gc9v.l텭APez8 \l?CZRP7{sMi$›Up.1%SzPCo[-"*)NAr&mg 8B>*?+D\TSI1bs64sZF.=zƗ5) rkE:²C|I Ν^ݣqzK`2IŵI{Uq){m$lzI#EapֶEƉ#7ÒzOb!A+a}ڧkO/Id%At!-V)\rTrw;QxXH\2 _֪X)cEMW!Dv֢h^;?=55b2b05֦LJW F@dQa4{J}-xo" O*p9'4E;I$W7gas+TZCŔ 9題˷/hE4cqR4W{sa˶Z7uՙ@hѲ, KvLs_Q#s6B[(&ψQ˖=*ɰI-Z%e!vѩlxwo\7$}Ǝf2L>6@~U~.ye?VEfFÝi}k:eylgG[dy87߄̏R12e~W}CcZi^$D[]:pRH}^2 ]QY"s l֦F&d x G39t`EHóy Ry6'7&^v::g3DrEFOmm<ívAYW 8c.e}K }y*=OIBZֿObX[䑟_Fεf_'ilmQ BWm*S"wpk5babRF6J!T}iX#&z&Iu&8R(l~R[nͮƏ1B2:YM(;x7m[3?pCEx0n>v2_x͗/.>]G~R.,`\C>U2pw-+}?KdyڦҧWN(¤&73IŸ\WIH$ ٯG[֢7[X Ҡyb̚Hā$iֈ ŠJj^c-ېp;M)E9۾OYnpR$8##U4썒e͏_mEu+>@21bsPcʄsND.<|bW(/3y|1A,EocD&&uKanTO ڈg[dK=징zjGԼOX·E\Nz=VBL$xՖd#s0*P+F$ m}fE = EVO=ObF"=AzUՄKn&VwUkFm<>T/+Ĉ0N~~鄪a,6*,Bm`FzH+J@HPo9䉳@٪Fީ"EkUgWlM1^D/[}Ut>z`ߩ/ąnb{Sl2XKI|xвĶvʸ:cЭ?҉}ƼHkJ$ė$GaxБryX*~u$k(^IN-RƱy}>cӧ`]xq>\T<>ܵnd+P.s7WD>%|mr5?o<ŎY݀]RC)$v-4>=U]խCޖWO!rtZ}>!Gd> 5=?5(!`Mz1+~.XZG'H^|'k̟(F$,d{@{Ǚ1p;v}#u½U\Y&*SkbLڣYUv TZdRO"`&Aq v{@A/kDMۑI>Iflc3cqe(9L\ʢW60en~2䪀Vp~5"-dzrw vRGg@evDubz_`AX`6~?jy3VcCTFC!*F&C.?3m;$zɸLFywC?Ċzı? frT_k HG!>"LtΚkoɯΠY$k;cZU.,۝#lXo^BI] Y%G |Oi{ՠU1+چHPH%[S O)U܊ߗ*ˁ˃7p2b ޷{΢r,ObH+yBQnݚ^Nj/*GΠ,FqlƴB䛛oR3: A^sqF(XխS͠Y,2!>U2oGlf{CTFC!)ؙ}^x{CԌNJ)aY7 8HymjŁ9iTp8dĒH=7T-σH@;d]MQxE@{y~O\'qʣBu 5ZrH+*15vITE{/+s$ټe,ϿolU '0jd`2iN ,jMLQ{GyS1~×F ;=TT;7~h|+0G`R~KNXC{en[S O16UݚBrpvu\.$ [vȻs#aZ64?"U2pw-+}?KdyڦҧWN(¤&73IŸ\WIH$ ٯG[֢7[X Ҡyb̚Hā$hӹ̌5ak d[sM|wL&^\E9۾OYnpR$8##UGXNAU_cd_KbP+3/*16'5 ؚرʔդޮboz))#?޷Lۭ[δAyX>%*Z}!uRSi< eq8ָ߳.iVX<ʎXd.l vޡvxu}Dȧ4z*ZM:H?٘,n. 2q8*ȸ}؈5X݉@]7*,s Ͳoʚ1LnnO#8E '䪢!rqJժ9WGXy;yjڏjLD]n#xFV[},>DASqɇH1TEUP?g+!Y VBd+!Y VBd+!Y VBd+!Y VBd+!Y VBd+!Y VBd+!Y VBd+!Y VBd+!Y VBd+!Y VBd+!Y VBd+!Y VBd+!Y VBd+!Y VBd+!Y VBd+!Y VBd+!Y VBd?OՅXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXU[oĩ og2Z~kLGY & _R5h$rPw8HmӋ6.k|+>9QpZDen9/kk>տgYFbGˉ +!cX[/S(3)oS:%qg8R5=9we>Yåp>PN(G*cľJjWLlOZj;/Ҥ8Ҝ勧;0]l}:PDkG- @F58S*zX2#X[ݲ*ݢf|q (9‘sk.I\$v,҄s&x"ʄs&*M??߳ z$hq^t5Y?_:Ң6_S]=~1ߝϢM4LF:U0mj /mi 6L嘕zxS*Ccquj"se_KC"1I Z562G۞! QaVS Tw`M4 Iwan꼪$p¤D߮o#Ö8rzxa,F1V5o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[oF`C/}??߳FbVIZ(Ӊaɺ*ʠoN=j-W kXĐ+a3HХe$UEFٕg]뿥25.$HZ7YM9"IIX [R'Ս6VsP0_[w[+Ǖv,-Q2V/׿JL,E9{7,P%; \@}ęƗcR$K-هPdn*v_KiL2Eq,97EVT-{o2)YX\2J$sk|6 <܌΢`|F»~ܐknN'aK_QX#e{3i}r9ӛ۞v”-v9`?;ǵHArQW"-ʏ +½QA,طUfX:ܒy|m'<=Ԩ4+9apݍe߆x]R0cj|em1G#R2RK'^i2 <=-$~T`%U1&F+]C$/J[r LōΞɹ > B^QFyil%(LXs`"+rk~koB;GBM{EFX\ғnxkl\06:" ڙFf&HXNQigm7P(HM:i l.:/39ښ2lxbI^bZmDѷa=z"Ku#ք.Wnc9ySHH/Lƫוޥ2[r)t{zާbq5085U:!bn;lHz#;(kTq*&'zXPH.xzdz7tBGh:$\N$ Ev4U}pS.Zx,ɏ{z<Y|4 x-v~[rk?^Sv[\b6=h"2\>8$Y$ĨvmE!a%^*q Z7aaFl:,rP%bx̬hQ_JCKƌJaB+OPFֶD/lIbK ߣX> 9 7aNBExE-o_y"2XQs~pĿ|ɋvČ&ߙj9EQ;C ±z(?ƒHא\=ٚhc ȷ6]3ݏκf.oں5wyT@ &&R8_ ,^vŞ߅Z<6|Q{0W;= Wv2|jub-k9V*VOt96ohwT/r)T{cBKeoG5-")S==`tqfFkN*F3Sn.ȿw mTpnʇPn_J|/]qakZr'wHp[TW\8rqSkEiW-?e>͹u e AikI!{$9zO FlbۊYEJ;6L9 ԑ~dR/sn3D\~/:f(Œ篻ʠgh#,dU?jԐD!%; kZUV<{A}}0<8'"h<VHw\1^ e AikI!{$9zxHް%vk.\'PH6$m:6܋r&ߥioqoUeWxcf_t59$Ȳ2 .[M\͚7; Q C||oε.6eq~;_Mu.4k~HXdJ^3L@x Z'l S<Ɉe'#Q-&;@ʺN?j\h.V9ZSΏa`ysWw@z9 c|s(a[V>@_ ?:_l]Xp+rb|,X-N`Ǘ/uA7!on{tYWp΢ݚC8 7~B?`׌NIdǻc*Y3 61HwQA5,[P>'?gys˱|.Џ"+|lߜ1~?#Z?VjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjտgѦXb|kW ^8RĆ[p} ,7WD4ِ9Bbfol-#z %10sTXч+dSz9RCj3|%5SqlkCSCniI 'Z 8PQ8h,Zi2 &ݣOA2$,p+ [Zcε:%[6q:v@gu+$^xv m@ad2iQ (pۦgdfTtʄDy&XۘFT5JzCxIxs$S1g*lǩ[T/q| jY81xDT <4 b{XB#U=IމN -&&ځ[~IqߐB#T#U[u{PO`1@&5MbkX&5MbkX&5MbkX&5MbkX&5MbkX&5MbkX&5MbkX&5MbkX&5MbkX&5MbkX&5MbkX&5MbkX&5MbkX&5MbkX&5MbkX&5#2=\^as[8[uÎ>[@:DYMpѮ' !G6?ۋ;7o9p,0zf.;8ܗ~x9kPQ['$0ƼXe1|5*JxBZ,΢Ø-?'RK(ڿ*X`C^91"˯榹qld_`KoR 3*mŻzm^7ٟx)W,GM~ijiRd۳R3m|V$THD{eג߅*nEo˕iefePZ8lwQ[Q9OX'1$܎[ pI{7W_w.&Xn]E{FEE+ "a)Sca@7sqFw(M地9 c|iwTR>4:X ƙ#6dQOMZXMFIM~!yekzQ v93b sK!xo+_;՜AV2)2r>gjR@ mNM%\jWcxS7?:IJ 2ډ%ӱdw5N/op ;[FI@ZG2|k孔,`՜AW2)2pr>,vK#9Qq 6K&+lԮBin~G)AQ0a m-.'37*O9} &Fc;l}4Dvwv爧Jx>X|Wiyv0Md0Kٖ@,qΤ$YaāYpv'|sEoz8.c)mL쫉YlքR(g5EB9Eƒ $~+B6kkE%nytw1$*Do4:%—e1z`xlr5o+ Tb<+BW2(nImPhHlQkQ CC ;KJ=bSx@29R醡ZyAP{:+6I:x}J'xOi,q-cO(MDZ.K/&H3{s`Tz5tx!\6SZ^%E׫꓅Õv#)`X=Ttӗhj-1#'f?=R(% QCh@*zZNޯǟ?:N7WٸBԉm)&د4QDuWeE"jbHQ9s##Ck-2YXy+B_g!~ ztOaq{#oz>im߽C#:ӛRo64Fұf?=R"O*{|ËI5TPD.PAY#j>OB[G_WI&֨KiI6*HӕE )E{#dYscQ]Jæ60(|E^G'Q6}qnwdH> :"Y:0 &\D[|Y<ςΤ`jF qnwdH> :vHaQHb|'Zcv_ *'Rȑ|>u#ER0taj)LaʸƷ;D~hqt-WYU+/瞱HyZ)E밭CDo6ǒէtM<%raz&.Ȯx\mYjp"+}jµAd[KV4ĕGÌG"qe?+V![TUUvt&؂\ڴߵ$^ /Z>d9Ք /瞱Hy[^Wz^z^Wz^Wz^r/!1AQaq 0P`p@ဠ?2! t빳#]@-\dM7I&ao@dG"~60&q.S򝥀f $Kh&)@;%mR?2y$+&C!bMI)2 ɮ TyCy[rm0 gU{JY(ƺ~ 3rW"JĄF#I 2#V{6q|Pb5pvv5)QVU2s߇pl$ x^R(l$U IZUO_L!idvB^%I$kh2&a8 @gu@:H0' %nJ d"4FA—45bI'\IX~jx:FJ0@HI\pzAg|PPi|,v7-E eQcwɡD{`+M= l*(Dge1KNZӺ\Tʅ~wED!H55R1tK[kspA1}>Klb Hj~ʌH K.ʝ(C9 Zn.2'\47Uh'I7yΏzQ8F@P.8$5Db꘧;2O8ѠɎc9ʭ;e[&.Dte|aT"aY! N gaVQ ݠh\ӢbVW:'3 X#ɢN \7o6D%.b!_ Vk<c%豪.b *чF5EM =D i0FPp)pT~,KdxAiMY,I9Wfs+-0YA InFZ rw ADDA0GZb<}Z(bagL^K(%֨D6G|{Dy+\ ҟت1tF0èT;CF*A~Be988޺pƲ3OA뛲#@V'MbR(.FWqI9`HT f=E_ℒH h<~أ?L}3 "Ca폫DLP1Ghh~EP\>EJ*J@P[K .Zh mE!(XNlQz"WȁLX:u[i(0I>UhO hw@'E\:#Ԯz5)"VpCN}`i Xm-QQFSrnHh p0%*_NHdoy%w&KՅ/ \qw^IoKafH P6 hGIH_r!WyV {(HD^A|^Ȑt.H)ҵlZEya4O-1$o@)bBZ#?f$!$HIdgl4[ 7 HB|Xq ?zϬʰHޢdU)pđgJ{pRٙ' ؈dc&IW$“@Œd\o!N^5 2pq 4&OA~-BHI 墤@ Ud!U"U΍xHX\6CKdփ D?v*'eCaJUuM͢#{:]y:;AO`G "xŘG&87XpbP@8bJ*t ɔ`{ ͱ)tRn@1w'V koMTw_j)(t!i24_uUYUv`6|hvsFczl~Hj' W'2SMfɆ@edž? LL @ DdGHf݊Bl?aBD%@F66BC`dF?H}ʴH|Q -SGS#JoP 6oI,lM'f@~ Mzt"aAs5H =ͪ._$7*MB)(wNJTm0խ;L\ix[ $-6*I,7>UaA=d+VSZY"(]y{搗ImRI& NAFk2Đnm 0!qbIj҃hkY>ȍ!$p Xm!>@xAFs( "/ XV7o"h)b19땫&,+"9ЪX I="p#-(}hb2?FOP;Z\)0hІjQ0 nچ;rP0u`u?5`ܠ aLEDڙ(LP3/6BK,S:p"ӊp^dYEa"`C6ߡp9l?OTd 2 Nfalf!܁%y8Zak%$4.Ӯ "%;pjV!00M#M'2I1K].`(j 8ZFSJCAVAS,Э:w!"u6\AYPݔ7؜r1iJ"L(r^nV"qp#MaE*t ^@Vfar ?!D2|^]?cY z uaI+Hp&{)x{+8DrPG g6p_F7𓕗' 끼n0=%NN^בqG$SRC`0i]? F^3wuF0(B"' ;Չlڔ+ I %)ͪDи(əXP0V X|Ff Dʳn 5w^VC?oDTipa""li cOd^xؓԔe^whpP8ZKlcA&Pn2)LRp~ёV_$|>dJ7}Bge>A Ayq6f~A\DEnG%=:c/Yc4axBNp`:3FHQ{9U 4GoŒI bK;"7}j t % D0BZtֳ;F2E41`HlŀԩQppñƒ#M[6P柁8]F9L'"]>ZHJ A|_ղ߯ſIGN B8B!K+Ns]j$ J IetuPZX&Kh4.vWx )SzqExxa/CəF7Ciʶ-I*Q|*4c9#,FaNθee*P1sf򧢑$-r%O%=٩!hާf}8 !l*7`ݖ"4L@\( {oF4Rl )6<)؆F3m:0P' (2%JT`7xK:p2&扯&A1M,qq,yS讙PX>!Y2 s Ыj)2 >dO=k ZHѷ.! 2@ܴ]\'H^n% zU Fh<|6LCֳd@ADѳ`z/3 tZ1K!-,@ 6dkvK=%/La YV!N(`-B 6N li\O6ƗY2CsaP> 51r8X:#6PAZ|7`%C8h&Pxer bro!d4k lD8=#y%>k5[aDgj֨0 7 LdB;tT@Ʈa#%eIWRճbZI qW(z&8#"%Y&DQ8|A,0 Hf}cH,B5pa|3W-5iȦXFȁH+ =Oa:AmKOcTakpiTy"N#.>޶&fh!Ab.ƀUmZ&ljʮ9Ӓ3O@| ŝzhuu"X:=`IKמSmbPǩІ #xz[!eD7X^;-\g͕S>.E4TCIx>q‡F)Rp'sS@)K箶X F T),D;HU04i5b;IVE8MutLPJe+xYw^c̈+7ؠ@>.E4TCIx>q)O&Cb>=NDA"qē_ #"9}]ؑO8 ɓph&㜑gD+ϨW7`ZKO syH5>lQO:u0mN J7Ud\R ,f$rЖLCdjbz&zo#:)t`ŷHA/6 IGK"Sf+w+ހܞ f yŰd4c,Sc* >#R{^r$z .:6m;>L"|xQ8qwNe 7ɐͩ?][i^Fra I90%-m{HmS;P>u"n;4ѬDdeR %B0Ӟ̮v/vȝ 24K< A<҉!R' 8W?gfǪh7V7Ju^dFЧDބ(InD!Y2 s Ыj#R{^r$z .:6m;>L":~0ϼ.p^aβLP&my 6%7P ˲ b ё^(:t0 <“DI ]xjmЎ+oȿ7XZ9I>ڽhFa7'nS7 z`B%4ӍpCȧAFL p8z'wF=>_%4 E"%5+#vA!3hE'JM8y2XF%Ȱ8#K. v"+3dǨ,Iz ,6.[Y #w[4p %P)NNNNNNNNNNNNNNNNNNNNO$?5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ˤ ((((((((((((((((((((((((((((((((((0`Z;F &5#yn(u0Eh38`d[ 3E{ "@n~hG&Q:yz'`G #yMK%d\xX̖&ZXZc)kޜA zaD0#/ G284ӮDYhV&McX:2| A(U>R " lHndwe]oetIH*; 斅2MIG"L䳚D% `ZԤD!:TCtI Z#,,闗Ku1[xW i ¶+1q"ʓPy;t:o,dm3Q+ 2uD2uGdDFXgn\M}Ӑ`c;lʇ&ʳrYLV[: khyl{̭ o$%@9hn "Kn6)"eo;W؂T dP(@-UȻ# HL'#IG8HtQliC"x^xތQ^j\ACi`y(H}1<0 Apː򰀊, Rᩗ.DCUE1bPD U]أ$ E0BMKT0qX@t  oqGsVRc]6dTWpB@ca~bL!Dn~,5 v,Op]݊2A@p$M퉋#&_ڊR Kw+͑B@잸=&ӢLm^x ݧt8&ld )jnbUA y g<$C Pốxh K$6KyC= 3$VbWĆu$41ٖl7nmLހw3XcNNcϪ? !cGaD^xn"x' JOu\b"cz#AD TCRT #&%p&o!TM~ۈo9ng>v/Du>ҷ aƀDjh34fM՜>W,L!/ &{r {@ZVov(8ΊC aub?6iP%YY*S}1H2s[v]t>A!T,@M\K1ş/2LH% BQ*>\`9N-=v 52%`͢6Vc7-ִ=&=at舦[·G8 ڷ#KΒ!vu4#EPŹsC5͆Ȥ*^ E|'h e[8hb ͒uZɨi>FIaZR>THwc7x$F 2ܥ .h)0,:_2B]w-)P !驪8y鶴DH灂\b'vhW4?̳؈mpQ|Y4LFzÇIDMʙ WhTRM|8I2IdExSy1K08)QHl."@7p:Q2"41gĖro*hfE"r"渚$kLʙ WhTR[F)!1?/Y,Lᨋe&ݢ0^엋ybbT $R@/\w/K+T*(8e2pbI/E tW$ud4!*u+LKQ$$겋 5_2ѐs|Ko"ɉd{8=uc&! C[Nr%9UAlc癎Ci|C5Kd 0CUu5l'F&Q]0=]eLj%I:+Olv vXe2Ժc02e3[yWPPB^*bLK h:/gIg| (@UXumB9u` "I_W>Q5Ҍ>F#%,ŸVcA9 5KbT׀4>=($ɡ:@.څBD80\9X:qB+N}Y_t$&IHMWBV+AeUfH vfӆ-$CpɏT`&gFDijі#SdP:F;dS!´e1 m WĚ6x+}TX?K!oum &db &T ؙA6 ^/VzD6a;^Ap!# LQ"s=c 8i|ݸqCNO¬1o%#]EG jE0FxjLd"a;ϧNFrVAZ;5rXB?O=2ւQ%A4mN CK*%m݃PDu]j( Rj[} (>GoּZIç!iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiih*tRM}"t8k/,Q]B ~]Ll#ϙgDbDc8RR\= 9R :Ө$|`Ҝ:z?cx1 S OذB=")_~D8,ޓڗY`Fզ1סZƊl~M jSg FBNYgN?S! -N&G_gl`E \= @%LRYdòXg\H4Ȑ~x oKP(!]&2f[/ʚ4- ~Knz(0~\b@f6Y>M@ga$h\Y)dhdVVd(FE.>馡wtm3R/MmUHE\j,t7,(`x@$Wx:+u`(s3kXu"c:Gb!c"&;a)^2pղ݆!(YJ]?4&r5(7pn=/rc L|a7\`M%yi2duB$`E&WF+XLL*d0ֽ| I/8Fؖ'ĮDNVJ+2ݧ [Dn4Ov<qW}eWH쟀c"%lP MopC&)BXrh ыVG0QAJ !Y2 s o}]Uߢ#+#_2 O= %,k I)軰I.g%Hg('ꃢ;%˺*MDiˍ>$.FK5 CnE:o (y5{1[ ¤7o %68͹%aaLGZæm{ 7¦oNM5m T p0Jhrm,(OZ +j2%$ TWIr q%/^:`nPø`%-铀Zŀ׌%A@xer@CFC_$1dQ٬!RИ"4㼉4|iD %W Qz\GD% XĦRpENV<ȎH/C} = =BSEL4{ml!+Ɋ@Ybq]hLSDaO K dā>'c |!e1"}^gʬ\(y.h$ƍu#B%>a|bGaY & |QϴsX{9y*s?4Ȭ4x?D5̻9*yu^ h:sIa%>!eGSˬ\FoJ`)I&%|K AϺkvsQT1H)6@$)8I#Dt382wYJ5muvZ<5,C2+8>vV#Dt382wYJ5muvZ<5,C2+8>vV,ޠ=EєSxE
n2Q#>k:SQF(H iV)+pwKvGIR]ҚV5mqEELkJ?M\*[:LGO(\l`k2q} 6&FgtpeaUj9xkXX*e7LVq} 6&FgtpeaUj9xkXX*e7LVq} 6&Fgtp438?gq3owq38?gq3Ks8?gq38ŗ;!" 1230ABP`#4@pQ$5Ca%EG;8pphdpop\m$^ ۓ87a'r|D/g#i#8+x'X,S+4б;HL97! ɃRal iՉKDx>7hJ |3lŨJQ4U#(䙮VXk,S+-Nh8RTf[\ wioRXĨ"yQ=`!kbG~I,r}RFQ%q:b GBG#;KqR s5VvIMbHP$49I,FΟ(U 5$zgg0xFI"(OP@Ps@QsPÛdM#Q0 Ҿx PyQX_%O늨ҫ޺1GlyWq|SyWEPB$o`! |K!T^kJ𴯔3 )eG7>%XUc&;HLS4 [`gݪnDڕO;jM( bR "y!~U^-)0ό6YWT~4QE3Sm<쫽VQ~ I%{={*r9"ZRiuVT4s=GbAW *YNWC9C"s,jCKgpNC37}*'ȲYsx{:w^'NN2~#1 ol򞦫o$Yh$&RSD53Y{U-A89sQQM A+42j#MGj>e!9UL {*rF$FNd"8Z;Yd[%dE)$u,1dCW(INWT8g9G+JS$cpQNpw&O9 Cy7!xdy$9K"bG9mQ :qf!h(o{[+vqg//ĵ>k&g~Lc@#/g0y~$$" _7uq;YbM xPy #r; @XG #y&{? XX %%; 9u^[1ٻ8Rvgm3[)əbLȚvti4Zrr}+GAMp怢hZf\3 K %3٠Nkީwbv8T;-+GAImite-;:9C)t 9Xc՗ŸNf_ o/_J*uA%GbQ~ȕ?*Jz3co8Frrggy?GJ?ХSjv[g%8@ +5Bhp+澥o^<Ǎ032"Cn"σQK=+@~+F楘Xt`MSz>1f¦z}FԮc#Qgƒtorwq1V^|(ͲxjrCd4-+b1nZ/rW;duwgoeQNP#YJM.JFgS=*K)(g(|Ne!DY I `5TJvzqel!m''ȸdu;~LLY? R/-YgoeRSy0}Ը=,2fҪ5%ERq#;2dNOS#4CGc'2r('ʥ d8'(QԘjYA LcY&rbLpIVf 2^W{ (U 2#9 HFĩNi[!^Zub5L0hP4@iGݧfB%BdfNҜB2S5-g4.+SS; Pϥj̡/f'.՞䬓Fh-b0@,'7aQC{''~_gynC ?>9)w 1a@ԭ#pn\AS7$͓⦤~A Sj3.ш*qVi)OVIJrOln3/5naeX Tq 5E rK#8dvkDXI$lM+i@*YLb2534a5lQBAp«}d>(U 2#9 HFĩNi[!^Zub5L0hTCa-OL(R N9̅J9'ٌ̅ds9gi eŴk@[im-3Jhid] Vzvyޖ]SwuqeqOodL Y<0=3H=H$%6ȝQ8Ivq&NyH9NWCkՏR*f6v+ (xb,\!D!mVA(F %S&LfR*Qv2rl #&f{4ӌlvRYZydPje qTڰ FPFzBy|Qxb#PIڒgPAH5bVS6 ZAv"RW%O(qSy0qB)x'5j*@,xIBns &0xdFb.MjMl'ra:x/Fa_M1udWv{2~n=em&+VDEԑ9vwg;~=ݹϑ!C: ЋCF:%15 0_=%%ࡇJiaa ypz9Jm0:̎sJby]]zb^,%gd/0ݮ\ٯ{\ݮ{;,R{x/Ӷjhs8W G[əU`9sig<^:0=iRMf*qxC֪0(F <ߓqEdutK6ܴ]PFf&͝ (XH5XUoŭ5$`RT4@SS6zdLF#SJ1j6㕢5)G`1J"9H7{,ߌgljH᜵XfҬ!)Yƨ J(1G, h"^#Fb!?uFUEIQM:ç!3ZZj(ᨌ$b ڡN0ז 6hH]$T -,eQv=,uBOfCwk1J1H*)])*-! -PBn'w'bۦ= pF䛚?HG$qB 6BG'zh?PA1!&BHYV~M|S7' rUs4ԬL^5NL7fgL^5NG9#c7c ca$OOR<~dbBMGgTfMOM (]AvȨ*`{8҅ܤAgl] G ml i\6dṅݐ|GݐZɻ2d??vBavAkwei 0]=ZzhiBR EF.Sأŧ. ;dTb0]=Zz|YYYYYٕYYYYYYefVefVefVefVefVefVoYC !1AQ "aq02`@BPRp#cr ?⭫J1+VdYk4RI6IF(1J/nj謚$J-뇠 6IWc2jd{Y$ɕ%'dxI(()!:Pt%Fiɒ1LLS&pJT;~F猬Xe]v2ǥGy&m7g"rx曣57,-ߑUxxlKiJqSQ'cS&^;M~éK(KiCDknF^;Lٙw/ $fP̥ي Q貆LmIs 3_tjE=isZM+$:Ԓ_͒Q"Uc4$iɪnJ$ (1tH\̬w?z&>Ht$ƍW:\Ҟ(iבcK=UfkxÚ{Q+8|sdk&F쐑S7*~DQ+#Y27d#A`#_iCͳS7z*g\A{8x 3YZBIPL!bLHd7tcK/S/f"wĤGu+GMu WLl;th~< *=N"zN"ĕud̢I)3:^$J;th~43)2gcfGBtƩAhQyZHN!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B$:'_܌"WnFV>2*hf mbMY`e񑡩lIWӡ'ﱌdukz!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!Bz,`5 J/X]3lt'%^>敯Uc }JhޏbW9:S|?5umĜa)rs_h1wvF177-q17̛F^StX*%L b}OBu#bt&u#YJNLHF [>ޮiO {>#>#>#;ˑ,NFwS{%b;*}Q{uxȊ0%dk&F쑺1TBW,UN8 po8q{5L}r7oH(Z.pV`CrdFihe#D۬0H$2Wd%KNC;&A5<~ctz֏(}+jnISyEN&ǭË]?ŧS|sM|Jg\;+lj];{oƴpret,q*:88I^8JDoS%{mI%]D:IbJڒJuDwYԍϓ*IbJڒJ=BIbJڒJuDĕ [xg]wom(}4I]x?Xsvcy޻7BWrMྚVY<ZP~m9mjWJM|\{WMӧIߑ*u5mq%^| 7N&~D}ǻ6UXsvcy޻7BWrMྚVY<ZP~m9mz]m+9&_M+RWc,(?6ݶ^uw: 0p!#6@AP357`14a"2RU !-%s`!/hXqȈI|k~rŴi\@̈ސs$%g=kGwEL2Y%ۋ2aOvvv9}(X m-6N#;B2DyUh_J؇ȋ$ePiV_l?ӷZ`Xt-rteB u#EG;>ftq G/Ri)+}]PteB uяǩόBuP~|_Nю~Xǣ|YSxJ' T1SX7[JǴKM))%OMdO&UAWOȚ%$ʛ+~Ճ>"Rqܓ՚nh$RSJ]Q Ʊgu )2w޵#BX) cXYIҐrT4T∀"_ֽs$[$ȾC5B?L9b~4p. KfDxoH9KLtQeVwn#;xM- \"[̊9M"HK 6_*wG!WS <̘^QDnOG zFtv6ӁC; :#ky vLbR+.eNl8hT}.~3u'eAwj:)V˹oiB8?3Ej% Q<o*o]D]zʛ*wP iXbIE%컆Z^ E)vB;m15$ ϺEr iݐ:s,I !1"2AQBRaqSp#@ 03sTbP ?KD kWvf"wI>԰ʤp >_AZ$}„(`Aa.VN9rQ+Q:0ύ}"4a"o+ ⑌fUY2z O!J* (O ʴ$9~fr̤c1”YwudxsZci."N2mZCe#1ăHR\tBI,+$;nJ \/ĉ'K J?ִTw Tħtu06kMiBՅ3 "ZXEiMHsrHǾc).8δZ3RgpʝKa R ܠ]gZ[kRPÎ=ٛsW"*g+~i s)ƿDP2>⭉jezu_nRi]\Ʋ,>%ykk*B'#}4JVO}z{ Jl x:gGҶbA 03 ZCh3*W*KzCH&m`;g F!#}hɵ"imR>C+ sk h Rۘ RSϝ3 ZmoUf||)(*F ỵ8IHFiM@ڕ(% ^y#g8%<34􆑺Lve$BGɦR#pSM%2 **գ{ 2: ЂGgD.[@)^mI'y@H A D`GSg8P)1Բ;j .QZj%j'^ f9F$MaR1ʴ86&OVA8))EA% 9Vބ7/Y{8R.cLm%\QfMܫHl\dbR8p6<~7;VW4q׬*=e..)<ȔXf'c@:,R8v{-qJJrpl98'TU#*otmBs4sDZV̉' 8=b/)'LʤϾӚ"*v~Bૻ6kP|>%% (MOa6Ft &݀@'W?:f ٌy6qb sw]#ޠ>@* 1M8X)UzBDzV$#64Mǭ$8eMR"4ڛ+S=MU״eMs$|eI+Q$ IJ`#jnILO!HOtjʛRLw}XDHR'+4ڵ}h6ԻsI*Qu$C Dp"{V~_ڛ+S=MU״eMs$|eI+Q$ IB`#jnILM6W^oŕ6-ԓ$G )%* M%34ڵ]{M^Cr$,0AIJg3n>Υ_>38hlԍ%JR NTl}"wJuƄ!ŤH[Ѽ*('IB읮!IP Z4n- ZJ˥ލQA/FrA5lE:N a(2w Oyino !Jҁ=+BfmŶ!+ZIZytѸ*(%\v<ƭWWgR3,56-I%I `LmBJˤfvNXp`"-YԳg/!1AQa 0q`@Pp?!V86  gɹK xrt)mʷCVh hr) A%o r 9ei #ei:@U"l;f uwyx>22Tng&I/'Μaʓz T,ݣx-IFBc"R1/]9|6aINVjof ͛ 0C6??HS$ Λ QXOfUBJtX ]4;o.R-͂U b4WC氒R(!Smjz}S_/Bۄ,_[e w Ё03U2Q* / ـ+Updie6Y.jKX1e#[bDٻPo^2`fPThx#)V~N#u, L8:z3} qc'Fu3ckʍ0k K?[Z.\Dib4WC氒R @ڪz}Mz$I`omS("c~=.Nq*Eumn UL{MRgJ4VH2,eZG@m^2baN`u#8*_Rľ \ Vwce:bO .Ba0 &;~L PaLE"Ը-jS4-+D Z0@&gfˡ5AW Qq*JFù_ʛFއ"«L`@v e"PI:yOP#vW=v &-=O?x dVRBWf9hIS|'@haԦ7%SDsVp32$ȔpM/CI#ڹ6 c',QQ"a̩w @Gd@.&M āTQ UN`+ u%L\0}6%18(TG Rk8Cs.i0 MЎ0ً]]|P3?tF2]##mݾ8ŝ6#R?ZQcmRɖ{ב!chQL>-'#OJFiQ4]Tfy%"cV|f Xj{ RIf`Uzh8qQ€4 <5!B4xOWQe&G\? IóByoOnPpN+\YjؘoM:RpqmۄKC̤Lۓ\JjF!MNu#b\Lm; PN?nN3p]k5T:QjPYso|{B[S۠~b|;B`H( _6*#Ap D?*&k;I~s lI G8s!qvMq?BGM,ay2RКBV9D1{P/W7!.Ҵh\6ۆ(:‰so3ۯc"W`/:SN 12>GKYr3vhhhQ0{Z',2|(ƣ*!NPU$" +haY+ bCe āƚ<6 f.qtqP.>=S͡W-nK$-wcgw8(D H29q&Cux뜫'ǰہJ,wey*"<ⷀ%Sm7n!* [ kU[w5$jZ,%N+?HTYSY1j#Z_nU+Z8`!?$sYuER5ǂJș5q f"FvI.eH#Ad@ @Hq? Wi7=R htV~":cGHI v4a֟ CEH]&H׾$F 4KLiAby j_m 0ЇPEAYEj7ҒBV{{ɸ2N1UQMtH׍t2VΨR=:R`"U@ʙ6kR[G{Ԙ+yIdmUS4?,8 1ѯ֫i"V4J}/>=sH,h熶k ePE9%0LV o a! $W+1jBLZBXbtB@n`k*O4ӞIz~;B&89SĪ ]sp`zd',@kA72nR@rÕ:ps;\sBz|q [31lOG@'x< KhFU,tcT4ˇICMɱ+''+f L¤N43涘ˊyK҉ DQ's7Ug@B7ڜ5;z߅e*~h<&̪Aܻhh*v%E]1 lZ9˛o_ghygKa$30 QCBv.)_ %o3%ɧj9X 5k=,@9;D"`gq e(U_jVFm$\Ub@G|J"DŽ l`qc@uo"]Cn[b{se|Q \NYIZvк23H]xu`AEGUqXqi&:t]8RFHx;&cK9.~4R-KMb<1y1"7T,!Kn:: Pi+nX@Ytl;xs\ޤD&v?v ܯ}U7~~h~:6 T0bSDz-0Yf72Fo ,0s ~>Muص͵ 0#gDc+-l|,b2:vMc|Yۡl25-S%56u,a'y1 r0pfo,$8'PuQJ|@5&QDxW5l-% 5VaLo r 4e\b$0|UCi/ #%m s@ ]n0Si/Ȧ#q[FAD* *tL^tNIicdk7CboZrbU"#`V`07AAя*p9VA;#HV*`r-p9rUJ姩K8 si kPΐ"bIq/ "q)$i03Z,If͒Ht*% ]]DƘtLD8r>) '\3EPqಂ s'K~dM 4 R=$"OvUMqT,Z1OQ֍hnI"NջN~qa YwʋA'9)J8kzqS*9GD=NRl഑F %_.ê ي /NSaN%|k? Wi7=R ht[ J'x./SRDbl UCGʤ08v& |:xi$VKLiAum j\h>9z)eGfv+Y춶yK @?Ѯ  zmX'40 nPS]Sw]1?gcFQ:QH/JR $}leU\"XLYB_nW<*oO*R<֠:7ђ]5>%1S0><ÛPtQ@f)u"APF>,ϣ y6!\ )Q?hkے YMAaFz `l[I7k,: p4khO?:A_#?Mrp^@56mVPAOh :) =66a:h%uD,|F$yr۬b0(az|L(& IBQBHpLB?R`o.0VC0r*Ue=PK UXU&,(=z#q)R6FmۮW%a؀1ng 4f5KlKo50H,űm'c: <F@(ah =5g.^*2i᫶"vuȑI5,l12*G-i{į8Uى8OP0~o|43kb؆Yďڴo =Wxlg/bn;車#)KDk1 Y$^B`U/C:tn~fRhoJm nƞB0OOY}x3pęX9fR|ㆋST.qJth1ۮK\^NٵyKn~ѡ\q֬tQv&CL#&\rɗ\hLNdt=ܬɎx9e\v$4"̾B2<NJ ( A/r7^oE$Bƙ~L$|]$2RRZ[Jq1.w ᶉBFCI-NɀaLD[hb1 x4Cq2@D5L)ktoy1`.M"\l KdGW$ɯܙcOC:4ENI'Vѐ9Ў8&!iODj=2(0H":)7LhP}? ) ;~#T8/ǺqɍeoF.}T#;CZ(ҡX6Ff/G)y8 PY֦$)(끢$$J@5/܋%PR#m*1pvT "W" uBzt|hv'9jd&Xn \B7zk)䮩|%؏܈XΪg sz3)؜'U5H`ʪ E8p?ۍn@ܯ+\yTU%Ax)C@ufow%tk|J-NclC7`+|y6ڊ,'4#š!yT'K3rMHk8W/hk.6 T~xv䣭w1Sfd?1XQ^(0`x 9/Df}[I1eNv,G\5VC$smPՁ@8:[JhU& =]ah ="V^3Q#e.ȼ;\_GQtll۷\J3 ñk;h8ΚdQ28h.jJc}9Y_n^zKڅZn3fO@\j\ 81TEmu ,* IJr޸T@#ag+0@~73Oȇw3G %iv7$Nrb6] l?1 ]TYu v0Gу3IK&IAg}(Fk\:.!\Y:ph.M ob Gǎhy4aȘ'r5F;d i*\QJԒ Uz\ =g3zH -]FU] Kqm(ayI:liX6 P2޴(`Eͧ~`(#=9S Pk~i%Ã7ģ0rcW-W#tA:ǬM5Y:ph.M ob GeWrt0""?'!00* 髉NZjHjLT)^+L1a4|md i~K# \ 9r&qc֠r E٩=.0XSοLk@w`?t]` ҉g0*ܗZ! :fa?Kh ҈4@h%E6vLcO!]'ˬs>¼V]uhLq @γB) QveqE8r: ʤ mZӂ?z|ɬ]v fvr[`22`l4JەNL:D"bs LgLsǡ6'Dh+.q&`8gYeuprPYA y|둽r<)%=.4a#i$IWOppO O*J7M4@h%E6vLcFd ,:CaEf2X{":>&M}}$MFը,:vRI<Mڶ΄q(1ccJz%U9@pم.EhQHfٸ*`[Bt\bTCkr+B"!"yv?GG D{s'{s 7Gdj)*~ 5;m! Sj#-nH8ѾTms̀i6Hv3J3/jSPCE`]( (;PBV%f.ǂɷE8yw;jOB_@ \]pZ9[!%rp']jCW17(mIŇ35F/0zq;A+ $!(*nXmF*B9F8S; [2fu!Y UgJ;/!8HAzS2fneFJC]ipp7_i(-sk:rlc;8 ;Qa4N$SyZhWYtDm t$ZW0Ro&.7¾knqBù$ +7^0*h!0Ig hAo lkO.4J80-k'9%-*X#JaXF,G6*qMOQS!aJ/pT"L3+rfW4k|b!W1uemOcae®Ә#ZAc b'U0w\!n2ՐՀFA񽆞'cK_THp%//Hc)J.O #4 Ɵ4;m4!>CǒX ճݢ_:,}Ҡ{9(銫i-JkSJ=*QgJӛ 8:Y ҈.XkN1`TaIƿ/'z_i"!'ƓO_L:FYpmN@(qL%DwGԮ\GJKΔ¥jkLU]Ԕr8ibK9̊uÍNX6ߥ~u$j8Xe]mAa0`S 8A뇈C#@]`pd>y/T $D$rri*0 <GOTZ]i 3_F- QLZ~ 59c~0 ;r L|x Hmk2>I Wfbʼnhq7q0@)Ձ\«ލ;`fCE$qq.JZ0BfD99彇7PňX)m5 ŮW!vxI=Cu (KB@@04auK=kf)~p:'wj#2('7<#XR#a.qU#ma30}x6 l-GRʫh+K)=):_P_OJ iŀ#_YQqv @a n'p:hLtG40J=G@0|@mٙkͶ0FKvjUꗦgW7cVh?T)e]05v'DTyFpĥbKE] p6]lYo

B#L0peo"`Ɣ Lmb{D֝!I$I$I$*TRJ*TRJ*TRJ*TRJ*TRJ*TRJ*TRJ*TRJ*TRJ*TRJ*TRJ*TRJ*TRJ*TRJ*TRJ*Tܼ\k7Jʤ9(ugG<&&CaXkxq> _"@ Urz &D2Z'ލdL{0 8W&Iֺ=ٯg" \>"JGE( e5N`H"[(Q!݊EԠ2Sjt\;T—j0ƲKɁq(!UpQ!Bb9>҃W@._2;5*dl?ݺrQ?pfCNפO=1IN$H5-(v҂dkUvȳ&, Kp(O أ#g,ڀ!a8ȁx(3TLK:oq0]ZJQ~܏_'Y[ D?K8VDrA^Ćfl-paCVoËkA,~Wm7G1~{ztBӔwoCٕWۻ Pr$`EQzޡrgi?7B޷15\\U,E7~H@8{5IӔwòӣL<5!-V%P䁆.ؚ;! 3xP'(v@ D8‡E[n{CF4^p?kim{4?FDmT˃nqB&'2:VziNxLI^i&e{2S[ h Er?> rQr:A73\ ,{ 0ؿ9$иp3xWf <#B9;:%Xr&bpׁF-f +#yG*Yrv tJMӶ0d\}۠R[^x7roJ \KZ.=rTx^rʒ.ܸ2M-SD4nQC)M q'F;Ǜ{Ǫ< qzFIpn\&7H(!rcͽ׽r\r ..k9vYeYeX]ֿ v6YeYeYe N?,,,/!1AaQq 0@P`p?!@d3~ ,&2kXD$8c:.&ȃ xIdiLgO>c?`8k009(l:?/bS+b€3AAwR*%"X]9$(.jP[l\Gܚ2cznS(%U"S <[ a1\lmQ5T!n@rɈ8dwEu#T73E .+ODAFERsX 2Ýd! 0uhL,Eq@)5(&-<  l& _sNm"oBc,So #;d S7DlӻXI b='ODDOt|o W.Gt  ""m3 [A e$X/DF$a>$("$B!.HTAXD͔ 1sdHU\pL"S  "`DiEi[14{3;3"}CL&J ܢ4SJ'4N`^ K5-*J DAouXX aZ-lrM(ȉآI~Ӛ qJ8~,SBC†'y0` N E4-S830PaPzl0N8ȪiDAA`mLӣ {( &: tC.ТPwŸ۳T8d3~ ,&2k0?6,[aʜ Ϙ1E@dP%䣱 fD(TK"Ds?Hs Q9h\عᢏu4dd0P>KD&DxRH\aA9@ Q;Q(8gUL H-?HpÉB&-D4SXEb3N"Q(!|!PDFgL’?"  E&F!]{)-eC1np`DmAHzx]CBlmѩ2F(FZ(A!"27\'ȌvfG ƌO?atpWR]INF=d71| "Ge0qS)& 'k-It>0?w*Й=j1S8A?B:EFl@t $?\>&;(N!uB9O>h@ 3Vq$N`0`5Ād`c" 0(H%Gcw0}:{.sFτ$Йuv):z$%2{~ PBr;D ϸPMh}% j蝗-D`0h{(|'|&H1# *G &~h}FIDآD5o|_&r9<_$@X$DA{b\)$FN'6P>P@6A"LtH:bOhuN _uNEb9: n !Q\!/ @6B;  FI4%+G лv !ri q.pa ?elVLp9tw`#$HWIIH3 DX* $,<*m(,f zAŞ9}S>q z{F@`9w }"'p`X=w聮n³$V! Ш @F9EY0Ra6뺆t.Cnۺ`ŀXDG N@#|0rV<fNzhxY ^I 5Ņ)DEr@ @E (IrI.${`LĖ 9|Ih8(YhZl$C]RyPTD? '^%e2ā@U\!;([B$msz&@`׏""1G"3pDZ=Bn/8/A0AW|0 QKwLCCԅ>oW&A~d6zŨzDq( y<g82ISCÙE.p G)#\EbLq#H2Gb@ *.BLD9 MȂ{(ΚPp# cs1W qH 9j[@2B.zЀZNkt.@'nC8?h4',f7$,u"8F\$K( `) +qbs Gmqs? d9"٨ȃ bR xSuۚssؓS,1{FW(AaS( \a15:Qv9SD @AWb,I`&,a0Sh<)`9~alt?IDLC; N@DĿb蒃_Ju?!\H?)S/ ^.t %3?Q8P}d 4ub #3s|3"a&`Q(A%h<W hE^4<ſV2N aV.Tȁ977K$ni;P{ %OH53Y|p\Mu4(yفxDr$򐄐nLTKpF)d6_"ll̂ z!Q?E`HkI1EvNbISy{uN$> łC(|i5X&T)^HXyUۦP"X x1ŸC/_Lw\ dFh L*H3BhA*#!dB߈M<_Á2pTSpU-OBHEM 4f7!&/MLJ5s|hSX| .Ӹ/ '8S S8S BxpOC%Ч ppqTQz(p*>.z_0" ~D)jn"'<]dHOB-HCw_ӸvEiZh4V+MEiZh4V+MEiZh4V+MEiZh4V+MEiZh4V+MEiZh4V+MEiZh4V+MEiZh4V+MEiZh4V+MEiZh4V+MEiZh4V+MEiZh4V+MEiZh4V+MEiZh4V+MEiZh4V+MEiZh4V+MEiZh4V ,O 㘇$<0-#41K$0PAL*NׁDQ42G07IwDƁŃcoπC82PvBcS&H.EigMKL60 K  c,Pba[ DTlZq3V?}\ fMDS ، `qQ:I4eA܆z"#+ĂCD`3BharCŒ@OYf(rI' 2:!(0*4 ~nhBh 0H_ K1'rL<84z= L1coπTc5p#h(h>ͅPr$ L b 0"@n1n1d΁,F<'8ɀR/s'Hb)1fb"DI-A $'ne 9$Pa<^33Fx; C)0T#-5 "&+*[ &gE.1 :\@D H`0`D AQq0khdz؊!y ^B!WU*y ^B!W^7^nxzu׍ׯ^7^nxzu׍ׯ^7^nxzu׍ׯ^7^nxzu׍ׯ^7^nxzu׍ׯ^7^nxzu׍ׯ^7^nxzu׍ׯ^7^nxzu׍ׯ^7^nxzu׍ׯ^7^nxzu׍ׯ^7^nxzu׍ׯ^7^nxzu׍ׯ^7^nxzu׍ׯ^7^nxzu׍ׯ^7^nxzu׍ׯ^7^n-1pqij: #3s|3"a&`")"B8y03"8i HX2~# H+Ѝq 9cFn 6p?4ۇ`_HX Ke.b/_h+D5S]rM+uv^H$Vg T޾;A rLdd'0 3cѐ,K=` (@'~ܜ tK¬z4]bCJQ1(> (fd> krC#6AZ \1 QKF)9vO>+&0lL*L'C-AbF;a>OUpÄ x9H/Rb " CA&z w3Pk@gUI%D 2(ɫa$AE8g6 qLzis,fp$LLLCuC-'" w.T CUA(|"'/ 6!vNoQ `DH-1觍 X`q2DQ8q4&ÚOA2h Φ*9@ÿ(_TG f#!t,]0hu(ZnD!FtrI X) `:&0~O4R&I`3( "H1nlL X  9LD[pax)US8o(q™AlXYT!btN`:&0~O5 uC ]LD[.i8E d2$.i8˽(Cb@@ (gQXӺv48 )ōGE4D0H` ~3A @wZ&%!رȦ 8!e\I$% ˀ"Pd q9%& "$~wF3f1̠1 &/RrJ3L$@D2H0(fcUAb (M,^110 8"B"$0pw?e y M;w`PC@XqpSHD@sQ`4!$!X u hqR.i` Ê,f,l+a[ V¶Bl+a[ V¶l|Ll+a[ V¶l+c_0!1AQ a0`qPp@ᐰ?!Coq^h+x=';W*@ @@aȎ0v~r1#xɻuw8=e^yU/ H%2"w\ڰ|JeӇ@M,B$<嶣s1LWqS^J*U)8{D #mTeh3!T$=f kkRJҢ,pKO^gY ۠t0X-sTSұiB$N[Vv9 @0al2JRETZf|O^ye\s\TeMCpNq\W+Y^5RjNJW q%r_#^kf%a\[Pzm{:~ ;NץNG"Pj,% yya\[Pzm{:۳DԹ7;HaQPw1Q;ᎹfQ:xz;gS3|A{&L 4 7q M }4 n.ªPU> '8 [GE;Kc'=-b,آ|+m绗/7ͳ|K5(t҆kc3G65ZCkyT$>7{k›* @@h0PU> '8 [GEgA@V@_Q6hSV"PܤG%UaAFE|[q=Rw|[sp--eK5.u/^f|:2F2"i:f=`- i벷AgфwY,{Z\J,Y,Չzq{T;I e9BGSdݏn:ts̲<݆QOJŤ ;mmX>I%߇iR!rQ&a+H_q^ ofVSWA]ڣRfIq-p,l]0<$5Vu1t+1M&U[6 Lђ^ahgk( :0A4ƬԼ'i4LyJ+y5 RJ{VcZJRXa5h|O0c?T-=6=O}?GpupxCP/3UHryBQnnyw,Q={L1?JqkjşO!x!;0&pw !3ЀW03@*-41SH4=O AT`((D_h*-mb-bÁ\6.[aožbDC&堳\`t.UP-RhۇCF%vP"("Rr( ՝O;fU(X$=]e+j0U+q2& %ۚ *p*o˛7.[1Ծ-תr#5/"]>EP:+1=sǚU'|Wyq:bUv.|K ?\z@^zɑ>.{ix:;=7uӼuGr4H| k$G}#cj;\s.14W =Djur3!;"}4c/gSe7A܁0DLЃI! vD/]uCP#;"}bk*EtJs+SwҾyUk  C ֺ bjAMp{7#=tkI?wr_WH\u#k}eq^AW|wk B7  k5.=E5:Hw|Wˌ|Mw5:sgr\`ZB1gac}k}Mj:8es;gu*q#7+JbgS|Wq%S40[;ØJT8JLNyq>D/]uɎ7*`((1y3r~o D&'.R~ + P3LL)F^cWMM?YV20Jo׀z`a cw- "T[Dm ᘦn廁"=o׋o)\-- xx[f " D57ko z; " [-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-e؛7S^ܨlf-9j yβaI m1CIj.OTn_~k jup 작h⥼[跋slܼܴ[~YڂsOsOsOsOsOsOsOsOsOsOsOs| ?#'zO&c|*,m(zqO^bw2x7:Qk|N:ǟq8f^GxPwn[O7Xj3=F_Ql'?7 TZl7,.ZBQ}̵g󿟃ܬsp|o/Qu7wg=w'qBWs|Ρ:[޾{M513 !jALb ~& Spc:|GfW 'CLm›} +LIdxhORk1h(t1.>O,AҦJ('f#CR/ R?mҟpv!O}}BA!QJ#`?śIh F2 T@ (@: bRTS 8 ۂ0K0^JeG!6ެa$W @≰a@q:z! C Z]1Ih>k k[) A:dTqc!!T|Jp {&֟Dڢ`W{RP`"0v st%Ӛo_abh:x={]2  h#@+X0Aǎv$@cxVDTS 8 ۂ0K0Q70C&P\?]T =YeD_osk2v SZڥTf&-+¬%T]<%H߃gc)7KTT W u- U\Um:AQp}?F\6zu)F5 O2]TWSY["N;X9"d9pi{蜪XKt%k @CCQ$@ mTdaeRlfp"O B4~j3L9)kg$dV}6_"(iS4giDpB)oW]٪刯wo#[H#1Ut6A^n 7%#)I]wm*X0J8ev]@'5LZ,LE'0*Cj2`m,wɎr2tQ@~~aa JCg5tk!ِe/+ }}^Qkwee]B`wpOQJiBS6Obá 4mچY_Dg%Э/U"l~PWnx;jAzt4|davpD"" ޔA Lj170Hcڐ ߶)qlҀv)QV[ C@&2{;>@( ]j8i!I:]HB-D5#%{h۵ ֳ`K:/AvA< pT+>SdAPXHUJ0 f5cR|(Gapһx{sޯ(9wg{n09,d X l\*^U>] +Z& Z:UYp/ƀ [ ss))T،n qިD~֔J4qZ 0K8Pl* $mS~1vLG&:k|BrhԳT)͌^+$.DU% Po 1CI>}߰#e 1T="]#(bHD_`ˎ:xt%Uy%cU'J^ag$rQQ6@ⵧ!?a&EI*!BBVGC+%4EՁ:$HqU c% CChYϬyVr ARXN\:.u`-aU/˦T@jh,U.YIQ* (hF^<&6f@dz;-[&TpT4&^O;Km eFQEMyAUT-L( ږveS@G iyyN,$7*Ru@r.n2wDYڱa\Ά2a!+'']G۲ .W՘:Pi N& ʑU+e Yg>Y0)Ia[*-*^KBhp/Tr|^_cjiNM>n -@qRpӫ, #%^TeXH_>+_SẏbY3pw yY`Yc&goF)wˉIq`!Ҏe)p0bˣ5. 伭:%7<,-iF#ٸg'Uip8f݈nt v%hޱ/c&goF)w!e&I3FzJo#wj|4o>i{3/Fz@]&ErR.^$شԅ8: 4wϼȦTsZb:65YΌ *0^}9=A*'g [ 1A0 VI2(R{#:M 2c:E4Ӹb*] ):$蜄,TZxv?;JŋgLb AX ÷jLo:DEV!/"`-DSi:W$MP*g OW}Wz~I=@3, a*U*ؚ(PXu8߳\Z-q6ϖ 'E"Q:kD~=u, >b'g)2PYVs"`()"*06+ 5J"?=1Pթnno !T g5QCH/t5RF'R/Bl_<""#{EbGCͱ{%tR/ R?pJ68[Mn&0iOC+Lj"(.EAq10)3Trk!-̦Iq(dє_**nz\8)!ùƤ@G>fA*Yˁa8هhN l2"+M@D@ͦs4=QjɁMb$lhU8THދC`X{al F)OUMfm=\$C1;s[Hywl Pu@f#2KDL  A$[aԞq5/HJ >N_K- hArJNMSG&5Vk:ɴO@!i&4U7;X~@ _iHkCG"hMOH6'! >$`@6Xu)iq AJbp *,6aV't%f0/]1O]:&&/ '9J!@oZR9+h8>$bc *@(E N'd5&a4j)G*GU&  E_T8d>hv@ʸj l~ྛX{ Ta$z Y |BVPU#Vp%) #e Yg>Y0)Ia9p$DyՃ T`f.SczPVŠWdI%Ffg(TPx:ٚ@+l!QYRҲF7ԚNJ z>/i`F3G6 yUR7 *@APBu@ÆDD! t 9z= Cة[>:"$AX%L;.TOkT%Ҕ.a3ٍ .檲6{ p4K]U ,gb8/ ih;b ((hQcIRA60؜\LOno2*bf(2>Tn%&0ZpzH́Ȱ p$3y&5@hNVI yYc_&-4@<h]h٠Kßz_shlDγ#7ĺ˚z*} U.k9| 璜0U=st v%hޱ/"B=V|vD6]Qc$Prxo0F&x@XF7${>p8 /4hs'ƍ)Az$Oai;$ee%]W0UG](T @V[I2BL,jXEm)#v ]wyh+:yzyX{ϝQ )f! iD/K4`9'f4C S 5l6"ƴ.dt\w`3\3SEO ܩ}͙ɛWuCI`e ( ̀6聃LQ"꠾BBD|NSW͒$&u@}疊jR %[5z0gcXr< )גdq b0}N!,%R9>`0nrMgPgc8GK_I%ɤҰ(J]TuL%B5/9NҒ8׀LT֨;d;"6\﬌GA,(؄b!w}RR2tan:`WKρq- 99!0V{NAcZ>6};|#jCx3s7N06 pM 0}9t4|O鬟vg+elFtۙzpi=*V\4 2cCeAhD/؏_6Q,izut%a]h b'[ =- x +K;-/ths߄5 ݖ!R١S"νv\"ё]-2y}X"ߘ(915674QN4׀0)'_Ù<|{8J*jopLςa@Qڮ܃J.OdCw;!!nʒȂ3B7"tJjAF:`'Ղ-_cyqSv9xO5q'ЈV0w!_bmlx83$S4PK l; Jہ`ڳ 0@@g;pS0mYUMm96FP|7d#Mi[Xb3)!#Nrĸ>@:KKâ.Q LM!$! {D'X?4H|$ )Aצ6lA^ܑT%-$h#;(M#s@< e_b8hpUBT3do{ݰfx">1!35LYa"!B8s"ñ-AXErq XNR.tBS'\_!_62ѕJo`lh:!W2<pH7;!kmN>̡TCf/Mi 3aSFwW+RW Le_oR9 l9J %}0JLC sT58"/=fg'@ơl*5z4P+Ҁh~9iTur. t$G;q/"@2g\1yh_z8?&pƄ$AaZX0P[`e[?0j1: Rdx6bk8FSqG}lҜӎ0n%9(:,'E-!B6Ivݗ+7YбA}Q =(c z9d {"!M\gH9\nh,XSɖr^S ps綖c\L`P҂j82Zdr=|3%b.R0IzYCgDx6bk}1qb;I#"!D*Qq1eT xTW!L)j P,;Ȑ.}yQHJ?ʘJk^r %q!˯EPwŐ0wEl)Yf"SY @Q=QIB6Ƥ8d Pu8 LKZr rB:atƴ|lwSFԆfD$n#Qa4#$R8EemAș-ݴilD9 L)j P,;Ȑ.a %lHU^2]m ;J 0C0+$:}$WC[M`],R=҈ d@VR5#iDF<'5Z }u6 Uh5P4ACUA?i&. K#N@6_y)Y0$^u{&Ri$` Aɍw 2qI:"FaO<ہ+PEs@hz&Qg0 WeznAi%Y{ͧX!|XWwFeIdA:%l5 0 Aɍ);T8D| }zl;h{Ȏ/16[<Lh)ٚT ߥ@ry`?%xmmYCZ| Sc8`I)6妶iKfiɽȒ~OθCO͊@*9A/g!-.>D]Ff.bM14)!b+ҝ"\.M'^ٳ{rG R\l@gX죸4Y4|AXT PNA 3v}$Hjt1eBDϻ$:ċTUaU8Z|ixRkp놪"U<(m!~r&+^(4ء HhHӜVYܝXЮ;6]2N%*z`BCnJl^'H9cչFZz!gР̂ ͹"%֪k a\ he1^tΌrb'[ّ4DM\-H!ž퐃&JZw?5d} ZͭǬQ :%:¹*7~`*PvI:{az btj] ]"yssNg̍>ܞپr!ǝ:9-4qk]"yLrtPqZTyzl PZs<~g9m9GﳎF_nOz^?VDl\eZ/;-s ZpEj8kj3oOv~s󝟜g;?9v~s󝟜g;?9v~s󝟜gV(d@")?~8pÇ8pÇ8pÇ8pÇ8pÇ8pÇ8pÇ8pÇ8pÇ8pÇ8pÇ8pÇ8pÇ8pÇ8pÇ8pÇ8pw&XY? @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @&G(?k~?*Omg#? ̦FЋ"^A %=}[J! Qtb,l?@ +0_O F:ʖ&:La2tg:Dnw#*m Ċؕtd43V 15shVʡ_K) Un5h1f]376~\,CLai2EBT_z[cpai= Ć ߥzKbOxb["$I(PcI iM6+T3(=) Rj`dEZf" $Tx3msH#|(,? n]1#ɋ0hn@ t FH%`WiLrC+v$PK hy\-d 2O3 ,\a̋Vn@&mR}'8r/pN!ȫfQ?q+SnH(sQPYz#]H1ڽi띅 l3 ?ƈ J%#QhBN0B$bg*'1:Ϗ?Kr~%b@4& i:t̳_ l7?K[r*ɧe SQ*$ iQ j/E8QE!ᥛ0Qup 4NΞ Y*֍(@#>o*\ 6B)V$ B`ъ'x"υHp>6 ~?< :y'nwI9iƸgsPƧhΧAefj 4yuT MPE*Eм5P2v`Qڷ&˜&Gk"LOJwZYlTE_.2:\sxd"%Ķ9 1W%.;Cy. i:@+PdKOxFݒvUX F(eP_93Y=uƲ#v`qWVaa[<so}`>p7d!z}ڙ~.KkHq|ZNP%xJKڻ*,pG)ewinj*V=kpZ5T$k.'+t>58 iXJnE"<ղ5 SB&>nRz(M;KLC*L\y=M38ӠDA.}bkjU|!{ :C :(@U)R!LQx^'[ŔUaAP*q%^[5~)m7,l JJ#!FCS:)HCN@Tve) H9a vizZCQ/2p n`H&G' * B2ķ82NaJͿN:mpM q śDR, CތL;g(\[f׽IkR(?DKCF?=rt@À^N 8T/oS谑$M z N~p$E5Vn+b*3ĜB2*7X ِ>o((2[> *0,7F<,=aǽPp$хmFO4@[kbUP#2Af`[n @>t+x`P㳾_*daWP/:MxE #u'';OfGYSJZfLTӼ7?a R:Yr㟩Up6N͒ (*]P~ Wpеwt30jO7F?!f 0,@.80( 17@D|W8U)qV 1|lɓfRU "\ dG"v GW8b b˜ teىC{ޗҗQ!">us4\+)4ԛue:*_06 CW-x.bh\?̪ XBY "íNmBo #3zfV/cj`Pő<\b|hYr_0ͧ*,(%&ԯ[ `-e&,%Qb:&$1^F3) p[@!P7:+ymjLjI3h MnT:*8O`5B;45gX>AmMVe1- 9Mkuu7]Tǜp0iJX_&OoRt9lub3aNFE*V ?xRQ"M6d5*nqc'ĪP գ[%M¢J5ei_)\_mc&YR L ` Xuq Ю#0h~?Q}ees|U=Wz_9s|U=Wz_9s|U=Wz_9s|U=Wz_9s|U=Wz_9s|U=Wz_9s|U=Wz_9s|U=Wz_9s|U=Wz_9s|U=Wz_9s|U=Wz_9s|U=Wz_9s|U=Wz_9s|U=Wz_9s|U=Wz_9s|U=Wz_9s|U=WzS^5qǨ 1:ČΥ%\8ީ*743HM M6Ss\Bz-3ovrO]}?kP5!  ˩ᑷ}q zrr(P7UYݹMYcQ`5㵀!]1" c2k܌ИNd5R70iD|PcB_Ń$ׯa+6L1D~  `G`'ɕe  yz bf> #]@A3BIB*Z5Nqō,HCVC2z(l'Xxtxb~U&\tŤT>} -Cߪ Rh+s7oUL0JO[žM`@J~>** EUg\I`,#g7ҵ=%2@X+=x.i)coQϏ%A( -b%($=7(t7$r­ %IpB?G 5ESLL( 񻚸xя?pGj#G6$ nkѸhBHicC'0 2%s2), AtN84&:#O>U~,C%s bGKDt?TH-.L̬4$߳"j2JR,Ls+ƅun_((P[<_A.15{Q4α3{aE\e4$T DAPV忙 o1vXVѕ@ M?dh/r)6f T1 |(ƾ\G 5h0`4V8$\ՙC7q q報bAN?&Y'%znDNt 6YYr21?b7,F23J)#<:^:Y3Tn(/Vd%[dE,°QTCh";f:0"22``yү B0cYҭ7M]-Қk|S @\A F³R+{m+J?%&'E;pOjhs DD3t l9Y#mQSh/$5 beER°,~)ub)KX_׏!hJ1̅wep3~}!OCI r2H#VV<]+ۥR#TS܅J95#0u峚|6}}$";H -Y!H!!nʒȂ3B7"tJjAF:`'Ղ-_cyqSv9xO5q'Ј$ۄՠa׀O^(態D*(3,[`"xBfQXE.H2Ԝ4zrQ[u"8XKE|m#2ȻDL5jvג.bRs /4D10g*iW5h|ZJ,fQio F آ`w/}9OU8),Ł |y ߸t"05̅P g*6rYt*kVlTp-MRP]ڇ E=p4{ [hYA8\'kLDY!7cM"R(K1yW+Fr/*C-cpUJ 7d#Mi[Xzւ (Z1P `Ft$;odFf=%X[r>vm*]`; #9%|Yܦxp"4_1("HECkiP!D@di:#EltVWE"Cu*BO o[ 7\7 Goa7,,0"Cu*BO o[ 76d P1h(1iD*(H8GZr(0Mh'H5d Gnm*Utv8GZsBKMͦ lDh`6b'b§+yVN ; #9%|Yܦxp"4_1("HECkiP!D@di /76j\Ʀs*1Oy鰈a|BzZ܏tyRQka6-^0z+8 @w hGr=¦1hbKUF!ۛz4kPg]6()>6<ت.5kaVhB:^RPש8BzLKOP9u͹W8ƭl*݀MT@ Y G{_Z雉i7n Wbխ[ jL|Fj=jJ ;#SR 41pmZ5`Vp"+ЀЎ{/Lc H4–C_s 7jh֡֯Y@TB+rYY=?z9sO=?<5I .5paEws9sO=?z9sN(Nw=?z9sO=?z?Y/!1AQaq 0`p@P?棣&S]WjMd-N2?ndi&PG$ ^AX/2=kY^E#PdHOqء*Mɑ&rQx-}b H LڶBI# qL&BlT"K>O6dn:Iq,bu@_^T 8I6HF)I9dsx2Iڝ. 3PiEr!t6#(*75#9ЃfbB䙸?(Q-J0$'@^Q(@Da9#%+g. <Moj $0>S#~7b€I|F(Pw >ڻ!D1﫡tSrŌ*}`-]Km vLa n:$`Q[jDQlUz< 3E #A@* JIm2֠x:&U/;\A+HP֨#t/ēiL\ĀZzL$7.^FA6bˡ%9,RIozD$c0$HY5fq">F2>ڴ!"Fz]E. ]5i48&J [jTHCěǍd$YJADT h `q wt/i) oj-d`sDY\X63WI1:zޟ }c?䌹CfJ3%#rU b;ZJb?+ERWVŃc9p8$|ޚ K4u, "-tR~IQZi )T8Dd8- q"m1j(ʬY\9B$ :Ŝ=U-(łŒVcMrȏ驑OtU%HN c`T \$1<(bK-sV<ɋt"Kn l녈R%~0IpOZ ?=j.PrNΊѻ՘"h:n'⚕ ,s K?vU@FژVЀQniGeʸ .B$[N,#c._,UUHB"2 mDHY`boƲ& 8KI}D*]@zµJ6 6tjQnF/4՘%S9t O51DKX=j4D-J(EcK{^WFFHJDAe v!k"apc˂XA nEJ!gQ5Q52}D2&]foHeBHf'1zbtA@FZ@ ݂d$@XBuTz6b1q&7W`~W{4 `,i#^+TIE^!k7ޡ֜d&"9ѓ-EDYmT`$HD~oCo@f3J0M [8+rH,J7,Rrʜh6"ON_)0 ˫H2(E2怍@U/CZaC NN bM Z+(eC< 9dbb'{N36]'v54jV(oS%n"qt#L2~T&x&ԑg4gbGV ,A R`_`=1cHX~hB# %J AJd I8 }9lF$M  oq*H1HD5\uLIȓ'M"L!pIٜ?cJ, 9AQ3$9Bo_Q!=@DJ& )[8 v*k{PT!XąRF)Jf%0;iG /#PIAM]6~7z3E:݌<B rf6ep&UCh]m5ڧ)ROaެHO:CuimFf H 'I*p>Qt"5%`r6od9r$$bPB3&`=jddÆMk22Z91wi#c|۲09f"c_=qO*A_oWlWKS1cڟ4A= |B37>aczNwt 4ڟ b=(PK%vJ{8=Q{dlAbi`4RԴ }tQ efje7'j"'>}4~]+?d\JSڿyX=Yؖh4ɴBZvXkȻ7Y_Ǣ?+ERWVå! BY/SA)F_lpo48y@= I(QjڛK,gAwA,|m̿1RH0Iv !`slz:#7~ iqs ϑr~#V~&MZJjζY ](ey5t6 a! % BV -}5қ,^V5~gVi\ֈ0pOZF8ӳ($4nf$##΀D›S&2ݙo|e*{qSMʽǯQgT H(cC l<A~z{&6pV FH)ɔWe+%"+T`AR+R#$^h41iՂXԁP"l)EBlqm>Ά_SUC cbiܔ*b&l7̼+ `*i{Kj:bR2vZI*pYAKFauX8 pPTԈ!e@P{3'\0&doT~oDLH,EekⅬ[AHhJ,N y%Csq㮺ސʅ Nb;rH,J7C_6[s$F o2)/5) b(NHL:ItZCnDS :NCHNp"~r%; tFOH2%n/@)ACmgV;PX*0#d)8A=ԀX ɲXFj|l “a6H\XA?%-LV%L1&s%xG,%/BM@VWqI9TZꑈ$y~3c$GZ?zN,y$KL@@cފHt ViY! h2;B "/ieو\. AlVk^OȔ)0&Jkop д9„@v(;4PmSAg cFr`[P&o.0c*40@ȜD\ IevDBQRQ?9%vXpCe&ƿ '+Y-vfIsةnIpj:H4̾vA9// *V Fө)bo3"lAK+L&n*bg1 -lP%ę&aTv .G%e5Me!LLi5#)ZQ9fDBڈ&ޏ0 -M8B|&{ Kj'LI*]ˎ o%q-L+Ud}>hFɞlT $Kd*  \D^.@Ō>ZDP,( P-?Ii꒐ˍ X"Bt]mGxKf$a$I""{49T No K!"^  KB@J^-D]AfX[2dϚ={I;AWxj7@Ki eK(jkDXMĘ%$" ]bKFFY505mdZ"LU4ŻVB9/jY,F3VT&d>]iEA$#(7UUQ*kHYϩ 3'bՉgK&=8l_ix>5gaV1C3h,@@ZeGaSNxJk@M1?$v~ZIIF- '%)s IAr׺.DΟȝ"BQ0mBcpPM b[I0ԉY]?ɩr!:3 I*ү'@8ԦhH. )%BXD Sg0eYD'N)؝D! $'8A` ?D9蝆[S:#'WfnG +{m Sbf$@ G*Q!pB!a 1ZpX0LU,e*xnC a"&95[ ]$Qj?Q!pB!a5lΩڜiN$~Y-(QEc ˭! - ,2'9x(bY]"dD3vйTlO2F1NeIAĠ{ݖ*XA #h0&MRKI"!V}]m٠R\*er+񚎒(+-$M2/b;NF ftFaJUdJbiL戹@&5@G)" ʣe-~YLd~A=~`  d=1&FIv$bcjGj0nSYHS (09ZMhfŲŭGJh,rlx(Y}1{I amFGp(E$kD2VK{\40T@KKvZ3 Wk{|@=ٽ@H HU"@+)dIH.\|!DYFQ: $[r~()%!ݗ@pDڎIaHE 68Dhr%biC6D A6tZ"7e0]5 z) ܑlR5vHn JMLH&0Eum (0җr`IinKS;au9A^ κ@(C űb"Ee 6a Vǰ#p`8%\ZȄ`7"+401<=`I/JؕIVJ&%As+" )6 ٝQz EgώH aUWQA{_tjz\^(e8d'?#4)`H,ĬWL6kDG)Imr px_,YA` 2D"b*Q\eŒ La/XЂ Hʩ< Kψl1zr[W 2m]@dd4DPQa vC@#x RڠKHU#0M`Df8j* ^I$W<o+.,9H2&R _~AyL "B$A@aoŨLK&&xQ^\(-q[:#N*Olg0fQ.'ZA`/n%ea#Z%"9JLChh!1{B%!͟ABIX(bII$27K^dTe`-_tPiqNp0@lO$fl_:S^IEQC~]LBWXF)tq1(JpCڢuhj&.8&mA5![1ⴚ1= PDʭvH) Yf `(00H&$;F n15ғS𥾤M!3|R*4R23h InȪ2!!@10Idon"$ZU ,"% ưё AH&ؒ_a[Ij%f&0Z.KCɊL8}$MR4x1薑$kݜPK0[(/!MNf |]`y%8mJ 6-erӭv@K;| 7Z-2JL5 ov0L,9/YK?7J бr&tD#lK4@p? lKI'O*.( ML{C|{Fq3Eǵ\?>jJ3T._j-}= #IKm]o捡\D16ڡrQkW1Ϛ~RU gC^t]\Բ˗8Kc_`>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>@5ocZ} vYyN!"=əP`>ھj1-m B6X/ ɬ*HǪXJ&%O:ӌgC!;q@Ǽ[?;`ڱ%1l]M52Mb )< >ڊl*~'bo7 ڔqo$cZ@&`@)y4 UC ʵ0u`gGൗDZiIќ=}" V_ lҥl{MVܬ °ph!`y`ݨu)l7Ԋ2v<CV:n8mROpDgBe 2@Կ) ĀNP][ ŭMItq뚂<|T5T爊~g͂K gvb' P̖Xҷ_&s…V5FD =N{րrC#/ TI J7`RfeCN$LJ*GsE9%[k]ܢ* v<DC2KC, 2){|Qmur+6 =3r5u`ĐĬLP :va(OؙV_QB2mtpr(j |F)\hQYQ$d_&jv=6ﬦfk>@!v<{|&p<jGc"[j=8"Y>)&Bبbt[WgׁHh"YY)CNz Ǫ%H4ePBp>',R[zCبbt[SoH}UalR%`*QӁQ6D"YaP-Da4_ X"Y>G 2R#<ǃS҆k_ȤR\ } jhұR)+쯽Y2TRMl4J;< 0R-FbBI IM|eITK\I잢ʥASKi7ҭTT`BaF는BUkBJ噤J}qVJ$VnӂՓItڔn}6҈K0ϦJVLMYg5)EjXGz;i;;@J,ږ%Ҕ[U4RTD=z^zR4)h8B"}HP%HR5%ҖYT-R#B3J4(рPeYdl,vk9RFkqO@)fAbP!JR8 @3NNQz4!dSzw4f1R6TDެ{zMV R}z3eERgOKYjeP16V YeR/ 2Ue(]_#XAFOjD=BM+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ+ǺWt^=Ҽ{xJ=-PȒ6L&&R gKEJ(zi (3;!&,#$j#9`{vGpqc|Jg?>p OFA9&&Cg~?hf7Ncz[?2O^vhA09/@D, HB9#$qgb-LP@#AE|B( )"vPRڤ8:A3% =0( i\0S*K"Kai(qqTaK9F\S "hYCr{ a SI$& +Pʫt}I<֘o{TaXRVnb)2&ɉSlT11I}fQ 1~4.KeN8)#E/ e"+X*P,6/ jSB-A!`P(ŐIF5DVE2%B dſ=3 R)DFDKtȘ F(\a$ HT䰡XhI آG bބ,CX zgitXeEeDId$ D!Y! f'jBH,P.(g"HE^&KASrrэDM@cg3I2ʷW@* dFyg\\wX)3OM!^E.filPpyE mad]m $uIJx-H -%-6cҝ:LI&r\D;nHI!UK vKh Q"L"H̄Tc6[ĨʼnʼnFЅp=6 l`$J zs2"Rn^eT@DhռfC1%%B"NN1@M`Y j @ h@F=eA*$nI[!i'Z.Sz"ؤjlZ-1-`[c91$λp$͒4WA7YVA@&jb 5<6bF%K+j/He!TsE5V0A<,!y&HdLE\j7P Rc`%J7p[E &70$ih,Z ZA0:CGE&jyMTÚ' V#Et!̾T, lI 6:ԃVBl&x~hL1kN/^eaEP{2PJH 91NKDc_ PCJ#ײhO0 ouϫCՌqF_1De m!$h^P" &-hƱsb+i 0'RHeu I+LC9Zq.)NrQb&\#ݥH/2 3L4A%(jI"[:d3u6VdW:g"Ӆ*pݥL8-"i ⃩ ! Kk%_ezզaN7 QQzޯTQ#p(Fr([H tșȼEմXz ]ЖYD4EF S%Q,T2Սc1qFcqV?RLϩPPK^fnӂESF̛%i9ds5Df1A;ŸBzXj"ZP7}tNmDFcȵۺ ̔h*&ev/<$!{e8Q8H2ppJJEFϾ&6TU:P)Oеn}N47[%?#Q,rs%k2(Z8'Xwu41!G9"*n^ Otf,*ͧJ#O^Ͼ:A-xqˈi]{"]=huitN5ҭ&6a1^+CE B\.#0O> B,-(Uup04-jÔ4yZ(IrJPt$F!Z̡-Xpg|.]R;Mc3DsF .5pv+Dnu+:U `p6 Tpry!r]S+cԒ^ 1y6<-ª}awVEPd-0S1l5&>D-,$I؈e}P<29ECtĒ}66{*[FR,nP[5 "Q~+j%7&{JMlb2pNV2JU/xzm.qlL=@"lFZkb̲BwFS ZT'w^lohnm5MY[Gvwfɴ.ɘᯌ콱yq@* ̭=Th &H9wk4/#[:;蠖ZAAl\Af @)R30@HMMvW2oPZGQ/p aDoFtIXgW+0`rtCP f υ) c,]\.\7 `' '2#;ǂ@K|$!hAGiRTKdPiļ<_~2UD8Z &ucuAd ɫ`@@/hAB)}$˴3_ -sI-L@"IjJ} f ߡI[RA\(}z&HZhj -px~v!QD Y)LYgKbOw)}ŕdE@ T* 3E-0Ĥ|L]&9XN,ZŠEttHѾ\hQҠ!b$vMP^N̺bD[EAv1)wЎ@l~"֦ߔS!["APiP8My1ݔ Xl$.\,*t+YjzhtRm /PlUB*up„0SG-͑4bH(ru'o T4/ɿc `92-]>v|7X_`dn4?o@-#f#h Ieb3hޢ/RQP9,n KP i"Q`0w԰,wxF(E1 f[0j![** ͵(4ul;ۏq7)XZT]#pAƟ/&E h'\ JLE²b,J we e榿4UC UXQ蔟#w<ڽP2n-4(ex*D4-|`avԾՐ!,Am7 Z5wAƏoKMͷ0goT?\]b4I7Q2 xW€=Ka.d@г]& %*%PTo0 V+Av1q 9%1hD}0[ߢE]@Z 9%3mԲve"ݪ(E Kp@YZCgv ޵65" L2kɍbca%H1raT0 ZWLDlp `)!ņFe p)զE*m4&4MMV7bb i"Qa Fm+q k.pYeqX ҅Fh I`;J0EU,S5rܰ8P6Ԡ֥G;n=j \@pܦCDTuc1kQwTe~kUL1s.*, V`w07,t(ݰUT(ADe{XU:FD.#TDQ/{ Rmp(O+(|PC~MFv`7ʕ?y߯R}S*Wl~Hadv`7ʕ?yaY5BKy-[̷o2ey-[̷o2ey-[̷o2ey-[̷o2ey-[̷o2ey-[̷o2ey-[̷o2ey-[̷o2ey-[̷o2ey-[̷o2ey-[̷o2ey-[̷o2ey-[̷o2ey-[̷o2ey-[̷o2ey-[̷o2ey-[̷o2b_|-1w"izu ~:NX+ "l 0 t M:,c6=P0f^;hVO7@K[`"hCZbm R1= h* +; HxZ~+.F j)eC}*-F*bX5-ڨ)mS MWr2瑊mz?LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLJ]^U𩟭_ ^6YGm~}:wy7?'N;hEBwyzv{B\Z.%D;B33S#~tÏo#c㿕H}1+ΟUꗇfWx_yTQ }GED?hmiUyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyicv\B>CϨ@՗P V.V2AcX݌jQ󆕚kj@bSJ&]q\ : ջH--K(cњى恕S:uCsllXRiEBf6 &K6[,FACp[p]\phwN[B$ -HS#lp0  .J9Y~EkjPbʱFa8(ʈ,F4'p ?OS=S~޺ 'ܟrO}O?'>'ܟĿ'_/Kz%=~OD'_/Kz%=~OD'_/Kz%=~OD'_/Kz%=~OD'_/Kz%=~OD'_/Kz%=~OD'_/Kz%=~OD'_/Kz%=~OD'_/Kz%=~OD'_/Kz%=~OD'_/Kz%=~OD'_/Kz%=~OD'_/Kz%=~OD'_/Kz%=~OD'_/Kz%=~OD'_/r䨨Զ%:|1qWĺTΗz` tHpi_ mXS OP0wB9/&ۙJ`wGJX6Oڃ2@e b.`);醔!Yq0bȔexn!hWoi&!D:9Rd#]tG@6~8AS cP0;JuA-$J7ln)j= rd<1(V1\D5Q#DFP, pG9w2XU\OcgsEK@U/ŖAw__ΉJQ:eVw~i"bד;p#µ+}`s@]Ҁݧ @odcY E/ X ˜5Z.r?Pt'/&ዢ)*F Ah]U#@i#A .J \jm0 vN(--bv. 0ųɘB䠼Uw>ɜn*kI8bDKhh- 9 4hF>ɜn*kI8bJQZDu{piHH&sr?PtIC6}R9;l' VA606a|;AWM@Rn8 i=X0huK0r*}[\ڍ]7JM)u`! !ZTgB7φfn UJZI0CKyw84}iZ]cJVFHff TC4sCGѸ؈{61uddfn UJZI0CK jr2E4ά[4:rvERN9A>l.`mFv܁ҥ&p{:aleI8`U9 or'JqSICC_g'mU$ბ_thinc-release-v9.1.1/website/docs/images/type_checking2.jpg000066400000000000000000004637501467064331700237240ustar00rootroot00000000000000JFIFd  0Pe @ںtDj=VeiYji{WK`6V7߱1>m2E>z<Ř#[PS[ M֕`x|tSlEiYmfrTVt>ٌ:/Ot#*BHEkCtD7N7kJhG a|1Vཝ~8jnTWkwzHH{tTXM 5"k*┽K5!ÅWw^䚏[h;}W̅h?ndUsk}?f^6yXukv2)2Kʜ銉mFcz7ӫSz!#Dܝ4tUܺ\B}ҧzn@bc,#7[A͇\YoJGSC";#:Uߠ}mm,aN9#{^2"Qg{~bztrXƆ? K3R뤤(vV)]B8^xZgddmb{ ΰ}e lkEޥ1udZ"!+.拒8@N8sDPx:o٤6tyw^^ToOCww{WIڮI?5+Z9֟5>Vy#ml}c^w6ޚcKl>S\v`k=± ǣwۚ;4cLՕn?[j d~{Z8(?Dzd9OqO<<@@Re [)|r RqGJo{LO#$ (D~^#{p1ly`y bw:cpwkJsTaUKFOܣݍFtLVqVѓN9:Hc<1x:C Y%o^'>-1o~~8 }cpFe þpR ;le þzЩ&TlQn&;5"KZsvG@|犎+gb'uE]lf` [)6ܨeE[7E$|{i:u>`d? 1lw@ybH0 @4~QE6Ų?,gԎ[ bs4cKT0S ?Mtz!m$u1@c^!+5Mgy;*"PCM,fK:mrV b0y P+lDu1HMj&Hs2/]HV$]" -]uuמxN`B8s%Gs#58a;<ɎP6GTs{Z\YGNppD{kFɍwJLwtKz[\׼j>K@ߎNV&U0MD4!`Px_Z EYeSY6}.%SĎPCK꣥fek^~Z#jqHiWb8;;"ٵ5.jh!骵32h s+/4~̳ګU R~bH >wjwB|?.mdlL.4#-lՓ5m{{ujtKXW..+mRdP58Wr><;fk`2)<1]ժ&@Ų m^$Ϥ8;4'NEsZ#KhZ(F9]gUcj'l䣡jw oYNз96; _oHi7:]C9OI&.ߍ_J' kk{T;%*ri~O2/i!D=IYu;h{9ڎ7@@a8~uGlo,`3ɮ PI|_{>"&ɸ᯻3Z'w77le þpR 7ZvŲa`@ƘE$؉6O3azoΨYJ/h,:Doxs)6S2)dF]켮ϴbH[#v?RH bH3<7N; ʶ/XM%m[-`?@7MwMdڄ/w_$"^iPe [__K"a,b}5ЍKfs+k %bNe&%UtmJrbdO -1l99ClMN[ŲNG&bH~_ [)R1lbHŲe   {k dbݍOGwߝCͮpZ=kQy~Xz[=g=O(Sq?jZ}+Yſgʷ̇垾?_Lnt=ԹϧnXߦz.:Q/}w_f=Oyھww(t|q>6G9z}7~{stogA˿SӾS?}_ehYYs1/qOG̏lcy}uMw RsL{Xt|ݻs^k.z?Dw'8ۺGϡq?@h~w?(O /}wsyx_S;?|>v__#۾nxW8>'=39I|Oc΢ =7 ?0' Q5=%Q'{^q)ַ Sl^!7鱚eRƝwFاooiŚΖ܏UuW/g#8+WY믾}8_d}B5C*z}W(ZB`+YdZz _EtuUu(.\~~o_柞+YVw)ܧo(*ۡ s;:nx̱o5iּ_SKm(˯k7ʳc/i.-m>G r^`F^{*ݯ_{Lq?B).R @s`:Nlm ;ۨ+YdZk @+YVZiZ*@9 @WV Wi;o[CСT}<v@UHϭAjta<ۖqŀV S:nd@d+Y^; Z*< @WV8d+X36hkMͿ~'q(8 g 3,9,d3QJ#99bgqs b Y%v@oQFVҟ}{W pXc;5a_DV؀hp+Y1){ @rw)ob&[O>}#w)wt<߭G::+oeF^]ᵲhSӜw,S<חpgZ|/o(5s`>{}|k J @k ZdV4o X,;pGxwܳuh$ ep fdb6b3322b6zo,quF&Ls\f<3`c{/~e?.Qz[Fܻsn޿z ۩$5 h\o2\6aVX\H)YI^z7gy m\uۖ,rnf;ue\ gza[1^mRs3M;ۘqYͿws9wTr;mк[;j0٣<mpڳ3ѻV6j5e #~mjMky"2{&Qɢvm%Ӗ 㖭g7^rկ-\8Gr_N^ߕW,fX( Yee[+<"*?OoOX,&9eK2YeVX\ Pf2٫f]c?C ;o,Tێ9[rY`Ze݆{5l.9ۆ:߯zC/C?3Wc9 Yf#<$ن;5ճ YXgZ֎O)| Fs9,X`6k@,` ,X`\@e@m tXb}:^X7h hX >X 6;e|m tݤ۫nX׷^3z3rPP%( @m {wyӖpN_9ZRRPJP @ @ @,hX@m ?{,)oD@PO"WRRd Yl `Jo\tx%J!2V r@,,6@m mӐCĻu|9S8qIe\h%,?7Q~OW\zqSݟ9lXXX. N@oN@rM\,:(aXe?+8/wo yx8ufxe2)Xei~^n}߉J?oXF 23H`saq٬X|'@XH`X, <  5 078@`p69!DP34CGI11e6_2l@\^e?MKz8 \Cds)t7d4fxǟG|kQ\%lƕ˧bxVa}}eAfY`p:n@z:&HT.wNM@zOWS\C1/;5\f(neT1ˇF՝ TGˆq ! ΃pOT fZLlLs }1Gέ9} I\ _mba‘jʽ!=7mQ.^#T&0Q%E# no ~1$>rA kGR[͙-GKANdmY "9zbqrDZ.\{iu&^ٖ~8#Զ!GHᒒYSlg8I=J0<}Mq-]`FEo^.&A; )91e"Z~95ݏQ*5)1,oh),vb=w”)ٹe:ԈvojJJn}6$ڤ1= ^K ;TGĶZ>+>ے06Xk&͜LJ(Q [SSV TA=XmжlѪe˶/z`{~ɤ/zz; "s,I_SV ;_ rG޻jcL}h=%ıgJ5oH_|#Cf*sb +{6.Kal,'v*SIƝ vH6# _.}6"uw։76  @ |5tz%m.2 ن7&_oR_LjD0E$:jFXfu!ztl׊  aŭ5Afл^f=Ɨ_͇P1zlrMDDte~+#Toͪ/)|2xVuu5Kv(c&?.T't &4r}ܭ:āX9bӑ^K.1a^x/eF2`?W/\^bճEFJ 8ob`Qc%"xDMZ${)3͐XYCd|= 6Z_LZ:*J h9轉%h1 Deg,gD#wEE ²\ #;\V" aܮ_41P${x4XHOˣR αLczmFָj&9n>ͽiń-n[V$ P8ɩW 6[UJێp= RI ؘRыNNd^s:VHgvqk%n]蒊w,xNGG(qZN}T[zvnX5T oٱBpQf 4F1PǴ 4/ O ʞ,5YҌW(6'঺u.RP~>]4f'q^H`7iUIpF+bar3كT&HXLsyRDh^TppiGov^g >taWMn:ٝh-TM{$)S0"VtҾT؋#K^*u`KIsk6F$AbdZ hSI꾺#KCIG*VDy\*#GJ*/:6k3j,(A,@*`F.5U'~$1N ߆€?_ ]^K\y`5ѰD9g ЏH BhE,BH_:Z a\ލ]nG]0XL5! U,b[rcy?`A5k[ӖB'/k/1rKg';ɭ3{:HSLv]+fx 3x@V͇ZٹlI.*dz K\'ySv@I9حMĈ7UTR#'~q @Ɖ('"&=|ٌ}$v*2gojLꊠEƅqaz]Lܹz z+L\(@!p~(IC$rU)B ]( >Ad ^ _-Xy)Y;32uub%b:JӒemccYg[PaWk5raE'/zG]mv:V"'Bbr"T6 L߽Z Hq%X. eKdfCh$uXȜ_}E&' N80)ksSe>`өiTnG ,q)ֱ!>xzwY%˩7CFh#L PbBctk`̬?&'ea_2c/Ux1*T i/R\0zxGcRGSGkǚ۳vJ\yM1!2ݦNqoϋ^CmiqV:Lq %#<{'SקN:MgElm LT|Tl$KVnr{|8ZտH ݺ[<˱67!Z;xv5N+VŻ\K*J[Z̻6F3&,|~`1|Ld\bzp?"p1ˮɕtFB` 攎L1Ս8Ut.:`~a/\?9~3 uaq&Ǘ|8Z Cv9ߔhX2ɤתkԳ|YWg+b6c_[<@xh,#!GӰk#tUZi~Rwod5.(`qi1j؄DU1FW2s'S _)ˮZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ9gL?9u]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ӧL~?IhJIp=.\f;r6 a~ /'S!pdq.NIJv*((ʻ`XD9 헂c1gC!81>^\xYNsUv6ZywG>$x9n,_f \ iy :#p5(kzx6E ?А.G)ck~B;?%a/uCe.lIj `<Ppft#VY}CW`m7~Y3˞&O&_'Wsb,ȯV\0p'[ÊW V$.D[ޓ We ,lV=el.Tn!hwt,~l!+r; "- qj3 ~a^Ζ{gb :Y(i&g: e[K1un7c$ jn`e˸/.^#V&.Qd(l8ohBed$@R0qDĦW[uj۹b^ܰ"VspGiC w<*5_b yG! LĆm  CRkeoI9=>s,~WN}Hтes0up+Z\6 ?$T[Bߖr"^2~.>nO7HֹRKG[+QPBW؎Mi7*WH?x׉ns1Q?0.e2#6Mʷ_ŻȔ¦"2$oػjWWX+xzz7 %g\c7dx*=fdh֗~GzBz錟{pBY_vmTh_Ni]F:cNߣ7BtȚ]E,{Wޜ Xa_gcZ寅O^co)/X뺕Ӄre'*kg'9N}@=r >tm 7\"Q֩ OjW1vK4E :Lk5V|Z9tF4j3Sv`$~ r^ԏ&3=6lc-]v[,_O fɕvja5SqK?&a~Rk?"v9NfjזcEï<&΀; 4g<Ν}cjk4|i qj@;m65\[;d>>RT/jmq&ŧALr wc 5fs]Ӡ=]'ooE [oblQojc\ "6M8`%F{흲dD `N59rl.´t'IIJZ0oO {ZUMpp@n)Ex&e!cfgey(Cy"]65dC<ʹ튌OٗIҥ f٢ieN f24i07(do92nX_BEaBa{g/uC,c#9]8Zu.uB^Y떙BM?%30<үq[ޭC+i(.k=,([7]pc/$",, װ #G\Y[$RjlV]'ej+L,~Lc8$H%RΓv a]Ύj ";&.uPPK hVO32$mr$(EecEEGYl0jD ̯JKj[Y + dݤ!j~Û1 …Ķ [35`sus[_J1;Y"@#6pyG)\ jT{8J?g*HͺlK=~N0 ,h?7}kC(ʆWL!PA&ķ_xYzF[Znqv>=ZLi(+ռ_RfHpݰ(q1M;n/HVIG4@KbY:飓C&G8DVnȃW-l2X93aZݎ Xx*^i`s7{3 aj̥ qȥ[؅TFf>"Xc48RU[[Sf+'ڞʿd\+>aS8wrral$u[b#8|ĕҙ \:ZnOM!VC`ưRL HpI&-* 4\8΃fd{o%:nB|)y=;}|@x@OlRF/gڅnΪof6E$5\L4Vn^̸ XH kP!]!j4 w^$ =BFªbn竈jAaQyS\%#)7"%ܮ)Ǖ׳֊\W3@g7ŤkH˕j1u窠e(G_ʂtL#l%ϼC!7[̤w~nү*ξ#߄!t.3`wձNlȝֆUN"p- =a+wg:Ff/j,vy5^Av-2˟0娬9##cjɮzBU؛]!ePw.ZJ U0hp9l GE|<GW7#aaxOUC-q.{*#%0zݴ.f^nah;ڮLbg%~m ҵ{"\ 6)?g$Րe~ͦ5 HE̖s“l&*{:? q* ?˂Ռm(:A:=$ 'S1 E A(LѨAqBAWd.@MxCYf8&.B1:ž]@GdWg3{6T箔A \*[F" 1' BRxC5_@FAf'YPpQi[.ónɈZ2 ĻD\p-K'#s3p2c`JQn38Xܕ% TAޖ+! ,18A2dpޓDIFH`A݌|cKT8LvKb+)#W!aDuSDKBDDGbHܧdٵjՋEx]#JFKܫ04W4mt ʿ!211e aގ(ȅ$Sq E,ʍq5'ɧ oBE$hx\hGP}R]#`:6:2%m@S7\8H`JTӲ9rJ4$$TuȂq5'a@pH u4TL\~$D$ҡZIzT2&o2NԏLJ:[㒋Ks˳f5X*i/IIC= xZfݻ6}&!acϊ7ͣEcW؃hxOecE$j `hf3 *V"'ⲥU7nr /Le߽Z Hq&4^&~^f[JA &Ù ӱ(oq"a#d"8c˱bX>6:W )#PcbR ~SlƳkʕ]CȲŠr &`.+ւeŋ@'},3{0d.*WaXV*06bYD𣒡wSڤ5o^k"ăqUrVwn,9E qa +\i _D`奓3anKB$rV`Hą p}E$hxX`GPR]3C <*I;LO<,.$p8L{1ӋGXȰ)U4sd5Z^K2q-ϝ rb~a/\?˯},/'LܶZ,8l!uɩ7gmvXQ+0ˢcdK<̰lnfɕnS~W< ?,rv:0(=֕s ib0m+0U}'/7% LơqdBBDD?_QD$O]3x`IẬ\lTӂa k9N"KQo\l V52#_$NĈ$^Y%5&֍vl2bnO8~ѡ&O% LơqdBBvJe{{23%Ɩ TLsiҍO]flZT\0@9r:'jJ8Վxs&TJ  $LdxJ|SG Xjb }mzpm ^ Klte8}f^>&VvbX7slybŬ &^>~&.v(K2{&[/CfCdJ[S7]/#.tVqg>5Hbv-Fb\õs?^~cڽ{[n ~7G[ՠ+ʼnѧ\(E6yxH-r*)֊5c V8T̸MQZUeY|:)tY!Җܺo3##ew VX{bTrg+h#YdjXc8QhhfT8WzsjC$a |UdT d5]$e.LD=I \7dpǃOÕ2P_Q°c/J;+ 3 n}Qy_q?0.eO?K2F]y5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^wy5xם^w_9w~2 F_pc/rel.d2ab@72؅P"V% E+qǏOV]3[bʋQ鰐yKLȈbc&XRȱY<#Jn%q?ojz%h ZgEYW(rq9Y(~q0L7 2GyOf%xthۏq,X, B8 \WiAw>R 65ZugʨQek驠 q@K)"JYXEWxCmFYN'X9R&^G͑hGVt}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎\.Y9xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎^:>t}xG׎X&eV'bf"%p.  Ԇ9ppcv(>1U@IBubܒs2c/Q}3czpSwTLi>]#oZ\zWbѱ4)"9bhuv3gk" lQ#mN)]f[Hcm{$d#3x H> ږ7ea^Xo.vgJb+n,ǭ3wU q8YrU^}(-;^k$Sb@Ep,K dI;eg_b|*?~&wt)em[Z5G2͸1mnepc/ۇ^sc  !"1#2A @BQSa$03RUVW`pq%4bcdCPTr&s56Ef ?Ïu&G-G~.z=?o!~o!~JeH3+by5,<򄱋Ͼt$m×-KP|4+'(w]6wۗLwcDKUO,eHn>hm..iUS߲܇5:фqnRj> /|nH9"o!˲GM] k@8 aX$cg*3X#>DV$MxOMz.\:ق{e}e0]S{]"'Ѿ&˭Vcm"$UIy 6A8b }|601 gͦ;29;qh l&J7+4॒_%W񪺫sۨs'kkp)`א<{>\?-xF 7 j jU[92 o8dT$.Km42xW2ܙt^NOF(6G].&hLqx..)@Ȼ)J~޲4EYN)!UR$TB>y+m{1tח?G~W.>}%8 lXu3 ȉ^.X~DJ^i{wH LJo!̇ycϑ'Eڐx2mb%"e:՝O*bDeiy9*'TUMkV*g5Zlj'8xr=z!2il#3cUXJᔨŎ"Ȫ ډ7s>h'eM_ 9>SE;kzG[k+:~Di YM| iL6t]蓓kRqk+gugɓSwxܹE6x~yemGɕ.d6ּ}py{u!>>㭲-m<b*** .\|Vk:^Gmty{ۆ/-p Lp&ȱ)+!q7=Yz0NQv&& o5\3+|7sMWċeX@Z%{i4¸7;%}r*[y/%ܗwy<']w-}}tlZFmWa9>̳6sw66<ͶN]8!*'kÐ龱t>JnըdwVfoY3M)]B}ReHUHI7OJ/,=l iΣXI+%G**h~P>l_/-{;}};}ӗo,o,iE6<$$BzuɉcY|Zjǹ uz}NN~)kơD|f4h\cDDuKMv r3_iU5oI m2xX&9i(;P|Y+N_y2 ѷ?_"PYY,j*mi &aYqRB)+O*,r,f.OʭzʥȷE*>;޳vYFoɃ٥,ZXa32̏NOGT!Y/#PQܩRRФVEq#7-9Jx' 4yQjNߜ'yw?FWQ,aS#(G_ 8Q#8(hl,-f)`\o5Fy} }| *Z77vfpb4BЛ|mj&/{nVY4g7PEg::Dh*>upf-FB2Gy,qj:s2&"Ф3RikTnFJMKr_4]N+5XSbp .ˌFx!n+Ԝ51r] /4P,,V;n  $b}crJi8lk-Ǐ! '\ȋGRc9Fo1'@0'O1$[ ifq fXK-:ۋfAG}s2mHI F_ȭE vnE+a8P;% ENIC$şSɠ+ՙMFy% -,p6:U@CG ´U^eTQ3شḄ ]vy\7Mi',h$!MCuqlQ=8/GRt>+NTTT)>7e \e11RO  td9 7Hjm{1cj

n&27.|i|M *pͪ/ 1b+L#%m0%D:'jnX6Sͼwru z5n0#b=C?3 V`Ɛ 5a7pm 9˦ڶ/K~$묆 y9^l$ʋ1Io6uf,d.2EQ . 횩=\;/:Rv*.njnc#׵ie"NaͰgw- hHK8SS!1س'# 6Y|V0t8B+k~ NUeDʰ ~)".i%'j,yoh8Sܚ |Y`lrEIX"p@rZ>}3DU^#-akM"K1"]h2'O2,/KΦ 6‫%@:c^~ZǞ]mi3%g[_ELj) yqTYi]77 {?lVe-Msqu r1(㔹xR-崐M5s\&"owuvӝ9~ncF "# |M msRrt_Qʙi)|:螑pŞ@MXoy?ILX[Ƒ=:Q9%ژly&-{i8΁b}X  IMVßdQXG!AFCđR+3+YǠ1e}1ʪ% HfS*||/mrvLg]Gqتrƽ#O̒#ЂB:<#;T~'_yLb Vb{;jnu8yĪChASD4eQt$:ѐ#eQߤU-G+\#a^+6E/Or`y3 `A,u,ȫ"{gZȾar .⫩xf3KA9~Mp\X6}Kꛬ!8^WftpcxmվdM)I_QAǽU6GA<ۋ;JйmL=ydZ@¦K"b̺"N6W*.C0[U Qِ J*"\t߃d*&9O}!/{])=۫/+u'[22pm'R$}LVx8/o6ؐK庈cTBmeKr lWH."QvqYjO7("eutx3m<. "%ua6c0!9cmBīɐHQK顺ڮ MDJ$iWֱcJˮ[;r^tpMlyGǥdUYʱWi2H3n)vqqIhSDey;7NHүcxA-)jeRD#N(۟eh(y8.5"mn2K֑[a7QيhR=R]]v}WSJȥrDYV!69ͶE\VϏ$UPSiaC#(M[Wu\"4iͧ "ۑ/?Hz٨g eί=׎aG6 ;rAG lt4vY5lIJ8% VӍ6 4s0het_d4re(oXLaST7>S3#Fri-:qTCw'YCSuW9ɐ 4^!k$jV!GWQ+Fb/y_O]]y_jʐKh`$*,K*>w)f9 vP[Qŧ6\]p`5_Y[6v+Ywj#&ȝW#渻jQٜdTYWVYu&Eɲ$-:5]D$ǃ%˷LxD6-oBĤF#Wcfwel˘ Ԣ2Q.\[)Voےn>>+V9/6gR n* l*/V;0NCeUg#~7r%K?W69VELc :J*2S CߴӴxdr2Y=e]>omYDzd 3G-"ljǛ£:]Rڮɠ=l,K[W4m߂hs/|f-'kSi2ɘƀՓhBp.8PuO Xvvfe-124S%NOLJ 12%~mKg3)q%_uTnd $捣$-\kW8owPX^V=!,\ K>,qXZu}f]&j[K9R"X9J=ݔ9%ˈ4{ו^:a\H3W*>^c8Ki냓rX0b|g\oltE|vik \LdedRF% 7QXGdt2Ge4lʳZzGdӊ/?c|vlrJ8ˎLHSQSzWN+mMwZ"K:Ũ[j0l2iyiWl1&;f*EDSMbg(^njc`4O"Yl H5=gW y>li"Γ ^r(8h3cO CQreQc+ܫRaI5^GbyCc4_ 6u3Xc3w~Gb7Y';"z60HؼiRfdm"Ȅ荇pi̴+cuS?ږZ=h\?Kg"sjmї/`"OGUU-qG 5 \1^vs Y̢:G|XUQngB&kOz ]ٙ zw;ͱuT8$ Ӑ'*{-#fhGk/ RD e_ˬzWo#vĶ]tYsױ9UWxnz3ߚQ~=}QwMe,r{*TEWx2n)N"ȃ&{Ÿɖ0f5Y2{N4)"̖f#bNS$BIAr[L=h0 'th"uA6)qJ0)AgѧN"bO5>kڌv[d2ڪsϒ,5<. `h-VԳkAmy pI?í eb3,˫]qO3'y2sņSZ3)[ 'w &· .2nrmV 5Y*§"CX" H?uuxg<񺄞*X7y{Td9fuϼ. 5LUEY؄6U l<Þp41㫖TkccX*鰊 Fc b-nVA̦qx]$Mc]oi ŲDRrT]Nf+gw7CR\do' w 5U&鳸[SPߑ*x8He_7?+k#5S72Pfhv~_w)gvnՃSp H1Aஷ uIYFJrbXrźE+~T]][bYjግlATi"[p;r71n];&41-2J/K3{䊶8}\;&ޏv޵U=h2^ڭa6v3N8'Ï.Lծ#\}`TՍ١Eϥuzm;鬭X5=\k[䬻mna[uU<л]JGjryEb-X`m *x뷬Nj#U2ۊFLH&w4qOqaWoIeRydCWOޣ~k gWy|ǤU?qg͌Xsf%˯בּ˻qmH\~f1ENɿ*̖tԇcVIOGs]f82@<UDucqW*DysbT[~f[-3c8sؿ5c!r }yjEm[0wxh[a9Q DN$Y.rUNTOOG_2>EFԑD!kef=YުZIZFRusskxBK#s1pz|-L5#ybJvhP1]2>r"-f0+ڟLw;h+.\VHӊuw]Yssq#Wxӌ̠ZKvVlz='7QyPU|5;+ǰL$)g@LUZDt\$F-_v%]VTX1= #&̂;"8i!k:?"H*)ñ_=Q:Z Jr {@e!R;䈚ٮr}> a#8|?hve|4 M]NrbcNOb y%uz)+hm㒷yS"w}}>SK"&Um"6aڙWэAuZ**G]vבWdp``-$H$x$QPǍh .\VHQx.k-Ŗ>/QK=OX#g~ě^oUR>\[pGxgrܩk)cn}, +` z|>x'-74ꩱZ|)62"W{ðjuÄ&)/TTV^]JswWjJ= x4ErQ=X+N\hq;ΫQDT%M*+gqA&Yw;qǬ߃W2m(kY-] l,g"qMWStۖj!iItE]1 6ղ:MxNyGdA%"IrbmpJA'L8kW1KS?*^E uF;yE/p=<rEەmkfN]}F'A.\$E$.:p_bM_ڗ OzlgZPtUUiMQ+k2pGm8hAADMvqSOs.$=EN[iU)fUe8k$-?Hf(C,?hȒ2"xy>"#S}{(3u]qwu ]ԕ|UWX&E+ ^qFtݎm*AeTOɬ^&L7ySϺ)`J.ɹ6i1&h(U<:Ϸ [gNAj4Ӷwx=6[9qE/k>Ϫ젼`a)䴼\hf+$1Sr~;UY,e۬$Hyo%&.=M]KD5bď$dDԧi"fʡXb4!$b*m3%1/V P!f]L^Wd%do|5Nb˘,iI.ky1$eM|-kUL%e7Sc/9ucLhEnt'Q!5hdܛT]cT8GAS; 3L/ӬScE3v#W0"#C)@D"!+jqWwu1 3zN W(|u]ڲk})q#ρ-tÔ$َ英 볼2eUUB:\Yi $QmE?F[,oxwl~wyQz]^}Nr;5e8cˆ18 M4 `("(j_9,jX HYI`rq<>[|e_vp#SjF8ʅ0M!lb(j `]] J}(6n̂,¸fBS/X.'Ln+,ff 2Kd7q_5QYGS "SY_ 1 aNlO'Eo(kl1L\Kumay5t`_;Pa k[Y 61ȘPۊ~%W'U¶Q40CDUhȺ±]Aӕ"|-rCFK芀Dɬ lXXwsYۦpڕfæ- h\Pmue2OS5PR\&c+HUeӕ;uN"njҚ%ǿǪPa _:$TTк΢%UdN 43pnDD*D@R#"""rj(1aUGOBt AqpC""_]vM㓈b4j&%u:=2-y(ᆰk'ɋ$SLUSxϊMqqcKX>JǗ'ihJ'$=XD` oliлj٫3y7)8OyL \;&:݅vCffh㋹juU~?[Zr?r;,:/<,Ȗ.&Sp@lXPcw +y.9OzpBHh˪s@}Bk%IiGbQL*"Fn4Txb6D]̟V=nnP\ugWR-= G7İuP㗧x~?XbG^V,x&:%x /kr7ҎG^<\lf˪#qe58Mu-ϊ0g,mueޠ/0DQ]vWq/Mb)c"\lnOt,4ЙDxk*NLnznS)+ɲlmbEYdQ bZ ɛDU5ٗgזmYL69S7\QE"]= {9}P,pf RZ^MH2,aqEMbXfHLW.Ǡ_|_ bx;IumCWcmNi=3v37o": яL3*$]&4# >ˈ`b$$*x.Z Z4Lh 8#ϊ*r{4h؏wWՆ_jpUHk '[j|:D# d:DDkqlx湎ԓQd8Jל=EOⶖd\ܝ>L,mUݓmGa21ۊ@vtŀ`S &xk\c~SwQU>΃Ah!qUtEE͘Mdce}_F⑗19pDeqn3m$>Gi#2 ,<idDAM>C-/`4$m"& hw'X˹|pʜuO6z#M#f+fMNB2DN_yن6)XޔsRn[ma[+*Vv]aWNu0g*t%GhM4U捪!o㾰Z}%m~=S]s[IȜ]qyI5eb& LTOKe6̗jhDPIUuf2du$HWƮ<9HTwU]vycvӬ %AO`,<<ͮۜOIJ[(B!}?Wg-y ȉU%QmaxУF6X<,dILw:1h*.ʈ*mԾ< BUtay*Yc=ҦV5"C6Dy*("~%%JH^5ًuPgAܗx0J]j)܈kuX["k`}*NUS lS݄0~7]Z HJxY5f6'.QMPxi La()"+Q&‘Tyn2J+n۱!bwcql<")ȗ  ǂɤ֥ zDfҚՏk]ڎ=EpE4 o4 #̕. 3랑#!]~MYc/Dm6tr"X]rmPuDx$p{8*) I maWA@=!Lfח*}?w=]VC)EV&fNTZۤ(OӬ~A)D tX?1lIDN;x޿15 Bzt 6[ qc{P@~6w2jz> hB͕xĭ3ҁ,aW-- H,`*-"h]tI$_;m<=:.qEFìEKvu]4H! nۮeU Ul k uw.mcuUF%%V/_&\DO%To܎HɴUU܎FL;eE{m7_r::]Nˎ໯|||SQ[Jjj( Mj'"/F_aM6f=8G`c4e(w'E&WKſwlg͇vG6]Ο]RvƋv.;.DV#Ú6#a]Uv̑)ll"Y;Os`}f(pMՓ-r˼F}hYdٍe\h *Sò. f>% ѣRmMuwd^_x]9ž pd%wb6=@UU?t$#զl vw궂TF:Nӈ3^`8#'iYc|WfٕQ1dIyzqeH(SpZoeÖT&=lqKʉN1vZ44+z>-];TgY.jZ0_xVnrtÉ(D-96KaL[*U|8nyW\ja[A@=Tgf}4.;Zfk++ 8 y"@۠x"'DOǮm$Ȩp2k݄ R?ZTH\XU_5QeREx,\045O1&lh;@ŲK좮" n%W)ah1e+"F-nHshlg֘[Ǫy e@Қ9%l˟XvWbO}$$ }̲RĹaC@70E!Z |&G r!6,cWfBx%CV[qT]sNfDA\W<ŻQpMڎ;QK6w;{;G02HQfJf5pC*):#Q| ҕ--œ* em+ͼS,T;QtXh6H"TO+!Ċ㦕"#.3_:MA,cugM0.ѱ܂ e:')t"Cm畳Lœux /e7f}v}1+,;ZQX 37QksqP5 qlUVOH33ݸ0dlMYV ˟eC.NBYD׫Wm܋*F˲M&G't& va_ږ3\59,rU! <:VAzom (Cɻ=]HxzQѷT)1,5SW8+j}".6R4E^ꈾ:f쭋(,J0X\ZN ஐ$ F;G%knDq9@>\X/4О)3%#&;4N|H=E9!ym݇mx72\a,KmZ܈55a#"}+ngi.VNw(B%S .$u.:BU0$,6bq75\̦6cT9-QZ,=D(%3ei~C]`.Kۓtݔcr, hm ]e(MQIʚ҆=Κk,4,ir9<_qhff!ƫH 8<)&58[z0%dtFg~֣3Wqr\ҫ]K#~..ٶGlZbi4E}Gf94^z a4]5m+-*7Ф_W9+&y,M)|tShEq <ickmiN~)'eBQOr~FgGsܼ~.+{-~dXd+f4$뒣yNxDҚ\;su4 0pGyhH%D7_О [mƀoɹ&m_OL7:3m q3v ҽ%F CG]l iQHtô--޽z(j8G"4Qe#T}ݷYQ@ee5A"o D"/W=>o6Ǝ*=Td*?-«HIਫU/_'KV›S(ft@lC0yxo)RUi,-,]8+[f(mnʊ`bؗ}DqAP5ey%EZ#U'NWA D栞`6"Y߳SL8P9\+L!@I2a[hT`..o'"|{:u\ldV#e_ڷWq}uM6P7O 9a*eKrŽ' Db8٦Mlskz>9 DZħrU,E12vAD~.gńV].DgG!Tra6gM!F}|&B%B#˂LF bN;e6RuԀu͝ʢqiT9+\3HY^9s]`WB| x5d)h@湬Ƴl,f Rу +B ļ|*+9 nDVth13?u!"v_tEcA[!lqapZreœ5\0s[#~Uq[44CppWU|׵YԶ`ͳ #q|UlHE]EwOomnml%LS^f=N g>SqYWO~vylmEhTdщK6UM}Zb8~(4E"&lf7-՘P,F]otMڌyXK*[l[΂#% 6OoX jP#<0eY'x$@u"|U5څmh+vcSdmNv}T8ӜOc%VLt:#4RD>6z2"Sgh4nėqmD):Op1Zz 2&dy[幗h5H!}RKoƌIsIG͵ *.OHCeK_BQ?a{*/*/5tf 6UeC^qfwF\$ݰf(o4«)Q``cE~@DMMXUU!Yŵ-ɬ1%GxĐpUƌWATqOOw9^Yw)&M_AaݘE_=smLJ6n"| |d^~Y^g/ fSt9[3 rI'$ԩʪP86p-zwqrG븊 Kȝ%cp #Dd)lhD"|GTO~4-W6:hs#Ŋ3۔E4IOQW ǙmmZ-oL~꽊L]7qߐn&8"&j#|=,ik2Fe9kw:ύ"L Eq$M5v{[fG_~[3#Qpzb ~*v٘vsWğyG %LM"f1Lz4{ ScJdpޓus[pl%eEby K.Ӎ(؜;Y_B}U q-ҙ(Ϧ9"du,X>;M'E@TKoyCȩFRUƛ|V-$d3koڶℇeMqf[8/6/y%"◙ $w^0zl1pm2eBuVmwY:هQ6RD !YFΰfۇܙXG1&Za^Dۜ5 jI)^lBY9S&2}j:m8m{w(jVH3/23:odLբ,Q`3^hH{#)Ƚmv5]hLҼbC(s"`ex,i#&d>N<{[vW9,|!ՌUI%V_D KQRdweS,-.kqb\+aR%/!~d?%/!~d4~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\t~qӭ[N뎝o:߮:u\tt_9 D!U4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMzU4ꦀ=TS@hMz?px'r_rHrE7X̲ `b~]h ]pmNFfe⪺ EV%6M>1.6 '4@w2ƨ޲ǽzB?YI~ _'=ݢƣ6q]̙_];"H."~^*x匈FZvޗWé.;}ǗCZgo'p~ݢ~W ^+$̃#*Ja R⋾ɾwQes=}}ns Uq1ɒr>13qDs l##$^ 1|u9؆30VuΫm5$#6$RuU B$y!gQa+W8~.=#x7m35Ua1IytV2G}Cw:-e]tgfOqÊu&Cʂ(&ymI-Vc:vSP⌋5pq:䰻H6$Yx7NM(*n$${6knV,ə =Tlw~}>g6ߎb,IL۫W_0QTEEu!lwRBE\پj+aBm-وqfʖغ>-yFEڼ;˭]L5d,E&)k)b rkR1U"UkհU.E(Q0m(bNJne;bPM>,_ޚf߳l%I[C:ԒaUp| 7O^GNx|3q.A7['k%Ku,QhP[$:f߳l%I[C:ԒaUp| 7On{8UMx1IfY5+ T4׏ n/5]T~9ezT(h&hcg6\T1uݶIAR=:ZЉmi 2TlH̕EUv|2xZ~ YYMy]5:=M8GcL-z<\OH.w2Ղe~;ov5JiF ^%{/'5)w_,xR(WyFyOɷR 6+#{Y ILa"7o ~.ip5b~L1|c``TQQy%f!7ڎ9AY=m+;ք[)\oۦ4q}u7ѬَCS"~?NNT9i˕U|esˏɩf?N$A{V&A X!ui@W}}J]5gA7U8ؼsߝ d Q_jvU:=Iq ywYv"K*8D`f#F#yvc%Q60mx}}4D4TE7TCq|GJrFvcy $FeJryRL<+1Ǭ 7NLيNTp%dY!UlѷT7q|f9/|?|Iz<YQ[+:N/C#% bv8ڱ he9]d[h jGI.j6xjyai['hlںI}Hj쭐Q^o! ;3abv8h.Ҵ[KrD~p۔Ѹ :{LJoKcSN,ZZ^ >[u*+FQdMf+ Vz*Ov4Y( X6Ekχ뛉 OtOHuyFKjbd  &ڬ7r¤saw#ߋ1AK%q:Ac#ҷ$GMD9? Hv3Ѩ*;]E촭'BɲYVYRwX81jY6 Y."@{@&mFvCWႨ5"3/j˟uWic9,^4)bH yA#8tpd42Zbv6FtpJǠt3$wʋD) 'sţκowjkz9QQ^/ { 3{(`ʱfkL6`4adH\EqU>Thkj īa[1YL&6VQmUTԔvXh4h80cFs['j4ơ t=jSsQ&^PZƉ3\"I4!OH]9;CzW?ϋOWJ[O JEySinsz1II 8܋(w>b*xjœFrVYUzj"L^4W"(s9kJs պ;#͙22,/(ifKWTX?`R;FĶ"}ҁ.["$W7w"ED_N'Z=)MǤGV(/Ա%-GOo|H2ƒ""B^"<ܝN+q|hV6֑n3s!?y}3 fcZg^d59lb#ώ^oTXr]vԆ)$saUB.$Y*⒊ }3%*k( 7^gg9SZlx[-3)crAQ0?BlS!B0WFl"D ԔTɩ1jQȆ̸C[]=JbԗPS]=Fn\ӑ!oy.ʪ-"B8M4vq v첿G'ƅi8N-PL~GPҲrɕQ}V.W])-0)6n5!}ǡGqzoJS?\!3 r^fl"52uI/0NSt2be7oPFz ԺF G&dzzqgz/L} : | y䅬6D39Rk0TGe )J4Fotipxa*q^O[$`]GU]Vx8  H8 $\$&褾=>[V%\۱s ZaS[)"ꈫ q0fGW`L8o \h{KbS쫧yMd3}hޤ gh_K]N ]b8-e3/Yx:SB*tKamDsl6$w#>/%_L1!&9L<.^!M_b;Lqhm+`w#[-'TqxR*5-bK $*D}|eݴSٝ+;oX7c5Kc ȕSiSoZPdz++`W1]vmt)=A#oj$!: R}\JWWHyowt iVMǐb Ԓ꫶V̬gJR}p5O٧?&Çm?;Z*8,IED.VScrXu'bk#&ОL&{Owo1S%-2Er2yHjQwQ{^s@B#6򜭵ۆiΑ*nA~] ZYns`MQ9Hqg n ?)*&{=&X3ZDnt֫(VRUP6zd'D[4f.W]HdK+o)B4d8Jxs׸ė[e9t N yRiN >6j檝ܗ1Re^JH*%9&(k`k>~S[Fju+,;셑`CpN fxKs3:ce^;!$hH\7]}qHHuP̝>L;KKazs\ 73t5sgu)bkPIw&6!]B2i}H ho ,vK' ;xoq: Fػ N p9@f$^B( gy+٨%athVZ6QlIȑq)ӯHu_hb4;Sm\ 73t5sgu)bkPIw&6!k߷=df-l$M l욎G BE8IozVE3"ʵQ ,\Wa.m*^|y"85{=(de j:B4fJA˂m̗;l3 t 1cPQWY|!1 HPv;QR|H6IQns8ATZ[=GxOm{ݩ9oqhdljƞ\ qTD#".[fu̧^<4(wc4m11Vdk,J^kH1gE[COjYpۏ%E/99.^S]U" ha`Pq]HcUoX:>KyTTC"*o,pɐz%{ASa%UqhvddpKmXѪ* 9MHt6I8XUl«+;Fk hB{":86dU+%j fk kpR0pow! _b2-lWkmŹ6E Fyۗ?4KdוggpG[*wݫ C+9^^=&I AnKOy#8E]k&Jw51_.?"@j4eu爇K [@c#t\!>1./tniPtąqǘ*._J(r{D;KI$%jy_2} @ڪ dht&4xݓ2/k!GhA2Kg_U~]ۯ5kV((WRWߨ$lUTΓ) #{wen5ƿ4TQwI$ I)h+98|M,mmŊ6 l(wfMÁ !v'o-r7Y-NդjGDT=U  5#ɏ%ReT0Qݓ\۬:l;XbW.q.m|X=<;G<܀vy(BϼJ v%-]Kx 5_ɪ6]<~ vt)-0( M# Bgd±|6 0gWf$Auްf$ŷ U9oEI: lr~F{rAMUOaВ8H>sϴ/XJ?4MEE5dEClcbR_n3om5qwq45ESV1e +Pb+@i(0byZ_O񜂕ÜyрgFĞy;=]mw㷏_6[Kл/r/5=RkZLa*uK)}XM8\d2"K nD U#Q*Q[ƑŠVI/09}#h8qc V ,vtHgkڌv[d2ڪxsϒ,5<. bh-VԳkAmy p I?í eb3,˫]qO3'y~ܜ d Ѷ,.2 = ׏lQbr9YwkXg*`42ٞz6k$k#bL=WLmExb_ ִ\Hy娗[u֜ݧ#GEx%Ra-VBqG$oDĜʳ|ޢ~]e65yk5WyXX#Ys78k axp{t(\^}MUynsշw؎GIkmY |Kw젹c& ~;㳜Ty[2B՟ifUV;} ,:gE\3Up9p A/s$joa&rk1f`"l¾o7̘qq\T߼MR|2>ҢN^r˴KyxE4iq Xj+ 쎀"*j+Zc'm*HR$D"l"tH bJIMEEWSR6](lAsH"&H (ȓUǏ]U䷉glbٶcYf"u$ W— *4Yl16ۢ1qL`lѫϛ4=Dc׍MD,+#"'}wm1i#-fO1+DbL a7 %WY[.nC˱i[`dajݕW2SPm #3(ݫ *>!ufǺ)|y5U-<_#\dc{&k[9nl"ҩsemֶ֫dv=& f{X9rl )| L%0*\w#ͯj49TK[U I}iꪉǧ-6UJii[! V sRň71 |FK +xznv4le.LeBSUN$fR .zV|IWѶ"̣EcuvMa!CzGk$bŞ5o/@\\~5TMj4@Յd\-$rHݤm.G(nnr 8:Ux*Ye}I}\$V<2a8ڵ4RuuB.H_jݢdQ룳Oq\LQjPO*ˈEDH!r5@(K_ʾ {?)vT2(O5sG_-C64#RvClY$.>6H?6ZPOY$hWLc]ura|3s%(yvT5nV&e$MgyKq7pTЭmkl uE6N$]N,f&^J~Tilxu 9Aoém㬭;?NQ^L}pi<FIKXT-i+f=oyi!@i鷺}pLk杫ܢv3ȄH % aQ!]] -Yʵ2=\.ܿ?{U3wvPbm?|T BHZ6m\/*HjѹTwD^*nτjk]:"±}Q{EYs!W&=ufJ`=b_9߯ʻheDzvk $LCۈnqPѫ4켵a"ʵi_ZՒF&RXiI1EGǒcwَKݞu0]QhQzo+c|7'Agwh+.I!Ȧt22fp)qW>pɩZRA)5v 5)96.H4M~0DĮdU*oeH޺!šdWѲm0E)ٿftv -ULg#r;DAq9 ch*&heXP'Q*IOz[Ʀ|~E}_9H5Cp,dGa=R5fqj.m]y9(k{ʣX.ϥq|ilv[Zc)xF ˤI4*z<&p3&T5uvĎfID D{vrnWOS*z3.+vjG R=aUxcAŲ!mҶSVjMQt<W[el9g{Yw ,|G,H>6Zv_ dF-"Z}' 1Rs$TM]Oݽy2'~E;{J-|V;YU4*Dimŵ0mla2nIP7]}vnW^E][H'(ratZuؒۨJED>QE,Z,3ٵ=7*glÉ4Qn"!M]; wkeUe2E]CfI<:#&J/6Yma\*Cj¼IuM:  :*Cw˙{@~¨*"v@k&|V.y.lbu(qhcƴ.+qפh]]}Ye!;i9F=ci^ӎ7dKZYDf]et#++Lrv=,,c=w|T-?&}U跳8;A!~YuOq7p#32kuU_U՜|o*ђ0f?1>QZT˦P[Y[?.]w^ûwߡ|ud;Sičc&◑o%ֳ]' #+M"ɒ%!ZWX;)Փy-Qy^ےps9S=2? x_+K 6GƝ0b 4OG$,MGae3Gh2ϜMqrMSѬqvrkJLۼ$:HP8l⢮rpui2H>ZdT>=hST=ӹ8gUvVP6K`!d"m*ˊh>4vu\ioh݄Hrm"_ncI>1#E4a9'ݺ sTT֯5M;eY s(m@J용Mୁ@ :1Dy*|˘ %!xp뤼Ee͆j;m.f(*TwN;uP#AK&|V.#渻n:xfq*}9NfSKvݔI!qݸFHZy_Zi#,J_M%id1 :ώ7*쫲/wj8؄$]oFWl8e f5M:+u$U6Dx""wpe_4f`7"!Y'"UUD}#_²ȟ\6G0jm˲] 旐|:s MKf2@,+kmٱRy'XxO +;i'3gU 1>[kO3eT. 63VK#5i5ۦǁ0J .{2 jZguXI:-={kFb;+{&Ʉ}RtAתW_%ǿǪPa _:$TX4.sUY)r; 7L>"/<;#Ĩ.'8ؘǗxԵc{Hi[xpƤJH;+&\6 `_UTշqq` ۆڋIĈ} <~!҆-Jl9QLȐdA\AqDRDؕSU5U]<յD\4a*U_N_pZ s' CvUc 4FfqR]'1+w-{:3MljWH!rK450S Imnv9+Ew9m8N%0ؓB[".+ɻ3: fBţK.3iQd 4BEDT],8MaQ%GtxĘϡ' "\e[SėuX_珹ٽ1i&O㋲""n^SEi"įN:""" UU}:v˅265 glYQQy|a]b8f/`2~7_AUhOo8%hck< tcKX9K|KVRB$D6j B= S#Mt_b[L[M "ı_[6&BKvqZ:L>>-NCO)YYU7dwC GCH)~GT jgsm̶NEuX= c{Q b8QNP6SX6'}Hf(*W#Ըʰް,.5^Ibo39qm鴂;jk%IhVխ#"B=+FǏkL5E[ũJsaWPxYxEAQl5W]KSj ]L(SW6U]Suv:K┎H$Ϩrf3)xw4 02,-6<idDDDM=z%S<[[*w e1dJ9R"#op%tE%a5"_h:lh[4qe eQQ7-3h*SW1pbHJ)~UbX =k^ōoW u5N譺.tEEؑubؼ­̕EG][*C\1[VБКǼ\g_#s)mʈ}:qn0+ z 3nLepAw$hB^A3< մDtq&͆J3a[֪yr`D^k #mQ_pm?#U ctV-^=_hdCcXA6(x"kB(QN˖T0zh_~KDDLٵ=6v%FCO 97_(g**x%IvWܔL X )vJím(Gu7k*I;`%pqUb:qw\=7N_Gnlf Kk`4A1!DmWDf EO}Q82tspĵOW_E)Bb |H,4T8Vȴh|}웳#b4{ }D|xA"-&()&)M{q^xˑ>d5_d*_M5; ,0b,m DSdgt,rڣY+SNi5̟ ĪclKqn(jm.~B}Id+[/T1k չS%3g:$ǡw&}$6nw4@-4bm誟;+&Zf)1XLz7w.q+,`J[MѮ;+&<~y"Mg9?' 6[uCt-N7Qx+BTvCE^hڢ; +f [1r9R=wuٮ|R-Z/fOHE'>o Qc 5*㋻XBm|Uuf2du$HqWƮ<9HTwU]vwVӬ %AO`,<<ͮۈ'eue5u-a ve:X%qkEO|>'{~0 %R [ C%9)漗B9 MیbMv9_=Ŀ5AKԃpiד *m#_.;ˮ0K{Wi%̔yU_/NT4Q2 -2-iEEdMvw5ӍMu{Fy U^j)3:ی5EV@/&δ4TK\~]Sվijv6eM]ըgAPS &23k 0~]aPDŽgo)kdF]cIik1fVR`)nC'U>EqW]a=n"Yd8 &Y01R%nzue=KyDHyڲbwt:)@Mf;pCVbrנQ`zDM9U[xj/As%5dž.i AAMйog7I8\Du)#Cb;]!dFdnnz]isf8UrdLZzaIe/+a iP֛}6^ey:$ls)*&7IYGL5bϊ $dD; ]2q7pבDUWUuYw"=P(ek %R[*~MbS:Qk Dqe0 Z"7&X/aT<: {e.@Bvآa`D Jx"/X6gCUɔ,ʊeȻlIw_h@N"웳9:x&-&CNаUk^d6˰d4B&£1jXqaj\7S'[:q쪾<GM]y 0ٍf۠. 8`Iʺs{k++X-p[mpHwTM]uwېԋHDYVUn v"=/⑥Vđ31lL2E]]3&OfK/te,rMlU/N0jS3jڂPRQR](ϻ"gܿ_*VO8(1T{Hၗ/Reř*.׺oڿ8V3eN./&^k*z\Q٫Y)֌ȕ x뮙7Nj%LjʹwyW/({er%/!~6hq %NRWeOʞd?%/!~~r/aCInGi@\G_0-6؅~TCAp_r"y.tVeGr>8;^H/l'aѬjiYܿ"1JzC_#l(&H+91'/z¶r@ZW4>*h]v^ C UMl!onЫmνk㬾s= y4EEA&@QS]e,ms ԧ/kZj MH Č{+m`Af+&fTDbO|ai"? Lfm8*B)$tHc%AM~MA[ $|Lg<#_9Wo:TY9bÛݤwYg'&6$%K ~[:'Jƙ`xa6JN/V2C?̘^B*lDUDaOݝ]ȷ3^Hl*a;!m WuUbn9b&SbV ںK5خ=NZdP? ׹&,@tŒ/B}iX+b6u5L ֯V 2#.w@جNH[SE]:1GS12/29 j(Zb;SAa{ wLU-Mg3X9i tHol8}v-'|FrɉjPGp 7i|OFN{R95ry꣇9O{4;4$I>&*涟ڞ7A]l9vnT57Ȥf+"*, jzyTFJz7L/!(/%1wfESSipqPyޕk.r|*IDZZ$6j`M6+|ZGmTT]acx핳#3pK7ֶ,$E}Ds@`Y,Zw+gH39}{o2{鏞∺KLS$(=2]ҹ lm=f؋&tu½{tvy[>(tE\FG 'A$9ePɾglj- r+ReΛb$뜄2HjXOflFvAǏS\(28毚da`W_άX,yn봬GiS:WLܗM;QlVH$__[)Jʊkl)K숉^ X-]=ZJcWHU_%8sy7UUmd58nYswuљn{nX=p^*ҝR'Ej?F)g]WOn &e.<}nBu~gL~dmμgDd6^حWKQJnK dwc2_SZxӿx4f-/$&Vz1jP A!##/Ȏ*SWe׊/*|{Ldu4~i[ŘVA~6<ͪ0o]Z˼N!9Rea7TY^Q`K;(]g_M}d6-^ꘟdbױJj("yΚ~]^"l˭&7~s\Kӫ8YíN?^\{m5[9p;6t }CU{p;ʈ=N<_996܆=ac987F-cxny*:,Dr?xͫϺ{|(MƔcb[$GTE"D_- ~e:)9>;,InKB$[!/ěq_y :*?%/!~. 3IHi\q>wWcDiSmOGHlIyuɷbpQ>~j8٥R&]t* "")~M4eN#eH;ӈ-7✋o/tF r Ò'%q4BO}^E\|DVeG,I t PvSe^vp&ڹ1;КBl6UP[rYnݯŭzElZ[)Rum|KWP|;J']ģ&wGhYxK8(qyƖR5ۉ":>eyiKy^ƴZ?6D ={zow~M-1عXٽk#FXljfuCAXϕ%f1bș!;EyJ!=š"Z#%˺rNŔ.j"(:Ő(zDIdXhaøg9et`AqRH4-|JIOLes:ԚigU>$&B6cyKgj\]\3f(b(/u8!I2SybɿMO&zZv v+-TdJ[6ݻ"AmO1q]bɅs,' kG.N° ⿍C1cyŠ\A9  㶻A͘h2Tx/i 7sş(bK@)-Rq2-%VblϰĮm7bs npcOI _t̓mOTI^i cɬp&x tM+=GI"4vQ[m{̖Yj@qSqDܔ%tbȣ,.dk И#DдמgG~cUx\O*"},ִ)pA ybݐq/ŕ֦XۣTdtC1HT歚ƶdk q\p*Jȵw0D%8&DUCS35p@્ 6'.)l0kc&ôgqg-5Dv|y MeGLI(|S-vɛS@sGnQd׮;@RS@OAͲqU?njg}̇ /Y1u&I/v";lɈ{ӲΪzꂖZ]E[dcZy݀k(&#I "ּǓXLTqWzEi3: -1*(Ցހ ' ≹)6E~w1?%{_}>g.ǰ %Rdu3uZ>*/"U6Ϛ ٮ15hԖ3+F : 1lvPssY]c^DbTc1!ɂczqICzOdK+sQ s"_za/Xq%$X }*!ob[x!vu.q#ZTXpA 1ed@/9.'ݝsy#ҭ-RK0N#Ϊ%w__5i2-Xl'F8n‚UFyUV=CsCMKq-t&7G&t`~EO]f(h*lf5wf@;6DjVQ)_Jsߘ֐*rZ(J\a#.a^"(6o;wM&SGy)mD6IiwRBS,g#ޓ% xmصmFm7ĥm?d*^R]T-\Q:FІg|#|]:||vsxɺedPYŦ^ANT^_|tKjGpqdx6YKϴlr4|YKid21Yqdhۉ*HJ~]!NL7'։(lM Rl0 SMo"d(=6]kt*{tQyap8v#fPn3eؤf;Kj|iA[o ﶬ 8vlڼE2MN.AQ-"젫?'QlFM!Bkv{/6""*<1X*ZȘɯj1Q$HhM7p]ۖΆ3ęk; ҉vV, SnxT[6:N`6ocVϫLiBƶ`=ɴq%C~b΃(J=qOHw2FdiU^ovkcf>CK9))f%cEI1Ox2$#aų&=Y0<#t >LEa)$ {#˽a,5 Xce;gVB4ݝ}S6J Ch;-⺬+uyr#ЗT됣n6 "r$[4x|Сf1Vj7L۪X@m}%mw{=5D^&`CG0FnDLE\؅*mU5'eh[r[. ͍^wa6䨛^ղ.˘pr#K[\U7S{yǗ%{7y_fgyKʩǜ`#hTusFk!LϝbK7Qi}q5u!Tig-X休`Au \EvR_]T\Arj JN_leA j@Bb)/uC;(e GLH5;OQN]WѯPžqӞ;X6հ:[G}/1Cvŷ_@s<_N%ni/ch܎E3q&L-qZAqȑ$0}h!">i6?BPl'&DAyeⲏ8+M(rgwb%~,9L>T™ T1YWϚ;C뱫q`%[~#s[V[F(iJEF ˧{T%NH51;XQ5D7DdQr5_81"c8|.@\`Cj@(6 'IDDuD{Z^_1_-āe7NP$sG؄ l2|αjf|imHQzE!r<){[tһý>}?Kn~<~N״,Ts {__ۊY7&mϤ 2uIаEyMX LIHP{5TKxNYͅ3ñ2d>銼$9̈*Alj JndleA j@Bh)*/ue]LaKUm$kELNL}cK% 6ڨª"Wmq|dlVyEP!Fuiqh 2 yaW}QŻ5mn >I ŎOYY.O(m/+~Wq*f)WÔL)Oi3u|Ѿ$;)gVUR90(Umdb V4ThМl{*=dUBϩ h1ܕ,*lԘ$ N'gV9]]tl$jr8qO-xw= ,ƣ]I*5 ۯ"xT4JݬdwzvA)5$ӑܧT| mmg}K84=)X6H?d$nZqL$ h[+K ÃR]|ٷv:}+,> g(fux8E8?7 )<ꖳS3msX,vREcl2ȤHnqne%߰e^9Yj@nGmFTPWtZiܨ|bV=K#~/t2ɧd]-S[1va]sEDFzd{> RN ,3>Y$g/8)j-",[']UA15r/!6<ͱ"O8iWj\uSJT "fU,'[FN.< q*47o+!׺ۃ1֢>{Ï_qDFm]bhb=iʏٰIҒ) *2u *VAe&ACb-yۭo2vf=[9 .шq[p>.*#iZZ}{8pyv åk&یBpUT< gIq} yQWStbC߽M ̏2HqPQUW/VO+ kKH ciޗ9[lo ?G3#͗n:ԣ2.FsF7f&Fc9xA[*0;7l&D_Χ* q%bew\ i!%MuD9% SO G{U2< eIPymP9 LN^* vW DI'2ufgݛ/Ͷ{@{-Kb16dAbFm^&Cl D"oǡe:yJc5&j*l}wÙ:fS҈w #-]5Kl:hZnaƬpYD&'ʎ*ju־|ž!UVEAaqj `x+eS.zO1Q9+lTTD5j v[':bΆȴXcDBKXbgZ`̸Z1i% f f>S! E9m wYrlQ=$sXqjKS> 5*uz!.ԋЄ@*t+|Yx.n2"hhfG"8C]Vyc:Ɓ(AbW~e9xq܉Mu#5\_)Kњج '!2Z2XEXO<$j? sHlz?]feBw0{tY w>]OCAlLwE92]f& ī`&|;ᆰ&bv9)5Vy]f\>&l4/W̒ޣE<CJpL[S̸^r'Q7bN93/puHS~;|m]fG:*嫹S{X$>[ `WwK>R}nQc|y|tozK.c[ܤJ;! Tm/B|edׄ5sGt$ + LQ"P?࿜~@Tx]?"xO65tSmD8wTN??EV˅h"(o3,RU*}mbO ϤZr*m3ǩib̴|eYʏY!"H#;~:#&O# vʺtD,)l^w w[-<qKz)JR*c)md@Ռ̯cܤO%,g|uwˈz6r1Q?: 3am;&>& M$M}9 C:k9YM*qmԐx2<[MO.+fvuڝhqp'v=E]R19PKqb6/4Dޘ*gOeeeaY_3L@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi/Oѧh 4i4M}}>@_Fi۟ro~_9 D!?/geQ%'ɭyDH\m 쾅{ϓ+/rVM[ĻbERu`٫ˉLJn6&~m-T '3ޘnU.vQvBF$;W2{許fD9Ud6˱MѺ65N<[\')nˑ+leZDI=uɓ b;F$lvV3g.2IcÊ/Iyx䨚D9mJ~wjR'\+VO61u 쨋>Qd}7X۶Sf X#m NNՔ}$ Tt{}>^Ls.Xu_3(l0߁6c96f, jjFنaj*v1֎M%sA*HeDlH+b;[w[< FqK'!ݙ*I: bL% m*/RU抆5\ `J"iUH07UTtPMWS/r+Y.UK_ "mw{>NBBn u{wF-;gO͕ Sgw3jU,d}ҿ*C<1a†ml2*d')˱~y-;=:}򜽰h'R K@}bIS4SA~<^;\l,N;c(ع.^McG P]t2j|i^Dsw )=>r" }?jVP7fɯ*>u***2A69]mY>l,㊪n>Q=vr.+4%:1tW7hsE_^l&m_s~B]Rr'w" nI}z|fr$"D2,&6B~TҪq 1D["I#IA&Csl!$n*؏S_BQ?a{I0*8m\WP[i ۀGPВ\DI]|_ReU3ݚZfE3^I2yu 's:em_aYYVd}[hϋ`qBN)Gnk e]e d5"*yםB<*qKce m{FBeRNODdw0N22/^J<:/Fy(y.xb਋:[dNQ gq-FA& lh犗%})1R%wzhI8ҌYB[j%{ ܵ3nU +̚2GrO5UdE/ XM+Ū-߇_Ir,\DWO 7S}ٞfkeabѼ)5-T̉Su`iVIQl?sk$i]^Evz_Ϗ:묲$P&S~Ϯ[e\H( }/F'Fd$;j[*rWכm@D:hͪfDLg|WyQQEU]D|,;2.$kmc>``"*/݅.vŃgM)bB75]UU}%v-E.(%i:$kc<q-q=Bwh4Vήg0)p"CݦD{" .XgַEeC/yR;M]AMru:Fnd>ɫjyjf=ӕFd;& N)g8Xc.4ǞǙz-3R'bh[pSXFsQvE9krFm7zʢagTW.wt&Lg3d*ߛ pR %;CER]a321,ѵIcAs u^l='ǐ.+.qY6rJ(rdo-\Kozz.>[FSA'®gjǜ:d<؍Xd]'QMɱ[ahn7t9]byJ,jg,؅%ZY1V7HLOe=Z`ncoOk IikՐo@@CvggqkJK>,3_ I-,@˱\yAM خmiEf}yYV9h őӌ40gVi=7ϟ4ӽ= c-tb5s˹m9a{&͐ d8rC<*|~K*)[wˆDB~k1 ݔ5]ߴ-+wt>P]i,=ZfWuN@Y!KuΚ&Evڧ;V9-f1G#c.~,FR? y/2r ɨ`͋bi:_"TWUb2<1撻4v jP#:J;TM:{^ Z>/›'0!7(y 6I4f $M]2̇6Ŧf4o!Vw+d.F)edG~mm ؽbdZe~JDh|5m&nefw95Yҵ&3jZx9x]UIȸ;c=~6n QD_G/!~ﻝ-' w($T&S-}TEiʟ?S_BQ?1^{"*4o٨<aO"AV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfEPltcT|WmAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٨0dzPaUfAV={5Xj ?Uc٦gܺM|9pDm/صjݧj,;>t|nXy #f-fKLF7!Q"mqE_DmmII_"%Mr܍b%l`ӝeaV qv#dupIkFI$n#/GT2_Q%vY'b嵙*a޷A;ٶŨKAMo9Wwۼmﭒ2:85k,1] wkf_kw ]I7&'sm/7zbd(A"Q/_&\DO%To܎HɴUU܎FL;eE{m7_r::]Nˎ໯|||SY~_s#1;z½رA k0l~֬8,Ưdl =+kO~M⋹k &M5]E\"yrʲo6ˠj|Zom;L6͜%̐y0덴:h]& I2] C.\g(bшFy3)XLaynz@]Q~?.Lb$NOy}fAPKt]ѩ PRՕMSr[1]RD=x?}vc3wM&͒%ǩI&?F2x|A-KUt5[ yD7*F@&eݞaUQ+X H$ eW~FIru7eY:sʤըz4]&Atď/i S^[P[)ȓ LrTx3%i J+sd M=#n*l*|u܆N).HN+;ZF&}wuQYWqer2K5pح%HLQ|*pwNϢ˘S\݌S:RnIǻ%sk/{icG&mXQ[fȁ=EIbAb&t $vNE[H έ/ٝq>:(y͉!-^+m.ft$Q /`q[ mqLe>ɬnth<ɠۣ*SUǺ 1k|Qx-F^F!Sf2^r )]V gm Jy:|2*сo"Kv_e>t2u.; ̀b"M䑱9 UĒx:ě$yB3rdȐh&bIltEuyg&m?ZRRxGHMAsRY˧[E9Ak2ζ$ ٱaOa˅ n(!ई[kh$bV3sLvV3w&ŗeOF&xz5pj!deIcx#4bCHf0 8|u-,2 x,q+=cڵsp~nπ8SbeY P#G76O܁RF3Enr{B d6ĭM2؟^e4J)_'TM4sH_84< Lzh6*4⇈+`ݤ5[8Efs&A&d۬iM=eF\X۳ qagWC|I\5]|>]v\}9gɉ -'O+ʓ Iiw=7= {v5B]Kp&k'#Y<(We 6s|bܩ'!h Ek&dDb ZiUtdm|T3S#6c'UrUΜ8n:ۦ6E/c9%]uj[\=^=Y[hmmሼ<~nޱ'#K<рiDqIE92Eb:GU{M@s}MLdcՓ-zTy"Gp}(Sڹ'c4kD|K6q=\~\9!"f!7n+OhyIs@1T!UOsL#Qmz4v6;9b{N (Bӊ*Uⱑew,&R~#bv"lԶfO̎DhE凘Gg6ӊ|W$ɓ_m[]w9ԌFe8=g૮r0",2hS2\Wo\z\Z7Qf$6IHx*nԻ5AuCn ˉv~`9l99ڴ{9]X z cYd ZDa!vIQ*NΩ>Pr98c巳F=T յDRMsZ7uw[6]/NZiDqv-crW.1)w4Mm75LV3䂌ӊ.]:ebݰqWnz"Y&2QГ2dfg\xefE_㶸NoWCvl<[ߤ6D[̮1)XZVN%ؽ iBA Ie0+cSRIF.l6F B }Cgrܝ`)ܾ/)ӥVR ɷ>q| NJ& J-VؒΓI\KlHK-1;ۍt KX̌"FKcC FB3y#qfA= u6efSrkK dwc`JHv{waeƑ'ɭZQj9ItIvK2M> ׿BQ?~[u:7j6NRʚRl[ut]e^"XA*%bu>PVE޲E?8#T52%n`IHYNHHA=4O9>Ʒk+ɵjNCՐ٠_;_9 DQմE^Ia.{m;lɤήnoz־\+Jlfڰ฻봆;뤷klV  фOýrE&bDı[5NwEɑ95Ⱥ,([#?9 D6m&/`w`obO/m/m/m/m/m/m@ptEPOT|o;1!2@ "03p#`4AB5QCP$%6aDcmO@/tG V89Nq}#͒65. SlXwdS,i{-;w~,]åcZ2M6W I#nf*vHT~:0 ]=ؽ> aSA͌J~ٱh??S'7#Cjh6>F(]1| X J{qyox6D5E >dȁyc':3 %v.P8 _x)t斜\T(Je#/bdx4ۼmh]4S‚">_Uǝ;3IپHvC.RniynqrQ.TRPq]e\YrT܊Nn?(!GV8_(} IB`/BY7EChuyZdU8ɽ}ng \P@kZ%LD1#1QIUp| KUdyy&^cY$ܟjA \,('LB+bZEThvb&7'ksY%Y >*h@l1GZYM?3ů/ݓGnOӘM<QNC ؈,S:uCl1x}0$&HYbRYm]ݔEKOO?XOu_-?"(=7Iy0qҷ_dNk&).dc.$u3^369qmL, *h_TBƴKS}(⍱nE$FX[N?xJb=cI$ZQkFf݌-"(bI,-xdj(aVbD̥X-RbϺ)~~3)&=Bh9ia:] w>ɭ8:s sm#rU*G q𤋮x>VVUv4SqqA'gQ%خ'<O;daCd+w]yjʞTrpxnN~fjAu\Gj#{5~JP#ZS?H=;L`)$ 3Q7GxrLImDR>6Au3o4)*vPc\L F0C;{iįsC 6mțl~xܥԻs[hnt> O9f=8-_;It* CcI=e$5̥)8^;W51d;U\*;KO Xu?Sd:/bɃ`t_G&_qOOOOOqE ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E\ ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHa"E ,$XHyۿGS~B[{Qv lox{mKm384ٮFy4ٮF p 藪6DRf(?pQw{'$;#slؾU?uGSg9 2"8!ajٯlvQI=SԽpkf7i?>u>+D&>ecC+]7 ܨ ;lqچPˇ6XwKM=K7*k.RlFJw, 3E &k >u>'j:nJW \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p¸W \+p>GSV X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`V X+`Gj:ob{#s ?O>u?G}(BjLp||Eeg%Sؘ7OIt}{C[_\ES }SZAv'+߹W׿:Uk'!~!m*ivЊN67VORK%|9Oȫl=7?Yv㗂Ch9z:*{c [jUQO^(%9*VsW[GS~~~@[oe  }SZAv'+;Ҝ.Dp, my]S?O>u?A>6Ypq CvA?pQtA?pQw }}aeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeNh:of}ƆAYRijx)wKM{2VH꺍ZY-MD͍ysiO BJW6 t;859$cyZl˜IoepV^vO %y]et\ OAv-w&,}twqluYJYOC|}KlU<5rVrxd80Ԩ:84\"-']1IaW#J#^.8;/IF _*wD}Ay4Gu)S@y;!M$b1VQ?GS6D_<}u>޹ac⪕-MC=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭBI.Vǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzcǭ[=lzn}~(E$2nBOS<&ߊ\_ S u(:|.snney0.CҘ6y_QtUxK10\Uwc|lvH#jTITT-MLN^&exq־;dpޟjc!v:c"SzTBtlSzN8QPK e'7cǹ`kJtj'1cl|<RtʋN&5c.526i@ lM¤`5Yy"G+Z#kcS}#52g1W!xeIX?.:O*jJT e :D]bDu?GSu?GSu?GSu?G !1A "Qa2q0Rp#BP@CS`brc ?tKQ3o^GiHn_Iͤbyrk_@,7yG}-UD_,ץϡI}-,wӞL9t3ȧKG>&=.9K-l WC}|1>|N\_ .z.htCyNmnv]hgǬpzks2O\Owh#jFr]47W9XOWPr׾iiB~kr _,/'KW'ѽ{|X+NNᄈKKb2xqP7','ĩ6rjQ>{ҲOMuۻUү^<<?M'X|w7ϗE>C6s-z,ճoli\vt.^oE42\=O=m;llc=OX#f^n:QC|QX#֣w{<ח=~=5Y_s5=.KWy5;B}x/lvW.=ûطlz<-~kGa93BCelmiY!<*N_&Y07NmKO*k,Q˻aayε(w01fwyTgYe,Ɨg )" q!-iIx.<`PJ GK[i$居x)e-[3 6& a\t:{߰^nZt۵׉JydW۽>GvokF7\=!$+Cj $!p{=CZ![ ~Q9ij|Z[qZjhA3Χ;?S,٭S]ޱZ}*%<ٹSv>~ #8ONĵ k%iVeM1B>u;Mjn-(ZYE%qŪ=BͶ W3cqP!eiF߃ߏ3fhQ\-B҅ص>u49z/cbGz%ً,&]nbK]m(Ïdg(*Ŕexi՘O|}ƞ{䜣~ ÒO1)fz=>'zg,+$'n1%֛s˰Ŗ+\'/zcx6:$x=:,u4Odž]pv:=8I~<^ |$Gczt]~<$D|ht=I?BOēskbG3<|1e)3s9~&$߿jI?|v:~$o^t$62OvIǠD >5L?>?@螧#QW S='ĎGyoU1%zU-U%K6Iv gLo'rRQ͕_A0q+.4m\trϲNF髡+ԊtmUggA[b Qr0],4X! TBhHW\49-D\vG.K}Y' vO]RKZy 7b*]=;ci:ٓU=tbe%D662Yϝ,ŵF"yK1C1䲲z;]8b-IRYvʲ.o~R JQ_*{gdҒI= e ]UJ7~RlYsG.qnyRv]_ ˧G jYR}W?)`.[=oy"(((((((((((((((((((((((((((((((((((((((((((((((( sFѷp\_k5s^17";Lit9pN1j͘NBeKX5X~x_tz>ިqmeY8 Ro$8/Likkݾ{'>WJ=pO?Zo]׮k7&g_Y(pUMsCQRO7'b] QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEmau[W59*&jzgVZz (5*旴pqRTׯc>qQ;&$|j1bz;g7Z}÷߱nwZKS%rK܇55^heWGŸ%^_5~>XfWzUY%&3IyN[oWP9ײXrO\!}Ʃ7v6Ⱦ ~+wcėL ccccccccccccccccccccccccccccccccccccccccccccc]E/a9.^Ύ=,UTC3#LW΄tx!Pjջm-}cl$'w=;I=;qcvb-If%umw8w^}._j%˒Wcz_9 A!0p3"1@`#45BP%67Cq/kg ˬ Z =DBG7 `GڛF"D}͗1]6ul]4''e)eSf!ľβ`1|gGVkI.ziTef4F˟"R`֊F 1|1-x UlfJ8vd4CF&cyf/Zv_}}MWNǧ]}űsxBZ8\k dg)qA1w=Iԝ>zuZkh]=? xvA,dmU{YƜ p#^60h.]Yl* ҚR\)@WF о3XlhY+pe,HS8QqZ ʔs̒p>G[%Xyy*f~&=} v.;u]}Lr<,r-B&a!",XZǷ&TjZ!@Ts轾ڮDN.;t;uuN _1 ]["}v `?ę& 3Nr^"ASt1BDBVI697\3IC9&v vqÜy%q R@2&:8c~ٳ\0!k7:Bk.ы,!>{*TCIGAE֪)Gٚ#Nh;Ep?~/}<^}-{̭S#-{QQt5oO<[Setcxva8.o{$\Y‡1faa0A0LjHQ.A$9q1 D\/F4٧N+oGm MEt\._OLzimqmcKf [DErFq@E<2mb)Lʲ*S.IbZ2Kb LvLQ i%3_Q+i6!$C(K7RxqICBZ>2qg>yfE}~\ !_͊c$ۂ1 y{'W0v0&/CϷ` 3U[jZ@@fK),$WW2[hKyv%L,!mnHYDXZrB0œYry _&96B!_S:f^*1wP:y g@E<6Q%!^,YirIkC0K! |Jw C@O7vr'tuޚ'"W&_f6{+G0.Ȏ[!hUr&++ (3+%,0Ӟ'!+&-.ylM|rHi GA|0ɮ6Ⲗ!!%y|)hH,EaTq+1w0(ddpsEly8ucZUjȋ S T+W+^}+Fk>\v(rfzT:}l<]5a-,6d1傓8ui'd71iIDrYuM 9>k@<'aDnGT폿T'YZ--Y } 0!@Yxdc2PS̑*y"ƵkQXPiaaRfB2&:gLyyՃa'h5#gF-9%L  !1A"Qaq2BRp #`b03CrPS$c ?4 ͕AF 8«(ٝ_វ6Qb^<}M{R-NqJSI8ŗ5;I>H ԝOͮAm~ACKuhHٴ!{(wgMďn27->bJ]7p]:ĽxR d73Taw/~!;Ělj9g0* 1-2ƖkwZB]Ib/HKǓ#xhϵx%Fk{`KbG;BOTPRXblZ>l^ϯQRrIrO2c:E}B2RIw6DPEE5hԡ̓ )aEGLRG"DLQYOBD," PHj-Duu/Duzx<KO&T,k‰9ʔ]@I߿FSaYIa| :~Pۄp>> ǒ=DEݪJXR@Rp"xBG0x}nP\B owpTM_ IwK5̲ܶURoVO-RKӞ^7<)y3,ʘ1b ɫ3|SB1s}@(L`jUSeN%"DBR pz}Z ."J/eTTnf,_SajپӲ(#1sFvѣ󺒧R,?x>Q/xdIRDg)3 I2\X,HV%՟S R%e(,k,P3qkku8QXne3!db(2Hr/P-дKRe+^^R;;5EY ]Zz$TS6gG $ѱB_K($U2if%oO=# )Jru}DS)e <ȕ,aЀMܗRH AfZ 1)JPzPeacŒ.7|Pդ3lRH)bLk4 $\5p|FHVsDsvt"g(PJl&wKAk^$X\ 8# -2&OuTUim e$:;/wJ;hS'!2ҙJ Ik^&'e񵪷ӴUɹ1#y$(vF]Hb IKF';sjRڙ0&dR8s_.!1aAQq 0@p`P?!ƤD CBW'n҄Wt 涛{l+|,"epe>pޜvӜ"D )wXhBilD4?(ShLITޕjZ%1 [zv=oDLu!jiuzɐثJ#!k҉ F`:8}&HilyQILD5&M|z cœ'˫ޅݎ/ZSޛ9fozX15tC[Q:qCrk!f/?Pj8 "l$HٕͭPo@ISm-%fCQA\H|3C 6iu!EVDޞ'_M֒Nwa~5,L<ݢ4 K1AMM VHa3-PjhN M Pۘ$(WPDQUIֽWl/A"mu$^hw$6;; 镆Ӳ_גVwTchMuơ9/؁hZuQoOfEv-9NAI= XU2nVZױggҳu .wX5 a/#GFOZ.9mQWKLǞD\ zycG1;t{gM'>wzTTD<#Nʭ% qD-*U}'D۠Xn K_/ipx֢/g#NWd^BpխUN6Dcs_I>:Q}dNkD*t5<StٽO@ڱJK cFt'VIdKK܅X^R-0;Œ6;%ĴS;pItݐԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝz;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIړ'jNԝ;RvIڑE[z.osCz.osCz.osb.Aj$%覩@={B^eb,KP"(K,f[*V= MUMJ%Q-ͮGCz.osj K]c52S*s>x<֤F rZ!&sqϧaAkQ^/d=s{%ժhH!܄7 {Qu;3ZɒۈX*p!t=>ע? =>ע s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3s9g3Ƙz.op`0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 z}EJ= ;t'eJ5WZ}W? =>עmHTJЅMiȵѵR#-f% OVC][:#=R/(Pۡčn.Q}9t1+|YwFQIM4Ǣ> Tz>mTzM[#d}Tdz>md-SBT{cU69GFHRkȻ2n jJj0-^{P#NQriIS{& ^-7 f%ej=BG8Mje5P B"=(3BSAv=lOF$Sf(3MlWQepjSk(?NM5 g]C٦ 2P 6i{'EخjPbqt=>עR چ6 HCv/PVK:t(NщQ]wIJyTs 4DyVӊ9i%YC:nLlIRt$-mlcHM Ƣ-b" 1r*;lfV@q*bfWųQz+Qаf!APBTԆ;Ҭ@@hkc4*+w 1" 1X[4-Eq] 2*1_bzkt{WOM}qUKQM:Ge= t=>ע(^ѩsCz.CN`lQU*TH}g~HE=4B聭~5(=m#оz#MCz.+ƪls?P!1h! uP:sFVʏ2͋c.1XIJgbhh_cclVaaQ\wq#4>=;tض[~OYf\ɹr1h/n)l[+eѡd![XlDzU qC-e٤6-{l{Q#!wvŵz1}z}EUO׹n~iݲvO]>]>ݮf3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71f3snc71_s]>߮ }EbJRB&FE䡇tۡʍ5=2GHPijJIPͅ&&A0uڄJͲ_A#)IUBpMn(ʞ77Bm EYdiy(M63-mszH0^S9I:)73X؋KCpTd.=n5CȬ"&QBE&v dF[Z"Hm dyi5&7c!11"Zt&J#aO=H*)z_v!|brRkFb9M:3&5bhI,+HYմVomuDn&aDuz &)Ѕ$CA{DUT[Lci6 8Pz6aRaS-JԪM{l?Dšj]S[%kW`ES%$:;i.[M$V7F=@0I \J-DƱq/YZ.X-=W KIn@j(Ti.E[m]>ՙ:.OaO^?r;*Z7jFmz.Uh > :4lBY+|UczaVޓJ+Ӣ_yxpG Pl|e\FȎFTZU/=0=Ai6:xRqC{CSvĥV# ah5SlZos_ ҆9hIFi—U.[4ſQE3OȮ%OB(eErO}BS;!Li;T^&%yc%&1pn"G{%TmA*Y.i`U8mo/1vFwI =!e^,$7/hC(1.~(Sr$-TӛJP>TJ_]ן/O}O"wQeJSѡ3N=#EP۵}I)PǓWRTʲGkxh|.e~m~m~m~m~m~m/!1AQ aq0p@P`?! h> rڽzȎ#Bf9DR)y7KaMkBU'zyeskgKCS !FćWYjx>$h&h*U o'ZpuZm*iMkvq?"[2$-_([}aMgyQd֚Tqfmo#csMXpVV2\U[]nx<Ѥl-tlk=Hj +kDVK5$T=trd{$4+߃hpГkSëE7}$yCb>=lGt>GNm}7ggpiSJKaX*ZƳЃЌh` `Xdty!!= 15:0HAq65c1W鉯f"U'bwQ ݺGQlk>!V&mW-E3_F>⾳gf'ILcdžSTjC{}>\O}Jf{;eOۭ xn5vV+?/zW WNxkX=˭}/JW"O!!9i}<4o߸3/}Wς ~ W㯥#juU6]R:H<q!a"]( Ol ;&dm_{dvx 5rӄ|YPn45 VdNU\62!a^g|Sfx8U- 83EK7Nzh=y&w,^WĂfq^G&D^'z-`/ W-tjȘ=e4Y1h\l͌Q gЂBbtĆlz()6H3|-CaKFKW*QAВi~<(ϖjoȅU:G\{1-1.B<rMZ6nt_.n'n'"************************************************************************************************************************************************************************************************?n#FaP3FJoGc_~ޞ/6\=O5*M-ʓ%oN 2lH?"R:t7H{)򣏝|oPi]zuX]o - ]+sѤl?ADӝVjJ*i!XcӬ F1pҊ6!h9i8G_mn0 UO%UVD}<+S0y'&j |L_ct7W"av;*(SX|>0anR)9"FڷI$,iP]\KD3S<'*Cэ Y[tɋ?<~ΊֱyCZsW\l sպdKn-u-a'><~ͭ#m7[Oxm•o8 XI$($B^q)3qܷ h;,bcT _.>v4TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT-~٧4 \HLVYN&;aϘ+6=-gu[bmHUm Tcc̍-qIS%VL-D) c5p3w #jM463{YHaUMF1r5?"vLb lL!NO"X!W{*a$W~٧FpV*dB>sNDy.^ו-P[ epw/fh 0 E)ySO Q)~Ƥ4D(Y\'7W|̍O6'f}׆bErV:-I@֩{o3\ICREDdlLMVQJ׼nໟ 呦l=*(G12rPkw#K24hƌ9zYp4|f2.డq?kU;^1YbLexf<#jNMBwV*ՖNM,ytUMo7ʌc @q0޿@F;DdmvhUg䀳tc4c mgxd H-  ƨL4ś:uTk41n5xy7?ߔ%|,2!lȨH<c)[?E7i]~dT[rM9O}`B^(1(6v?o.!1 AQ0aPpq@`?яUg} m  gW7.u63mA罧ܘ=>^21 ׵?R(tPa0W 1e0yDOA|LGg:Yě8O:, ms`$ ޤD~%~ _k>-YCr䈰eBJxF;"Y+nOdt) ' eQ" Sehr$^S 4]jJӍ[3JDzІz*E27T)` B=UPzXzfx)P*o#y='dBP Cez\XSGe mu^# RЯei؁ Lyp6 DHݖ7c5s QFZNQq"X+OğVL[`p=tyoTDS#*0cÑD{WF"Qn RgUkٿSt8UΧ}VbC %F (-)*pnj'jM֗m$P==w]޿4!5'_4)^zD+]8GX'h x͉M-iL-x6ڨ-u){5AGv&ЦEIF9% }fqxGϜW(CuL^o^喦RR. PSAr; cC7bcpCMw)B[V|P en;`z|H$8r==ڹZ(*!}<RZ "A|Z%Fa0&Nr!ʖе?hb{qB|8Z]f&$HIlUsvB5F (Hx݃C0ieu+ԡȖsAyp!jUSCq&6HJB!djyF kYxw6ܺuT:KY(cfsp^ZɵRYP`/&m,1A 4:m`,/nzX7Dw h4*ehSAG SnI$$p/>=Ċa< OXtEuqeGf Cbd'n1D|-wVFʮBѰ܇[w+Ugzn#3Y35*Owqa -(}Y 9t1Yej{%{l 2@|):oޏiՆ)PS,4XeEI HLZ SUnLak߻ ĂEi43ҡGbr )PUx{Qxz\|-2DȗO<̙J{Y!FNF) [4?L)+ųQM cXDO EbvY)rOpsb6i Щ0"CE*"iᐊkgPFNû:BS1q'Jr P9=wE@2z 3c< x el'"BԤ@=-AT27DKh@ p ZvỄsXnF&[Q-褭0LhREpD\'cJJ}zԬ$N$QRLCǾ짲 BYb`EWp6OY )eٰ%٪3$eR0 | mAP4oΛԖAM-ЃoQT$EB>a7.,ZtD!ӦEr3"t-%!u BU+U e{_!"3=u'߿@$IrҀHou1U ,ԪN;Iz sô4|P~LJ/]bjߣ8U PD"0kro AL ඍ9d#SjI`DT˭k.DvKǿ[Fޡ 5olz`[ 2nR׼b,`c1QDƾE]:k*{{ࢮT? lf$)`py ,ӶKM@-5 {@ROF9B)8i5w(Qgaf5CҘZ$&0D\9aㅧ3Dh%p?Tz /hr6{T i jB K2}6PM" meyаSP `vf?oٶ>ő;PIqmaG3eUU\}Z(TD.@1O ugma[Ŭ39Q!slY`Mn+d ԛK?ja [;d2vw#@gv2U Aj'AR&*o K{5 ߃b,nxگbEJmf3J {]Xm$ (W*ڨ#Mѣ{ MRj >? ZUPe2}W7 8-03aFs֪Wy$ h@ 5O1D "}>*@]`r9rָ0RN2 .$@R& fP.2X6asDV$P pƸe) cӍRVp׌"觅-K|;S.ƬP`$EU]`,Q.ı T`'b;V;zI-DDl2-4pF`)tHv:v?Dvʓd̃4 xyb5EK(,{j\nj* ~~*H|Ew1!h_|90= '0\23 Bbvi",r-"Ɍ#=.S}ˌ琘!go\.A/t օ0ϐ`:~dj2u>ȏ"=ↁhԘj0Xq8KNUZm񍬐wb(UpG )BʘC,^\AIHFXb͝uAcH8Gd1Q,1{LhvMXv O9n& E39V1ヱU4HS2d*Ai8ql$Je@VkO)A+hdĤD雞KxhWѨq<7[0cja0Ah5wu/zP6yD3(2$51$6573Ҫ aJ~M;4P @t1nwL܄ztݳe|O{NYzˣ4!cw!av84a?$ɎH3mFG_shGk6S ]kO\3p&: z&&ʂLp+kVR?|*O֩鑞l@.r")fH/>ftxuup0>!Ɉ2(٢ʂ)03/1w'n}y^z?$s#w<;_^ 8eX$:ޜO`1r-aaQSDf8p&O{ķmX'_1OEB+]A*3f,%59N&1b[ ,:e*a_^ 8eX=_p mp }:d*zTC?u=0wq=c\qU9X-D?PB&kA~^(d;!|nsIhmP% 5 ZoztCYR g| dA:₍-I L@% Tb)L'KRT!ɢJ&1  6 ZZ=x> i0"W0H?"VF(DHg)**T} X8dck q"bЈa5V#徚 ,,-͈R! z>a\j[8zo0zЃ(rCVـ9ֹ_Ldw(E6qtrK^@PBfdyMɟ諫ʧ1(;H܆Y}lk6ACC,Yr[LsSQ k[gG \G1L0 ɸ"y3u|=1^'X<`mDad `Q"qoX&a%K+fSVGڍz#ð](R3ʮB1@w*lfG7Ʈ,2Ho V<^s2CY4딦oodf:zA0VC=- M5[lom,FϿ6LB!,RV`IH١*ft88ëf:d߉21Ѿ\2L _mOgeb2!,aਫ਼TsR/Y@kBM ^Md.:*C0̦\6?d&L2dɓ&OpS% vL2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2d2dɓ&L2dcJS4wɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L᝹!w޿'8XIPܒp }J,:b<*)a»…*BEQ E FU0е |GI1(`R+*:VΙ q`3,ɕ*P>lX!n,sVsz²KRm%J! O} baPkOdL "i9eԒKà ,WwځḴ0&"x'sjxuo pDeG&+uv1f$Fa'WзPAlam.1xLK5gQ! hz&9p22ԋe愹n*P8[kOfZ۔P5olc1@,<u|71 4SIbQʜg1J!V{%Ay֤ꖅ%&v/'S0ҭդ%E2G"<m{mZқ:ŋ%] ?TA$57fmg g]E!8O|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>sO|S:9Χu>s$Ixγu3gcmC`I˔Otlq1}_Yw?3(R{ P++<78){b$emcPJ܄d+`v)G  @`@v iI{ʝ}O(ՠiUlbmӋaNq5!&Y[k`aFm9w/X auA; ;%kGcpFW0Md٠tSmU_XݞxD:>+Nb!2!5Yii rDӛ"CmA1R e%+G~AĂ ‚Vp<&&*Xxb>~ap$į? ƴ?-h o?plS•m)4D0E=Mc*01Я,b @аz 0AeB tm%a̜Ƞmw@7DfU]+(@+~:~l>>1 |$ױ_\nk\btȅ=Ey d7.1ޔO{ŲAr$Y)T?g3t|0 CH0֏D N) 0*d$ᒋJH@85/R3~J3G6 ,NArI60,bmF,w4x"`m_XENCS9ȯ wWrIԧy ; n4 ڍBsz i!MmI-oQ_eWUmjuWrw7;Qalo6 6IM gs ZV/OEDCڣ%*B[ iUۯ`nh H;H}B  6"~90νB-?:qxݱc bnmμYRCw\LVu)[/iR54Ko# ضGdZan؄Z(L̔6j(ڹ7Cá5®>ITނdӆBi1BE`x#D`s_=8j"|q6 5 WE+UH1"*V̀},&-ą W tJ}zHnyc1^1hX;&͜OCs"G&>|u@YvCdC;(rKN0J+"*L9U'gۈU$$ ^Ua𨠎 X(5*!*=1^ Q  o!#!k5bDwi^5=ZpPcƝиh7;gHCqLdZ\cz̛|AUllr, hNF, 1% g )JgK@ Y'v>Sb*Ǚ%EFtZRlk9$d0qVWS6I_kM,NMi1>>-i&<@)F e |=4O *01tCK{ k)? ֡t6$]ˇXiy4) B_+|sj$^%b7 /qg! 3|7 0l9=ވ ]!lb߾\,DC#24w36 FMaS(E %\l)?)b(Jh!b!(M--^0I`_ 55E7ȀY)ÆLGVlJPo!R#,L<&:R0nlb5! X2]oSZSD@F-%7(8D&L8s1/ YAZBʞJ^=-#[-`ZW[ڪrjF<^:԰iC&fR=ZE/3lJm(H="+ҢD*L_U1ViaR FV"ir&!mӚ鷭=-#[-`Z[-ABUt3!݈Sݡ\߻&cP]>9D) v? 3FrtגK\՘ƈ}}% ( KiX RD?4 5 ̖&3tǁ(0\R탣e(4Ya=οD+ٔS-И"GjhbN{ .ocȶ.mH,0j;'KvIuEUm2UVh95H{Q{㳇M,vZE$ F/ЦOsS)aeaL6EǀeLgu]"Zׅ¼-0U6Vޡi0x|?D;of  ؔ0&\QXF7RO8 ")׽*WC AC e}&J3nvbKM"e9ڏCӘJ8( h`vQ<$ŤU mQ]; A y/*.} &,(_` DG<I8, kDh0X``*UI;rbgql6PFbձ@@ p 'H@S?5$ OKxְ[rn%,+z&rGV&MIZh scLJ )!QhQUw4Jf pNOC;@c-L47z-8ЍZK }T+$P89dr\$;*E {Mv4Ztnӂ~ y(9Ih Z'M8}"TnnZ;0G R7ʫ&3F=+N`*p*y-'Av&_++>5 r82C~%}͏+J' h@<$XAUUwl&`3; @숐6+%7,2~N]åTkM,+ϵI L/v(:9W1RN/|-]q@J@r2z1 9$=iN/&B0l@;.Q`x2ܸd0=D=&P>&z#Az}q8i bl{K)esv{18$[ri % ^7)Dˁոf̓"Q 䚐`XTI`H?P!hYS@O퓏E3($ dsζn5Om)wCKG^ԥ0u Lb7$>D41;a;B>'Iޑ+ RR(7>}3|kX: ADQG m 1x^z+gٖ{t-۶-7BTCy<0BI?n!݄j%ȎYc02bk~,p! D[R='# p9FA=GkZCD  J"{9*3"ZR5jFH& j%"IQ?=",Ow[nDLT2rVjW{z 4z3MвӏG#mТҮ0{~ ;z񓉼9{P7bت計vT~णe^A3ljU/ۉN³Kot).w%ǻ \)PAb6GX9gD"@&eb ,TE97yuB!A aeriV 0 #?02a9i$;V=h8Gp X4Lx KFZϨU+G&'\ƱZHARY?7zkXTyL'֟ V{4) BS}c:o0xP~_R7x<H) xF>b8] e"ωTfavPau?BxrDX^ƜOGGǀZ#f)xళ J0msGd^y )V‰C;Z;]e7&ܡ`ޒEW ͒W@F呀!k - DY-P~b RbACǂhB#v%kN;T^JU%"OaIt F6@Jyi-kc#!ӻx<_Pg{/J e J>Nb81WeHF_5}\JdkYHA^R) '(SRdwۇ1"giGTAgEU` iՀ=F=L_xg8 s~ /ST0B¼h" S(4en ]!*mMA2Q)<`N@7lр8׎iB緙3qQފ#"Ì,6q,c;Lo,m* y?,ećr,@Z' "Zؙ!S!Q%UDCғkR0[yMmfLcAbkfl#Rd(y,k5b{pDLĥaAt^ZvP#<"|іpU tZZme)Tp%| =n(PR#kAIkcA2Q)<`NR$"84p9MD77qB4ieqp{g|td,W2`Q혴9 rNSeffo.VzF 2jk9 (0e6su-5,~LuբFk e o`o-JhrGyǐ:72Ck:ZQS;X1 'nuߺeq_E >{][ o$ (o8JoU2Hژ};pg4}`>!Y hJI"UC>-A% ϫĮ%9~j*TiIa7`ם#bJUaZ(TέDИж94'lYPI%+"k8Qv"3[ӔMjP[eIFK78aqZU PuQf-?Dbb__vQC_Bpx oQQ6)!dg"f|U!vQ#4clGڢEEs 1ޤeB%BH-(|@ȫ#H28IU=2XJ{y)%Poʧ gQ.5 PGt1[.q`Un#Y¿:ki`ڠ̨x&E쵤U UWQgQP,A)]t,q=':tӧN:tӧN:tӧN:tӧN:tӧN:tӧN:tӧN:tӧN:tӧN:tӧN:tӧN:tӧN:tӧN:tӧN:tӧN:tӧN:tӧ:tӧN:tӧN:tӧN:tӧN:tӧN:tӧN:tӧNjAL?Iwd ZtMN. MTlIoޤ3U L ;(&8S q M`Հݍ$_{n0K? ۶o<3#>KhXV 2fU-7ve#avӘawm%Pnj:XƵ'f0-8pZbƳ6* :D&cf.󛄡F&OƂa%knXqYAx (gF[.idhJ:x' :߶ur> Xn1V9+Ep3 &ܔtx`56P1:d>gǵvVH#2G KM'l*dѰ@$moNr|Z4@Q Ge_{Lq$)Qj/_u#J۔'kA$F Oz\ԬECñ*B| P1e}j0IŢބ) (ʬ&y',7ZFkOxs@o 43 ÁHlܮMiq3mIƃF9`ۏ <[aue )g P 0hIIx1QC0uUfmc{aS䇧Lf[#~-%vv!b?)?yш&l ?>|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|^|ϟ>|B0ۿ|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|q_U&ƪ>; 4jT_U¿u dpІ_'>J?AVA[?e &LrEhj7:OP{G?_^$i Z}x)˅)5ЄP 1X E  6 #0 O3JK.Ԧ&gDx1G9juՏ`9f $^PyZ}$b pjH>Q kW]͞/(磅pNAET>i"0aށCoI0sZQ&Xg[s? dFV>6< Qs.AhzmeX⡞bpG>OJ\K ~AplxKn\.?QlfYkT s-?[vUfmKUvK֖5 W@Zkf d-zg$ O(HMqEhYx.9><(fYUvK֖\Ȋ^)״T18y>耐_&pPG!N-W#}E)aӅk%wkUt]s/ Hba2z*(/+u@i]*5-&j .u;ȾE)i_Kt둇RoPȨ\}?—A--ʿVkh Gmn|#uT~Kopn9 BɢjB7 ҿF[m ٥BmqC" D6Zl" DddPrS16FM[l@e-Zל6(:.XU5F0Zm-KLIW? '})w3@*]c;(] BUͫǪtTQr鏴 VY9Nl\($P2n8!}k-cwJh޵Ie@:.rɴ#0׌ɲQg-оR]f\eFtLӢN0TƆP^ ~I2ᾎZB^ ZJGUҬh?-Mce#]5\u[q@/nNi:ަFᮙV£^Eq1Wc8o,c t;2VuTK%,ѷ!i(\]K%:*-(Օ$[nB݈vPTд5tl,FlrIoh$44UZ/>? %&l]80e|ҳ}u@VT,˫uR%+! U3:ڔTE ,}4~C/v<1K/Gu:Lhd9'=46݈jzjkt\D[zȳ%x=cU ,kYKtyM\'wViŀmx2nuD t8%Fj=v~7 kZ0eRC"s1V \^?l oÆLƑwի.Y&QCѬV^0iӪx5UCXҥ@MтeV."* $Eq-xMζ{dd`:QG<5U-|#\ Nn{֯}S06`ѻz 0w" KGϋTpDRN+5eZ);Z pw6 KŁߓ3<ͽxtmq`XdkPudYшd^Ic*hp`-kTir/1zHyTE/~37tPb+)<Ӎ<]R`ƋHi/03](Px0notr5vӚSiAuNa?uO_T-9N}"#OVT!NܩxGV8Sä74Yap˽ nE@vsM5jhP/1-P5Truɧ1W:#5NRUSExCm|<*YBIb:M,|]0mB]+_ 8'49L&Qy0Ӌ0𔉙)t)RY8飽@Uj92 ^GK@4 @f/\۵z!VZső]LeR[+W ɑ|-S6UApS TӺ9hZigPx^1BԅSK*e?*JdJU n,o'tQ"N0DTRȻ@ TIbl4^, &`Fȓ$D];iI0[@Ʒ S<CZYŏЕLԅ7Utprx4_ٚb6^E33p*$}?ԠZÒ+5jK[.6et+vm o6pR4Z"q{8*A0ka Xj'^Wp #QV4iK^8;0Rs m4iד(TeZu0a A/04C iԪsjB/9"m8FKi\!%hk(iaBж1"3`յoVՠKf@-Ed9)#KRiҗ3XqmN%uQTʴfE`Wj0+.L 7א4:Pc(jCqy* [\%/.`iIE-2xj#h ]qve6A|+40fފC"lQUbwvd> Dh@唹ѭ@-D.Yh˗1 CiI zq@!D : tF7Q[Jگ QғRݘ1=q@ȲXk5f,0hBիeO&0o<)bNp \ Vc)t2#D֜B6:_Z)Y\Y3 DQ:&I:Dט.(U[Uʫ]XQT1uO3HN'eUi, ZV2wAS7 ^ PѨ&4¤("Tib-0J7,itVUkuLW,U]6 6@a|v\L95MX Lk3픵OV"A\^PIACUwYwv AJ#PbݹZd֊W5+Ar˵pa.nkEM@Z ZFeB6k{'Zq8ԾZG¼ 7Fqa. uWP. TpL2PDPYnqGzqkʵ`RƲ[P(0,m^ $pn4/6 rCֳT_T6R2ʪ(xW012z.OQ塥C'.Gdz5+rc&н3 = l)x6㸯Lc2uV\64iuT=rZ9"V;д5kX.U5څqN2L/EpnZf9{K;Yl5I:/8N!:0a.r8Q`ЪhPdy\k+ ,i ] ja+Q0}W;/VXSژIK%$)CWި5JK2\tZֺ'2sHo.9GF oTMƀ qAD|]瘖37J3_Ch5S վI (h`=P381-u <˩9=\/o_l{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMrl{cܛ&ǹ6=ɱMr՟տ?~ɰMbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6Mbl;a؛v&ñ6LV`ggѸV,UC[sbNa Tk+sD ] Z#(Bl' @Hy(6`!Z *$/EAL* nhMB j^"42'bᖢS^tuk@)O,^Qpir>4.؇71ApԉxѡH.F}@ujQƅ-^xmDa^Vi "kUU`^?P[Q)\`}qMBĠ!?-wH\r^\®Z-cTƝ%i~Q5>ޢ&O;y@%0eғBQ[[ 6bKL yŨe" ITɈ̵ KTi.= p4 pIX_ 04!Qsb&e&J Ub0xJBiVG ֌L8JǦs@zMzy Gede"ncD j`ԳH @v G@NqF[פ/)DQQϥePbs'2PЍp@\mLcB zh}u2fQkA,XjzZ_H[Q LU% lɈ I "k5X\ 2f g,q,%Ј'Y5 " ~=g_A < I lӊ6o!&)KrEUR}W(Rc& AW)'Ub \@ 5bR9 kg5̔)8*Su DF=Cww8KL2>`5qpN-TƑ,K^}u"fD<)W Zn1FI3s5 a)jɉn0HYn3HH  8Ei \pHan qq)C3tHUlQ3:n)H[aC͘'HWI!Mc5hSYц؉%95̹MQ׈["h: Jk럥=m-zYiYlX%l[e٬Ziu[KOKerYkI[-FYL9SZ)yaM%U9Ky˽e1KeH[KbUuZKuyuYlk--fWXn*̺Io9nSH[\.lrYiZi-[]-z#f-ꁶ-~ ES?խj?Oa_ZߟSMs1Sjò+spkGX@N5j hC A4bSsB>) j8kԴ[Lhd-!8#aWQЯ}BiS@8ueO83oς~ u/AU$:q DT֑Ub4aPbɓnz6Ħ_!j.KƑ:e./7fZj Wſ? ^.6̪:͢PJpө4AƖL b %Abn qVF2Nc1ƹ+ 鬚e\@ѸWT!MF^xԺ2ըU*-fFOWRi9+2B, BI9K5zsJ^e/O@z헹J361 LV5=mF9BdE:9 1p ƞ2Q17q* ŷbߟP?~Cn- "pQo/f~*EA[%m?K[pl]Z'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3'<~3FYVKΏ?+UiVAA,S;,#AJArx)"z,JՋSΨ+FcV< ']&j* PP, qI4\]L*Kw8PFҴC=+կpNycnĘbo$ 6` `KĶ+-B`NLxaꕪE8G)Vհd=ڮ;F$Z4δvapKj_M Ph7:QW9`Z@\t]QBrGrw3|$[HMmpQSўc?QZ <V6l ^ sNׯ"䫪ՒYueFΧY+C-8)Z0qMd*h nt Xo$j@mkdڅ\FaCVP VM X0*ЩA`(GQI]n:T @t tZN(,0 "u)Xe#T+Lowe씌EÛ UB"@LѠhQB L0L"vdSCVN"¨tD*Y`. GYr} сD^j cPZ Ҍъ~aGX <8Dס2^w( Hg,E_rܭ{yCWu vo;t&\*mpȇ[.Li&_d r2.֭ hZEQhy1L8]M\#Vp -5 c_8y0 b9naR 5'޿QZ8IYIJƝW74z^  pBmFt 4XZ&sH9,/N큣GtlTDJL摪 S%}n@MKH݅hba' /f  @~2Vd OB1ņ8 mU3Ae(WmEsA1t:t&)YޡEi??? P /g{5Lz >`= iEs _A 5+J b1p!i)uzD E2WƐUy.}BU ֊↯RF|t ժpS^"`Ce٘ξJu G8?3y < /[2ѨĩDZj 8Zik9lz.O tEɦu)4.G̮L¼Ww12 ^Nss=ZC7ťҹ,G@`ipAku*\dPu#ʆ@].? AY(RQxqE% ahp(j8Vu{c+WgZĤv >v++p4хyWZ g~iDÇo+!1aqA QP0@p`?nW)Өwe*[ X"-w:G)b( 7$Y+~`u#hVokz ڛ_D7R|ATDFml>ʁ躲UmUS˯(Z _|xqgHU6]AM4&>S^VDYEJBOЈ|ᯈ_-zP%QH6ϒ +̪Rl ˑ<{qqaxI}щ!T:XYi { ȪjQU&mXU%g|ұkE|Rf`Ӌ*) B1 RDcb8 o?iz1de]Ā BRad"[W>Z bg7TϦ+ EZ@!nPԭ| f'IOTP)" *\dKlL1pd^av!Tݍ6ݎ\5\Kwr'9QЕRy- 4BHYdl85w@4OI!0.~2Pfz<; R !UfЅ{ ͢Oo#- Rx %);;/P9WZ ]?LH 1&e3EnKUŗm/S˼$Ԍ.èUW58@\$MB Xt]an z{z\K#-ȅTqԮG8IX(,') z1C2E]Q52~f$JҶ9 -.@(- [x~` EqdF@&y5DP *KklFHȵJj\/[.s$n5#lV¢#L( 4$&$CD* kȴAgyDj(i3Q,.~3| k~Zv [vg{IO- Ur!XzSShXh )#a#a@K 0N#!g *`&-"3xFlMȋ b W"ܳHj{~:DHMWť[V2Bd˃!P Jlb(V * TT6e6ߜBa-iM2Ӽ@"~Y] STW+QqUטEa ((+8%M> K Z ph BTL0X6-,i[-ĴXPlSG UCʀ-r0=}Q͂Zű͂B-{`}."}jvsPDFl=Ϊ*tG*}Ъ.ZF/Rۻ j* j[N)گ:׋u4MKu5w4Hs.cȦ* knZiQWpSR۹M2,w-02ڨV_$qM&+AM2,䊻mTrKj& b qxn.<%5AVpp].AKmWj*fw9")T5SS'\,UUܴ9 p\'\,rE]H iE]S$oԥsЯ B")*_JkkPY_=!j)R{xDR `} S)&9?CI6oIFV/݅ sX^lz4zuiX-sAS:󵞍nQS<ˆ GAĢ4P]q_sqL[L @2{ʋEI 33)v-+W-;w}_ gj#5T@-a^h8JfE`U>] ;@)$+(ה\T /[($k!Cp"FLYw(j}帙MD؏CRCp 7RY -!Gܡ,`ESꕱ47Zn؇¡"XЭBdb "JE8]דiV>7H4 -֟TLڗn)!Q hVoJڼx__K_KAY&7i~{4jb")UH -<(qaMEx- XOO-#4|,\IBhD!!mXa ?&  >ɬLEl`1Pi~B/  >n^40_ lh[RbቓhQueb,sAPi&7irl[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-el[-eB9C@WϓT p5RҰ;wm^oL) ARXH2ƙFAh4*r@r3*;I-NrDe`vaĉLqomOF+  &sфt+~tE[^w a~ 4DK7_oj6R|"{Nl߭銕LfXИNYn>J/+}83{iUִ-RgWtVd/S13PNos<x~~O>}4llWwBde#EB(@ñYYRL0Iq\Cuʚj +GM 2(' ww^! Q{ѡtȤ@" j[N˅XKb[A[ؚ(j+-8,GڲPakޟ?KOA4aOBq[*FM? `PL7iS(YQ{DXL*-5<=x1uQ@˪5.[ʚB~^<_>/>""+@R  ZdѹY|g ^AETl.N5$ogi0akSp̬TSD p_f thinc-release-v9.1.1/website/docs/images/wrapper_tensorflow.svg000066400000000000000000000324201467064331700247710ustar00rootroot00000000000000 thinc-release-v9.1.1/website/docs/index.md000066400000000000000000000105061467064331700204730ustar00rootroot00000000000000--- title: Introduction next: /docs/concept --- Thinc is a **lightweight deep learning library** that offers an elegant, type-checked, functional-programming API for **composing models**, with support for layers defined in other frameworks such as **PyTorch**, **TensorFlow** or **MXNet**. You can use Thinc as an interface layer, a standalone toolkit or a flexible way to develop new models. Previous versions of Thinc have been running quietly in production in thousands of companies, via both [spaCy](https://spacy.io) and [Prodigy](https://prodi.gy). We wrote the new version to let users **compose, configure and deploy custom models** built with their favorite framework. The end result is a library quite different in its design, that's easy to understand, plays well with others, and is a lot of fun to use. ---

[![](images/type_checking.jpg)](/docs/usage-type-checking)
##### Type-check your model definitions with custom types and [`mypy`](https://mypy.readthedocs.io/en/stable/) plugin ```python ### {small="true"} from thinc.api import PyTorchWrapper, TensorFlowWrapper pt_model = PyTorchWrapper(create_pytorch_model()) tf_model = TensorFlowWrapper(create_tensorflow_model()) # You can even stitch together strange hybrids # (not efficient, but possible) frankenmodel = chain(add(pt_model, tf_model), Linear(128), logistic()) ``` ##### Wrap PyTorch, TensorFlow & MXNet models for use in your network ```python ### {small="true"} def CaptionRater( text_encoder: Model[List[str], Floats2d], image_encoder: Model[List[Path], Floats2d] ) -> Model[Tuple[List[str], List[Path]], Floats2d]: return chain( concatenate( chain(get_item(0), text_encoder), chain(get_item(1), image_encoder) ), residual(Relu(nO=300, dropout=0.2, normalize=True)), Softmax(2) ) ``` ##### Concise functional-programming approach to model definition using composition rather than inheritance ```python ### {small="true"} apply_on = lambda layer, i: chain(getitem(i), layer) with Model.define_operators({"^": apply_on, ">>": chain, "|": concatenate}): model = ( (text_encoder ^ 0 | image_encoder ^ 1) >> residual(Relu(nO=300, dropout=0.2, normalize=True) >> Softmax(2) ) ``` ##### Optional custom infix notation via operator overloading ```ini ### {small="true"} [optimizer] @optimizers = "Adam.v1" [optimizer.learn_rate] @schedules = "slanted_triangular.v1" max_rate = 0.1 num_steps = 5000 ``` ##### Integrated config system to describe trees of objects and hyperparameters ```python ### {small="true"} from thinc.api import NumpyOps, set_current_ops def CustomOps(NumpyOps): def some_custom_op_my_layers_needs(...): ... set_current_ops(CustomOps()) ``` ##### Choice of extensible backends ```python ### {small="true"} encode_sentence = chain( list2ragged(), # concatenate sequences with_array( # ignore outer sequence structure (temporarily) concatenate(Embed(128, column=0), Embed(128, column=1)), Mish(128, dropout=0.2, normalize=True) ), ParametricAttention(128), reduce_mean() ) ``` ##### First-class support for variable-length sequences multiple built-in sequence representations and your layers can use any object ```python ### {small="true"} for i in range(10): for X, Y in train_batches: Yh, backprop = model.begin_update(X) loss, dYh = get_loss(Yh, Y) backprop(dYh) model.finish_update(optimizer) ``` ##### Low abstraction training loop --- - intro - transformers_tagger - parallel_training_ray thinc-release-v9.1.1/website/docs/install.md000066400000000000000000000076401467064331700210370ustar00rootroot00000000000000--- title: Installation & Setup next: /docs/usage-config --- Thinc is compatible with **64-bit CPython 3.6+** and runs on **Unix/Linux**, **macOS/OS X** and **Windows**. The latest releases are available from [pip](https://pypi.python.org/pypi/thinc) and [conda](https://anaconda.org/conda-forge/thinc). ```bash ### pip $ pip install thinc ``` ```bash ### conda $ conda install -c conda-forge thinc ``` If you have installed PyTorch and you are using Python 3.7+, uninstall the package `dataclasses` with `pip uninstall dataclasses`, since it may have been installed by PyTorch and is incompatible with Python 3.7+. If you know your CUDA version, using the more explicit specifier allows `cupy` to be installed from a wheel, saving some compilation time. Once you have a GPU-enabled installation, the best way to activate it is to call [`prefer_gpu`](/docs/api-util#prefer_gpu) (will use GPU if available) or [`require_gpu`](/docs/api-util#require_gpu) (will raise an error if no GPU is available). ```python from thinc.api import prefer_gpu is_gpu = prefer_gpu() ``` ### Using build constraints when compiling from source If you install Thinc from source or with `pip` for platforms where there are not binary wheels on PyPI, you may need to use build constraints if any package in your environment requires an older version of `numpy`. If `numpy` gets downgraded from the most recent release at any point after you've compiled `thinc`, you might see an error that looks like this: ```none numpy.ndarray size changed, may indicate binary incompatibility. ``` To fix this, create a new virtual environment and install `thinc` and all of its dependencies using build constraints. [Build constraints](https://pip.pypa.io/en/stable/user_guide/#constraints-files) specify an older version of `numpy` that is only used while compiling `thinc`, and then your runtime environment can use any newer version of `numpy` and still be compatible. In addition, use `--no-cache-dir` to ignore any previously cached wheels so that all relevant packages are recompiled from scratch: ```shell PIP_CONSTRAINT=https://raw.githubusercontent.com/explosion/thinc/master/build-constraints.txt \ pip install thinc --no-cache-dir ``` Our build constraints currently specify the oldest supported `numpy` available on PyPI for `x86_64` and `aarch64`. Depending on your platform and environment, you may want to customize the specific versions of `numpy`. For other platforms, you can have a look at SciPy's [`oldest-supported-numpy`](https://github.com/scipy/oldest-supported-numpy/blob/main/setup.cfg) package to see what the oldest recommended versions of `numpy` are. (_Warning_: don't use `pip install -c constraints.txt` instead of `PIP_CONSTRAINT`, since this isn't applied to the isolated build environments.) --- ## Set up static type checking {#type-checking} Thinc makes extensive use of [type hints](https://docs.python.org/3/library/typing.html) and includes various [custom types](/docs/api-types) for input and output types, like arrays of different shapes. This lets you type check your code and model definitions, and will show you errors if your inputs and outputs don't match, greatly reducing time spent debugging. To use type checking, you can install [`mypy`](https://mypy.readthedocs.io/en/stable/) alongside Thinc. If you're using an editor like Visual Studio Code, you can also [enable `mypy` linting](https://code.visualstudio.com/docs/python/linting) to get real-time feedback as you write code. For more details, check out the docs on [using type checking](/docs/usage-type-checking). ```bash ### pip {small="true"} $ pip install mypy ``` ```ini ### mypy.ini {small="true"} [mypy] plugins = thinc.mypy ``` ![Screenshot of mypy linting in Visual Studio Code](images/type_checking2.jpg) thinc-release-v9.1.1/website/docs/usage-config.md000066400000000000000000000577741467064331700217550ustar00rootroot00000000000000--- title: Configuration System next: /docs/usage-models --- Configuration is a huge problem for machine-learning code because you may want to expose almost any detail of any function as a hyperparameter. The setting you want to expose might be arbitrarily far down in your call stack, so the setting might need to pass all the way through the CLI or REST API, through any number of intermediate functions, affecting the interface of everything along the way. And then once those settings are added, they become hard to remove later. Default values also become hard to change without breaking backwards compatibility. To solve this problem, Thinc leverages [confection](https://github.com/explosion/confection) - a config system that lets you easily describe **arbitrary trees of objects**. The objects can be created via **function calls you register** using a simple decorator syntax. You can even version the functions you create, allowing you to make improvements without breaking backwards compatibility. The most similar config system we're aware of is [Gin](https://github.com/google/gin-config), which uses a similar syntax, and also allows you to link the configuration system to functions in your code using a decorator. Thinc's config system is simpler and emphasizes a different workflow via a subset of Gin's functionality. ```ini ### Config {small="true"} [training] patience = 10 dropout = 0.2 use_vectors = false [training.logging] level = "INFO" [nlp] # This uses the value of training.use_vectors use_vectors = ${training.use_vectors} lang = "en" ``` ```json ### Parsed {small="true"} { "training": { "patience": 10, "dropout": 0.2, "use_vectors": false, "logging": { "level": "INFO" } }, "nlp": { "use_vectors": false, "lang": "en" } } ``` The config is divided into sections, with the section name in square brackets – for example, `[training]`. Within the sections, config values can be assigned to keys using `=`. Values can also be referenced from other sections using the dot notation and placeholders indicated by the dollar sign and curly braces. For example, `${training.use_vectors}` will receive the value of `use_vectors` in the `training` block. This is useful for settings that are shared across components. The config format has three main differences from Python's built-in [`configparser`](https://docs.python.org/3/library/configparser.html): 1. **JSON-formatted values.** Thinc passes all values through `json.loads` to interpret them. You can use atomic values like strings, floats, integers or booleans, or you can use complex objects such as lists or maps. 2. **Structured sections.** Thinc uses a dot notation to build nested sections. If you have a section named `[section.subsection]`, Thinc will parse that into a nested structure, placing `subsection` within `section`. 3. **References to registry functions.** If a key starts with `@`, Thinc will interpret its value as the name of a function registry, load the function registered for that name and pass in the rest of the block as arguments. If type hints are available on the function, the argument values (and return value of the function) will be validated against them. This lets you express complex configurations, like a training pipeline where `batch_size` is populated by a function that yields floats (see [schedules](/docs/api-schedules)). Also see the section on [registry integration](#registry) for more details. There's **no pre-defined scheme** you have to follow and how you set up the top-level sections is up to you. At the end of it, you'll receive a dictionary with the values that you can use in your script – whether it's complete initialized functions, or just basic settings. For examples that show Thinc's config system in action, check out the following tutorials: - intro - basic_cnn_tagger --- ## Registry integration {#registry} Thinc's [registry system](/docs/api-config#registry) lets you **map string keys to functions**. For instance, let's say you want to define a new optimizer. You would define a function that constructs it and add it to the right register, like so: ```python ### Registering a function from typing import Union, Iterable import thinc @thinc.registry.optimizers.register("my_cool_optimizer.v1") def make_my_optimizer(learn_rate: Union[float, Iterable[float]], gamma: float): return MyCoolOptimizer(learn_rate, gamma) # Later you can retrieve your function by name: create_optimizer = thinc.registry.optimizers.get("my_cool_optimizer.v1") ``` The registry lets you refer to your function by string name, which is often more convenient than passing around the function itself. This is especially useful for configuration files: you can **provide the name of your function** and the **arguments** in the config file, and you'll have everything you need to rebuild the object. Since this is a common workflow, the registry system provides a shortcut for it, the [`registry.resolve`](/docs/api-config#registry-resolve) function. If a section contains a key beginning with `@`, it will be interpreted as the name of a function registry – e.g. `@optimizers` refers to a function registered in the `optimizers` registry. The value will be interpreted as the name to look up and the rest of the block will be passed into the function as arguments. Here's a simple example: ```ini ### config.cfg {small="true"} [optimizer] @optimizers = "my_cool_optimizer.v1" learn_rate = 0.001 gamma = 1e-8 ``` ```python ### Usage {small="true"} from thinc.api import Config, registry config = Config().from_disk("./config.cfg") resolved = registry.resolve(config) optimizer = resolved["optimizer"] ``` Under the hood, Thinc will look up the `"my_cool_optimizer.v1"` function in the `"optimizers"` registry and then call it with the arguments `learn_rate` and `gamma`. If the function has **type annotations**, it will also validate the input. For instance, if `learn_rate` is annotated as a `float` and the config defines a string, Thinc will raise an error. ```python ### Under the hood optimizer_func = thinc.registry.get("optimizers", "my_cool_optimizer.v1") optimizer = optimizer_func(learn_rate=0.001, gamma=1e-8) ``` **Note on type annotations:** If type annotations only define basic types like `str`, `int` or `bool`, the validation will accept all values that can be cast to this type. For instance, `0` is considered valid for `bool`, since `bool(0)` is valid, and the value passed to your function will be `False`. If you need stricter validation, you can use [`pydantic`'s strict types](https://pydantic-docs.helpmanual.io/usage/types/#strict-types) For details and examples, see the [section on advanced type annotations](#advanced-types) using [`pydantic`](https://github.com/samuelcolvin/pydantic). ### Recursive blocks {#registry-recursive} The function registry integration becomes even more powerful when used to build **recursive structures**. Let's say you want to use a learning rate schedule and pass in a schedule as the `learn_rate` argument. Here's an example of a function that yields an infinite series of decaying values, following the schedule `base_rate * 1 / (1 + decay * t)`. It's also available in Thinc as [`schedules.decaying`](/docs/api-schedules#decaying). The decorator registers the function `"my_cool_decaying_schedule.v1"` in the registry `schedules`: ```python import thinc from thinc.schedules import Schedule @thinc.registry.schedules("my_cool_decaying_schedule.v1") def decaying(base_rate: float, decay: float, *, t: int = 0) -> Schedule[float]: return Schedule( "decaying", _decaying_schedule, attrs={"base_rate": base_rate, "decay": decay, "t": t} ) def _decaying_schedule(schedule: Schedule, step: int, **kwargs) -> float: base_rate = schedule.attrs["base_rate"] decay = schedule.attrs["decay"] t = schedule.attrs["t"] return base_rate * (1.0 / (1.0 + decay * (step + t))) ``` In your config, you can now define the `learn_rate` as a subsection of `optimizer`, and specify its registry function and arguments: ```ini ### config.cfg [optimizer] @optimizers = "my_cool_optimizer.v1" gamma = 1e-8 [optimizer.learn_rate] @schedules = "my_cool_decaying_schedule.v1" base_rate = 0.001 decay = 1e-4 ``` When Thinc resolves the config, it will first look up `"my_cool_decaying_schedule.v1"` and call it with its arguments. Both arguments will be validated against the type annotations (float). The return value will then be passed to the optimizer function as the `learn_rate` argument. If type annotations are available for the return value and it's a type that can be evaluated, the return value of the function will be validated as well. ```python ### Under the hood learn_rate_func = thinc.registry.get("schedules", "my_cool_decaying_schedule.v1") learn_rate = learn_rate_func(base_rate=0.001, decay=1e-4) optimizer_func = thinc.registry.get("optimizers", "my_cool_optimizer.v1") optimizer = optimizer_func(learn_rate=learn_rate, gamma=1e-8) ``` After resolving the config and filling in the values, `registry.resolve` will return a tuple of the resolved config and the filled config with default values added. The resolved config will be a dict with one key, `"optimizer"`, mapped to an instance of the custom optimizer function initialized with the arguments defined in the config. ```python ### Usage {small="true"} from thinc.api import Config, registry config = Config().from_disk("./config.cfg") resolved = registry.resolve(config) ``` ```python ### Result {small="true"} { "optimizer": } ``` ### Defining variable positional arguments {#registries-args} If you're setting function arguments in a config block, Thinc will expect the function to have an argument of that same name. For instance, `base_rate = 0.001` means that the function will be called with `base_rate=0.001`. This works fine, since Python allows function arguments to be supplied as positional arguments _or_ as keyword arguments. If possible, named arguments are recommended, since it makes your code and config more explicit. However, in some situations, your registered function may accept variable positional arguments. In your config, you can then use `*` to define a list of values: ```python ### {small="true"} import thinc from thinc.schedules import Schedule @thinc.registry.schedules("my_cool_schedule.v1") def step_values(*steps: float, final: float = 1.0) -> Schedule[float]: step_list = list(steps) return Schedule( "step_values", _step_values_schedule, attrs={"steps": list(steps), "final": final} ) def _step_values_schedule(schedule: Schedule, step: int, **kwargs) -> float: steps = schedule.attrs["steps"] final = schedule.attrs["final"] return steps[step] if step < len(steps) else final ``` ```ini ### config.cfg {small="true"} [schedule] @schedules = "my_cool_schedule.v1" * = [0.05, 0.1, 0.25, 0.75, 0.9] final = 1.0 ``` **About type hints for variable arguments**: Type hints for variable arguments should always describe the [type of the individual arguments](https://www.python.org/dev/peps/pep-0484/#arbitrary-argument-lists-and-default-argument-values). If your arguments are floats, you'd annotate them as `*args: float` (even though `args` is technically a tuple of floats). This is also how Thinc will validate the config: if variable arguments are annotated as `float`, each item in `*` will be validated against `float`. You can also use the `*` placeholder in nested configs to populate positional arguments from function registries. This is useful for combinators like [`chain`](/docs/api-layers#combinators) that take a variable number of layers as arguments. The following config will create two [`Relu`](/docs/api-layers#relu) layers, pass them to [`chain`](/docs/api-layers#combinators) and return a combined model: ```ini ### Config {small="true"} [model] @layers = "chain.v1" [model.*.relu1] @layers = "Relu.v1" nO = 512 dropout = 0.2 [model.*.relu2] @layers = "Relu.v0" nO = 256 dropout = 0.1 ``` ```python ### Equivalent to {small="true"} from thinc.api import chain, Relu model = chain( Relu(nO=512, dropout=0.2), Relu(nO=256, dropout=0.1) ) ``` ### Using interpolation {#config-interpolation} For hyperparameters and other settings that need to be used in different places across your config, you can define a separate block once and then reference the values using the [extended interpolation](https://docs.python.org/3/library/configparser.html#configparser.ExtendedInterpolation). For example, `${hyper_params.dropout}` will insert the value of `dropout` from the section `hyper_params`. ```ini ### config.cfg {small="true"} [hyper_params] hidden_width = 512 dropout = 0.2 [model] @layers = "Relu.v1" nO = ${hyper_params.hidden_width} dropout = ${hyper_params.dropout} ``` ```json ### Parsed {small="true"} { "hyper_params": { "hidden_width": 512, "dropout": 0.2 }, "model": { "@layers": "Relu.v1", "nO": 512, "dropout": 0.2 } } ``` Interpolation happens **when the config is parsed**, i.e. when you create a [`Config`](/docs/api-config#config) object from a file, string, etc. and **before registered functions are resolved**. This means that you can only use it for hard-coded values like numbers and strings, not to define placeholders for resolved values. For instance, the `[model]` section in this example will be resolved to an instance of `Relu` – but you wouldn't be able to use `${model}` as the argument to another function defined in the config. To achieve this, you can either define another nested block or [variable positional arguments](#registries-args). ### Using custom registries {#registries-custom} Thinc's `registry` includes [several pre-defined registries](/docs/api-config#registry) that are also used for its built-in functions. You can also use the [`registry.create`](/docs/api-config#registry-create) method to add your own registries that you can then reference in config files. The following will create a registry `visualizers` and let you use the `@thinc.registry.visualizers` decorator, as well as the `@visualizers` key in config files. ```python ### Example import thinc thinc.registry.create("visualizers") @thinc.registry.visualizers("my_cool_visualizer.v1") def my_cool_visualizer(file_format: str = "jpg"): return MyCoolVisualizer(file_format) ``` ```ini ### config.cfg {small="true"} [visualizer] @visualizers = "my_cool_visualizer.v1" file_format = "svg" ``` ```python ### Result {small="true"} { "visualizer": } ``` --- ## Advanced type annotations with Pydantic {#advanced-types} If you're new to type hints and Python types, check out this great introduction from the [FastAPI docs](https://fastapi.tiangolo.com/python-types/). [`pydantic`](https://github.com/samuelcolvin/pydantic) is a modern Python library for **data parsing and validation** using type hints. It's used by Thinc to validate configuration files, and you can also use it in your model and component definition to enforce stricter and more fine-grained validation. If type annotations only define basic types like `str`, `int` or `bool`, the validation will accept all values that can be cast to this type. For instance, `0` is considered valid for `bool`, since `bool(0)` is valid. If you need stricter validation, you can use [strict types](https://pydantic-docs.helpmanual.io/usage/types/#strict-types) instead. This example defines an optimizer that only accepts a float, a positive integer and a constrained string matching the given regular expression: ```python ### Example {highlight="2,6-8"} import thinc from pydantic import StrictFloat, PositiveInt, constr @thinc.registry.optimizers("my_cool_optimizer.v1") def my_cool_optimizer( learn_rate: StrictFloat, steps: PositiveInt = 10, log_level: constr(regex="(DEBUG|INFO|WARNING|ERROR)") = "ERROR" ): return MyCoolOptimizer(learn_rate, steps, log_level) ``` If your config defines a value that's not compatible with the type annotations – for instance, a negative integer for `steps` – Thinc will raise an error: ```ini ### config.cfg {small="true"} [optimizer] @optimizers = "my_cool_optimizer.v1" learn_rate = 0.001 steps = -1 log_level = "DEBUG" ``` ``` ### Errors {small="true" wrap="true"} Config validation error steps ensure this value is greater than 0 {'@optimizers': 'my_cool_optimizer.v1', 'learn_rate': 0.001, 'steps': -1, 'log_level': 'DEBUG'} ``` For an overview of the available custom types, see the [`pydantic` documentation](https://pydantic-docs.helpmanual.io/usage/types/). Argument annotations can also define [`pydantic` models](https://pydantic-docs.helpmanual.io/usage/models/). This is useful if your function takes dictionaries as arguments. The data is then passed to the model and is parsed and validated. `pydantic` models are classes that inherit from the `pydantic.BaseModel` class and define fields with type hints and optional defaults as attributes: ```python ### Example {highlight="3-6,12"} from pydantic import BaseModel, StrictStr, constr, StrictBool class LoggingConfig(BaseModel): name: StrictStr level: constr(regex="(DEBUG|INFO|WARNING|ERROR)") = "INFO" use_colors: StrictBool = True @thinc.registry.optimizers("my_cool_optimizer.v1") def my_cool_optimizer( learn_rate: StrictFloat, steps: PositiveInt = 10, logging_config: LoggingConfig ): return MyCoolOptimizer(learn_rate, steps, logging_config) ``` In the config file, `logging_config` can now become its own section, `[optimizer.logging_config]`. Its values will be validated against the `LoggingConfig` schema: ```ini ### config.cfg [optimizer] @optimizers = "my_cool_optimizer.v1" learn_rate = 0.001 steps = 100 [optimizer.logging_config] name = "my_logger" level = "DEBUG" use_colors = false ``` For even more flexible validation of values and relationships between them, you can define [validators](https://pydantic-docs.helpmanual.io/usage/validators/) that apply to one or more attributes and return the parsed attribute. In this example, the validator checks that the value of `name` doesn't contain spaces and returns its lowercase form: ```python ### Example {highlight="8-12"} from pydantic import BaseModel, StrictStr, constr, StrictBool, validator class LoggingConfig(BaseModel): name: StrictStr level: constr(regex="(DEBUG|INFO|WARNING|ERROR)") = "INFO" use_colors: StrictBool = True @validator("name") def validate_name(cls, v): if " " in v: raise ValueError("name can't contain spaces") return v.lower() ``` ### Using a base schema {#advanced-types-base-schema} If a config file specifies registered functions, their argument values will be validated against the type annotations of the function. For all other values, you can pass a `schema` to [`registry.resolve`](/docs/api-config#registry-resolve), a [`pydantic` model](https://pydantic-docs.helpmanual.io/usage/models/) used to parse and validate the data. Models can also be nested to describe nested objects. ```python ### Schema from pydantic import BaseModel, StrictInt, StrictFloat, StrictBool, StrictStr from typing import List class TrainingSchema(BaseModel): patience: StrictInt dropout: StrictFloat use_vectors: StrictBool = False class NlpSchema(BaseModel): lang: StrictStr pipeline: List[StrictStr] class ConfigBaseSchema(BaseModel): training: TrainingSchema nlp: NlpSchema class Config: extra = "forbid" ``` Setting `extra = "forbid"` in the [`Config`](https://pydantic-docs.helpmanual.io/usage/model_config/) means that validation will fail if the object contains additional properties – for instance, another top-level section that's not `training`. The default value, `"ignore"`, means that additional properties will be ignored and filtered out. Setting `extra = "allow"` means any extra values will be passed through without validation. ```ini ### config.cfg {small="true"} [training] patience = 10 dropout = 0.2 use_vectors = false [nlp] lang = "en" pipeline = ["tagger", "parser"] ``` ```python ### Usage {small="true" highlight="6"} from thinc.api import registry, Config config = Config().from_disk("./config.cfg") resolved = registry.resolve( config, schema=ConfigBaseSchema ) ``` ### Filling a config with defaults {#advanced-types-fill-defaults} The main motivation for Thinc's configuration system was to eliminate hidden defaults and ensure that config settings are passed around consistently. This also means that config files should always define **all available settings**. The [`registry.fill`](/docs/api-config#registry-fill) method also resolves the config, but it leaves references to registered functions intact and doesn't replace them with their return values. If type annotations and/or a base schema are available, they will be used to parse the config and fill in any missing values and defaults to create an up-to-date "master config". Let's say you've updated your schema and scripts to use two additional optional settings. These settings should also be reflected in your config files so they accurately represent the available settings (and don't assume any hidden defaults). ```python ### {highlight="7-8"} from pydantic import BaseModel, StrictInt, StrictFloat, StrictBool class TrainingSchema(BaseModel): patience: StrictInt dropout: StrictFloat use_vectors: StrictBool = False use_tok2vec: StrictBool = False max_epochs: StrictInt = 100 ``` Calling [`registry.fill`](/docs/api-config#registry-fill) with your existing config will produce an updated version of it including the new settings and their defaults: ```ini ### Before {small="true"} [training] patience = 10 dropout = 0.2 use_vectors = false ``` ```ini ### After {small="true" highlight="5-6"} [training] patience = 10 dropout = 0.2 use_vectors = false use_tok2vec = false max_epochs = 100 ``` The same also works for config blocks that reference registry functions. If your **function arguments change**, you can run `registry.fill` to get your config up to date with the new defaults. For instance, let's say the optimizer now allows a new setting, `gamma`, that defaults to `1e-8`: ```python ### Example {highlight="8"} import thinc from pydantic import StrictFloat, PositiveInt, constr @thinc.registry.optimizers("my_cool_optimizer.v2") def my_cool_optimizer_v2( learn_rate: StrictFloat, steps: PositiveInt = 10, gamma: StrictFloat = 1e-8, log_level: constr(regex="(DEBUG|INFO|WARNING|ERROR)") = "ERROR" ): return MyCoolOptimizer(learn_rate, steps, gamma, log_level) ``` The config file should now also reflect this new setting and the default value that's being passed in – otherwise, you'll lose that piece of information. Running `registry.fill` solves this and returns a new `Config` with the complete set of available settings: ```ini ### Before {small="true"} [optimizer] @optimizers = "my_cool_optimizer.v2" learn_rate = 0.001 steps = 100 log_level = "INFO" ``` ```ini ### After {small="true" highlight="5"} [optimizer] @optimizers = "my_cool_optimizer.v2" learn_rate = 0.001 steps = 100 gamma = 1e-8 log_level = "INFO" ``` Note that if you're only filling and not resolving a config, Thinc will **not** load or call any registered functions, and it won't be able to validate the return values of registered functions against any types defined in the base schema. If you need to check that all functions exist and their return values match, use [`registry.resolve`](/docs/api-config#registry-resolve) instead. thinc-release-v9.1.1/website/docs/usage-frameworks.md000066400000000000000000000327631467064331700226570ustar00rootroot00000000000000--- title: PyTorch, TensorFlow & MXNet teaser: Interoperability with machine learning frameworks next: /docs/usage-sequences --- Wrapping models from other frameworks is a core use case for Thinc: we want to make it easy for people to write [spaCy](https://spacy.io) components using their preferred machine learning solution. We expect a lot of code-bases will have similar requirements. As well as **wrapping whole models**, Thinc lets you call into an external framework for just **part of your model**: you can have a model where you use PyTorch just for the transformer layers, using "native" Thinc layers to do fiddly input and output transformations and add on task-specific "heads", as efficiency is less of a consideration for those parts of the network. ## How it works {#how-it-works} Thinc uses a special class, [`Shim`](/docs/api-model#shim), to hold references to external objects. This allows each wrapper space to define a custom type, with whatever attributes and methods are helpful, to assist in managing the communication between Thinc and the external library. The [`Model`](/docs/api-model#model) class holds `shim` instances in a separate list, and communicates with the shims about updates, serialization, changes of device, etc. ![](images/wrapper_pytorch.svg) ![](images/wrapper_tensorflow.svg) The wrapper will receive each batch of inputs, convert them into a suitable form for the underlying model instance, and pass them over to the shim, which will **manage the actual communication** with the model. The output is then passed back into the wrapper, and converted for use in the rest of the network. The equivalent procedure happens during backpropagation. Array conversion is handled via the [DLPack](https://github.com/dmlc/dlpack) standard wherever possible, so that data can be passed between the frameworks **without copying the data back** to the host device unnecessarily. | Framework | Wrapper layer | Shim | DLPack | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ------------------ | | **PyTorch** | [`PyTorchWrapper`](/docs/api-layers#pytorchwrapper) ([code](https://github.com/explosion/thinc/blob/master/thinc/layers/pytorchwrapper.py)) | [`PyTorchShim`](/docs/api-model#shims) ([code](https://github.com/explosion/thinc/blob/master/thinc/shims/pytorch.py)) | | | **TorchScript** | [`TorchScriptWrapper`](/docs/api-layers#torchscriptwrapper) ([code](https://github.com/explosion/thinc/blob/master/thinc/layers/torchscriptwrapper.py)) | [`TorchScriptShim`](/docs/api-model#shims) ([code](https://github.com/explosion/thinc/blob/master/thinc/shims/torchscript.py)) | | | **TensorFlow** | [`TensorFlowWrapper`](/docs/api-layers#tensorflowwrapper) ([code](https://github.com/explosion/thinc/blob/master/thinc/layers/tensorflowwrapper.py)) | [`TensorFlowShim`](/docs/api-model#shims) ([code](https://github.com/explosion/thinc/blob/master/thinc/shims/tensorflow.py)) | | | **MXNet** | [`MXNetWrapper`](/docs/api-layers#mxnetwrapper) ([code](https://github.com/explosion/thinc/blob/master/thinc/layers/mxnetwrapper.py)) | [`MXNetShim`](/docs/api-model#shims) ([code](https://github.com/explosion/thinc/blob/master/thinc/shims/mxnet.py)) | | To see wrapped models in action, check out the following examples: - intro - transformers_tagger --- ## Integrating models {#integrating-models} The [`PyTorchWrapper`](/docs/api-layers#pytorchwrapper) and [`TensorFlowWrapper`](/docs/api-layers#tensorflowwrapper) layers allow you to easily use your predefined models in Thinc, as part or all of your network. For simple models that accept one array as input and return one array as output, all you need to do is create the PyTorch/TensorFlow layer and pass it into the wrapper. The wrapper model will behave like any other Thinc layer. ```python ### PyTorch Example {highlight="5"} from thinc.api import PyTorchWrapper, chain, Linear import torch.nn model = chain( PyTorchWrapper(torch.nn.Linear(16, 8)), # 🚨 PyTorch goes (nI, nO)! Linear(4, 8) ) X = model.ops.alloc2f(1, 16) # make a dummy batch model.initialize(X=X) Y, backprop = model(X, is_train=True) dX = backprop(Y) ``` In Thinc v8.2+, TensorFlow support is not enabled by default. To enable TensorFlow: ```python from thinc.api import enable_tensorflow enable_tensorflow() ``` ```python ### TensorFlow Example {highlight="6"} from thinc.api import TensorFlowWrapper, chain, Linear from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense model = chain( TensorFlowWrapper(Sequential([Dense(8, input_shape=(16,))])), Linear(4, 8) ) X = model.ops.alloc2f(1, 16) # make a dummy batch model.initialize(X=X) Y, backprop = model(X, is_train=True) dX = backprop(Y) ``` **In theory**, you can also chain together layers and models written in PyTorch _and_ TensorFlow. However, this is likely a bad idea for actual production use, especially since TensorFlow tends to hog the GPU. It could come in handy during development, though, for instance if you need to port your models from one framework to another. ```python ### Frankenmodel {highlight="7-8"} from thinc.api import PyTorchWrapper, TensorFlowWrapper, chain, Linear from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense import torch.nn model = chain( # 🚨 probably don't do this in production PyTorchWrapper(torch.nn.Linear(16, 8)), TensorFlowWrapper(Sequential([Dense(4, input_shape=(8,))])), Linear(2, 4) ) model.initialize(X=model.ops.alloc2f(1, 16)) ``` For more complex cases, you can control the way data is passed into the wrapper using the `convert_inputs` and `convert_outputs` callbacks. Both callbacks have input signatures like normal `forward` functions and return a tuple with their output and a callback to handle the backward pass. However, the converters will send and receive different data during the backward pass. | ‎ | Forward | Backward | | ---------- | --------------------------------------------- | --------------------------------------------- | | **Input** | Thinc Framework | Framework Thinc | | **Output** | Framework Thinc | Thinc Framework | To convert arrays, you can use the `xp2` and `2xp` utility functions which translate to and from `numpy` and `cupy` arrays. | Framework | To numpy / cupy | From numpy / cupy | | -------------- | ----------------------------------------------- | ----------------------------------------------- | | **PyTorch** | [`xp2torch`](/docs/api-util#xp2torch) | [`torch2xp`](/docs/api-util#torch2xp) | | **TensorFlow** | [`xp2tensorflow`](/docs/api-util#xp2tensorflow) | [`tensorflow2xp`](/docs/api-util#tensorflow2xp) | | **MXNet** | [`xp2mxnet`](/docs/api-util#xp2mxnet) | [`mxnet2xp`](/docs/api-util#mxnet2xp) | ### convert_inputs {#convert_inputs tag="function"} The [`ArgsKwargs`](/docs/api-types#argskwargs) object is a little dataclass that represents the tuple `(args, kwargs)`. Whatever you put in the `ArgsKwargs` you return from your `convert_inputs` function will be passed directly into PyTorch/TensorFlow/etc. In the backward pass, the shim will return a callback with the gradients from PyTorch, in matching positions on another `ArgsKwargs` object, and you'll then return an object that matches the original input, to pass the gradient back down the Thinc model. | Argument | Type | Description | | ----------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- | | `model` | Model | The wrapper layer. | | `inputs` | Any | The input to the layer. | | `is_train` | bool | A flag indicating training context. | | **RETURNS** | Tuple[ArgsKwargs, Callable[[ArgsKwargs], Any] | Inputs to the `PyTorchShim`, and a callback that receives the input gradients from PyTorch and returns the converted gradients. | ### convert_outputs {#convert_outputs tag="function"} For the output, the converter will receive a tuple that contains the original input (i.e. whatever was passed into `convert_inputs`, and the output from the PyTorch/TensorFlow/etc. layer. The input is provided because the output may not contain all the information you need to manage the conversion. The `convert_output` function should return the output object for the rest of the network, converting via the `2xp` helpers as necessary, along with the un-convert callback. The un-convert callback will receive a gradient object from the Thinc layer above it in the network, and will return an `ArgsKwargs` object that will be passed into [`torch.autograd.backward`](https://pytorch.org/docs/stable/autograd.html#torch.autograd.backward) and the TensorFlow model and [`tensorflow.GradientTape.watch`](https://www.tensorflow.org/api_docs/python/tf/GradientTape#watch) respectively. | Argument | Type | Description | | --------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | convert_outputs | Model | The wrapper layer. | | `outputs` | Tuple[Any, Any] | A tuple of the original inputs and the PyTorch model's outputs. | | **RETURNS** | Tuple[Any, Callable[[Any], ArgsKwargs]] | A tuple of the PyTorch outputs, and a callback to un-convert the gradient for PyTorch that takes the output gradients from Thinc and returns the output gradients for PyTorch. | The converter functions are designed to allow the `PyTorchWrapper` and `TensorFlowWrapper` to **handle the vast majority of cases** you might face, but if you do face a situation they don't cover, you can always just write a distinct wrapper layer to handle your custom logic. ### More specific PyTorch layers {#pytorch-layers} Thinc also includes some more specific PyTorch layers for common use-cases. The [`PyTorchLSTM`](/docs/api-layers#lstm) layer creates and wraps the [`torch.nn.LSTM`](https://pytorch.org/docs/stable/nn.html#torch.nn.LSTM) class, making creation particularly easy. The [`PyTorchRNNWrapper`](/docs/api-layers#pytorchwrapper) provides a little more flexibility, allowing you to pass in a custom sequence model that has the same inputs and output behavior as a [`torch.nn.RNN`](https://pytorch.org/docs/stable/nn.html#torch.nn.RNN) object. ### Avoiding memory contention (experimental) {#memory-contention} If you use the `PyTorchWrapper` for part of your network while using Thinc's layers for other parts, you may find yourself running out of GPU memory unexpectedly. This can occur because both PyTorch and `cupy` reserve their own **internal memory pools**, and the two libraries do not communicate with each other. When PyTorch needs more memory, it can only ask the device – so you may get an out-of-memory error even though `cupy`'s pool has plenty of spare memory available. The best solution to this problem is to **reroute the memory requests** so that only one library is in charge. Specifically, `cupy` offers a [`cupy.cuda.set_allocator`](https://docs-cupy.chainer.org/en/stable/reference/generated/cupy.cuda.set_allocator.html) function, which should allow a custom allocator to be created that requests its memory via PyTorch. Thinc provides a handy shortcut for this via the [`set_gpu_allocator`](/docs/api-backends#set_gpu_allocator) helper function. - gpu_memory thinc-release-v9.1.1/website/docs/usage-models.md000066400000000000000000001411161467064331700217530ustar00rootroot00000000000000--- title: Defining and Using Models next: /docs/usage-training --- Thinc's model-definition API is based on functional programming. The library provides a compact set of useful [combinator functions](/docs/api-layers#combinators), which combine layers together in different ways. It's also very easy to write your own combinators, to implement custom logic. Thinc also provides [shim classes](/docs/usage-frameworks) that let you wrap models from other libraries, allowing you to use them within Thinc. There are a few great advantages to Thinc's approach: there's **less syntax to remember**, complex models can be defined **very concisely**, we can perform **shape inference** to save you from passing in redundant values, and we're able to perform sophisticated **network validation**, making it easier to raise errors early if there's a problem with your network. Thinc's approach does come with some disadvantages, however. If you write custom combinators, you'll have to take care to **pass your gradients through** correctly during the backward pass. Thinc also doesn't try to perform sophisticated graph optimizations, so "native" Thinc models may be slower than PyTorch or TensorFlow. That's where the [shim layers](/docs/usage-frameworks) come in: you can use Thinc to make all the **data manipulation and preprocessing** operations easy and readable, and then call into TensorFlow or PyTorch for the expensive part of your model, such as your transformer layers or BiLSTM. - intro - intro_model - basic_cnn_tagger - transformers_tagger --- ## Composing models {#composing} Thinc follows a **functional-programming approach** to model definition. Its approach is especially effective for complicated network architectures, and use-cases where different data-types need to be passed through the network to reach specific subcomponents. However, individual Thinc components are often less performant than implementations from other libraries, so we suggest the use of wrapper objects around performance-sensitive components such as LSTM or transformer encoders. You then use Thinc to wire these building blocks together in complicated ways, taking advantage of the type checking, configuration system and concise syntax to make your code easier to write, read and maintain. For instance, let's say you want a simple three-layer network, where you apply two fully-connected layers, each with a non-linear activation function, and then an output layer with a softmax activation. Thinc provides creation functions that pair weights + activation with optional dropout and layer normalization, and the feed-forward relationship is expressed using the [`chain`](/docs/api-layers#chain) combinator. So the three layer network would be: ```python ### Simple model model = chain( Relu(nO=hidden_width, dropout=0.2), Relu(nO=hidden_width, dropout=0.2), Softmax(nO=n_classes) ) ``` The [`chain`](/docs/api-layers#chain) function is similar to the `Sequential` class in PyTorch and Keras: it expresses a **feed-forward relationship** between the layers you pass in. We refer to wiring functions like `chain` as [**combinators**](/docs/api-layers#combinators). While most libraries provide a few combinators, Thinc takes this general approach a bit further. Instead of expressing operations over data, you'll often create your network by expressing operations over functions. This is what we mean when we say Thinc favors a "functional" as opposed to "imperative" approach. ```python ### Imperative {small="true"} def multiply_reshape_sum(linear, X, pieces=4): Y = linear.forward(X) Y = Y.reshape((Y.shape[0], -1, pieces)) Y = Y.sum(axis=-1) return Y ``` ```python ### Functional {small="true"} multiply_reshape_sum = chain( linear, reshape(lambda Y, pieces: (X.shape[0], -1, pieces), {"pieces": 4}), reduce_sum(axis=-1) ) ``` In the **imperative** code above, you write a function that takes a batch of data, do some things to it, and return the result. The **functional** code is one step more abstract: you define the function using a relationship (`chain`) and pass in functions to do each step. This approach is confusing at first, but we promise it pays off once the network gets more complicated, especially when combined with the option to define your own infix notation through operator overloading. ```python ### Tagger with multi-feature embedding and CNN encoding from thinc.api import HashEmbed, Maxout, Softmax, expand_window from thinc.api import residual, with_array, clone, chain, concatenate width = 128 depth = 4 n_tags = 17 def MultiEmbed(width): return concatenate( HashEmbed(width, 4000, column=0), HashEmbed(width // 2, 2000, column=1), HashEmbed(width // 2, 2000, column=2), HashEmbed(width // 2, 2000, column=3), ) def Hidden(nO, dropout=0.2): return Maxout(nO, pieces=3, normalize=True, dropout=dropout) def CNN(width): return residual(chain(expand_window(1), Hidden(width))) model = with_array( chain( MultiEmbed(width), Hidden(width), clone(CNN(width), depth), Softmax(n_tags) ) ) ``` The example above shows the definition of a tagger model with a **multi-feature CNN token-to-vector encoder**, similar to the one we used in [spaCy](https://spacy.io) v2.x. Multiple numeric ID features are extracted for each word, and each feature is separately embedded. The separate vectors are concatenated and passed through a hidden layer, and then several convolutional layers are applied for contextual encoding. Each CNN layer performs a "sequence-to-column" transformation, where a window of surrounding words is concatenated to each vector. A hidden layer then maps the result back to the original dimensionality. Residual connections and layer normalization are used to assist convergence. ### Overloading operators {#operators} The [`Model.define_operators`](/docs/api-model#define_operators) classmethod allows you to bind arbitrary binary functions to Python operators, for use in any `Model` instance. The method can (and should) be used as a contextmanager, so that the overloading is limited to the immediate block. This allows concise and expressive model definitions, using custom infix notations. ```python from thinc.api import Model, chain, Relu, Softmax with Model.define_operators({">>": chain}): model = Relu(512) >> Relu(512) >> Softmax() ``` `Model.define_operators` takes a dict of operators mapped to functions, typically [combinators](/docs/api-layers#combinators). Each function should expect two arguments, one of which is a [`Model`](/docs/api-model) instance. The second argument can be any type, but will usually be another model. Within the block you can now use the defined operators to compose layers – for instance, `a >> b` is equivalent to `chain(a, b)`. The overloading is cleaned up again at the end of the block. The following operators are supported: `+`, `-`, `*`, `@`, `/`, `//`, `%`, `**`, `<<`, `>>`, `&`, `^` and `|`. If your models are very complicated, operator overloading can make your code **more concise and readable**, while also making it easier to change things and experiment with different architectures. Here's the same CNN-based tagger, written with operator overloading. ```python ### with operator overloading from thinc.api import Model, HashEmbed, Maxout, Softmax, expand_window from thinc.api import residual, with_array, clone, chain, concatenate width = 128 depth = 4 n_tags = 17 def Hidden(nO, dropout=0.2): return Maxout(nO, pieces=3, normalize=True, dropout=dropout) with Model.define_operators({">>": chain, "**": clone, "|": concatenate}): model = with_array( ( HashEmbed(width, 4000, column=0) | HashEmbed(width // 2, 2000, column=1) | HashEmbed(width // 2, 2000, column=2) | HashEmbed(width // 2, 2000, column=3) ) >> Hidden(width) >> residual(expand_window(1) >> Hidden(width)) ** depth >> Softmax(n_tags) ) ``` You won't always want to use operator overloading, but sometimes it's the best way to show how information flows through the network. It can also help you toggle debugging, logging or other configuration over individual components. For instance, you might set up your operators so that you can write `LSTM(width, width) @ 4` to set logging level 4 over just that component. Note that the binding is defined at the beginning of each block, so you're free to bind operators to your own functions, allowing you to define something like a local domain-specific language. ### Initialization and data validation {#validation} After defining your model, you can call [`Model.initialize`](/docs/api-model#initialize) to initialize the weights, calculate unset dimensions, set attributes or perform any other setup that's required. Combinators are in charge of initializing their child layers. `Model.initialize` takes an optional **sample of input and output data** that's used to **infer missing shapes** and **validate your network**. If possible, you should always provide at least _some_ data to ensure all dimensions are set and to spot potential problems early on. If a layer receives an unexpected data type, Thinc will raise a [`DataValidationError`](/docs/api-util#errors) – like in this case where a [`Linear`](/docs/api-layers#linear) layer that expects a 2d array is initialized with a 3d array: ```python ### Invalid data {small="true"} from thinc.api import Linear import numpy X = numpy.zeros((1, 1, 1), dtype="f") model = Linear(1, 2) model.initialize(X=X) ``` ``` ### Error {small="true"} Data validation error in 'linear' X: <class 'numpy.ndarray'> Y: <class 'NoneType'> X wrong array dimensions (expected 2, got 3) ``` During initialization, the inputs and outputs that pass through the model are checked against the **signature** of the layer's `forward` function. If a layer's forward pass annotates the input as `X: Floats2d` but receives a 3d array of floats, an error is raised. Similarly, if the forward pass annotates its return value as `-> Tuple[List[FloatsXd], Callable]` but the model is initialized with an array as the output data sample, you'll also see an error. Because each layer is only responsible for itself (and its direct children), data validation also works out-of-the-box for complex and nested networks. That's also where it's most powerful, since it lets you detect problems as the data is transformed. In this example, the [`Relu`](/docs/api-layers#relu) layer outputs a 2d array, but the [`ParametricAttention`](/docs/api-layers#parametricattention) layer expects a [ragged array](/docs/api-types#ragged) of data and lengths. ```python ### Invalid network {small="true"} X = [numpy.zeros((4, 75), dtype="f")] Y = numpy.zeros((1,), dtype="f") model = chain( list2ragged(), reduce_sum(), Relu(12, dropout=0.5), # -> Floats2d ParametricAttention(12) ) model.initialize(X=X, Y=Y) ``` ``` ### Error {small="true"} Data validation error in 'para-attn' X: <class 'numpy.ndarray'> Y: <class 'NoneType'> X instance of Ragged expected ``` Note that if a layer accepts multiple types, the data will be validated against each type and if it doesn't match any of them, you'll see an error describing **all mismatches**. For instance, `with_array` accepts a ragged array, a padded array, a 2d array or a list of 2d arrays. If you pass in a 3d array, which is invalid, the error will look like this: ```python ### Invalid data {small="true"} from thinc.api import with_array, Linear import numpy X = numpy.zeros((1, 1, 1), dtype="f") model = with_array(Linear()) model.initialize(X=X) ``` ``` ### Error {small="true"} Data validation error in 'with_array-linear' X: <class 'numpy.ndarray'> Y: <class 'numpy.ndarray'> X instance of Padded expected X instance of Ragged expected X value is not a valid list X wrong array dimensions (expected 2, got 3) ``` To take advantage of runtime validation, [config validation](/docs/usage-config#registry) and [static type checking](/docs/usage-type-checking), you should **add type hints** to any custom layers, wrappers and functions you define. Type hints are optional, though, and if no types are provided, the data won't be validated and any inputs will be accepted. --- ## Defining new layers {#new-layers} Thinc favors a **composition rather than inheritance** approach to creating custom sublayers: the base [`Model`](/docs/api-model) class should be all you need. You can define new layers by simply passing in different data, especially the **forward** function, which is where you'll implement the layer's actual logic. You'll usually want to make a function to put the pieces together. We refer to such functions as **constructors**. The constructor is responsible for defining the layer. Parameter allocation and initialization takes place in an optional `init` function, which is called by `model.initialize`. ```python ### Layer definition model = Model( "layer-name", # string name of layer forward, # forward function init=init, # optional initialize function dims={"nO": 128, "nI": None}, # optional dimensions params={"W": None, "b": None}, # optional parameters attrs={"my_attr": True}, # optional non-parameter attributes refs={}, # optional references to other layers layers=[], # child layers shims=[] # child shims ) ``` ### Constructor functions {#constructor-functions} Thinc layers are almost always instances of [`Model`](/docs/api-model). You usually don't need to create a subclass, although you can if you prefer. Because layers usually reuse the same `Model` class, the constructor takes on some responsibilities for defining the layer, even if all the data isn't available. The `refs`, `params` and `dim` dictionaries are all mappings from string names to optional values (where "optional" means you can make the value `None`). You should use `None` to indicate the full set of names that should be present once the layer is fully initialized. However, you cannot pass `None` values for missing child layers or shims: these lists do not support `None` values. Dimension, attribute and parameter names are identified using strings. Thinc's built-in layers use the [convention](#naming-conventions) that `"nI"` refers to the model's input width, and `"nO"` refers to the model's output width. You should usually try to provide these, unless they are undefined for your model (for instance, if your model accepts an arbitrary unsized object like a database connector, it doesn't make sense to provide an `"nI"` dimension.) Your constructor should define all dimensions and parameters you want to attach to the model, mapping them to `None` if the values aren't available yet. You'll usually map parameters to `None`, and only allocate them in your `init` function. ```python from thinc.api import Model def random_chain(child_layer1: Model, child_layer2: Model, prob: float = 0.2) -> Model: """Randomly invert the order of two layers during training.""" return Model( "random_order", random_chain_forward, init=init, attrs={"prob": prob}, layers=[child_layer1, child_layer2], ) ``` Many model instances will have one or more **child layers**. For composite models that have several distinct parts, you should usually write your creation functions to receive instances of the child layers, rather than settings to construct it. This will make your layer more modular, and let you take better advantage of Thinc's config system. You can add or remove child layers after creation via the [`Model.layers`](/docs/api-model#properties) list property, but you should usually prefer to set up the child layers on creation if possible. In complicated networks, sometimes you need to refer back to specific parts of the model. For instance, you might want to access the embedding layer of a network directly. The `refs` dict lets you create named references to nodes. You can have nodes referring to their siblings or parents, so long as you don't try to serialize only that component: when you call [`Model.to_bytes`](/docs/api-model#to_bytes) or [`Model.to_disk`](/docs/api-model#to_disk), all of the reference targets must be somewhere within the model's tree. Under the hood, references are implemented using Python's weakref feature, to avoid circular dependencies. For instance, let's say you needed each child layer in the `random_order` example above to refer to each other. You could do this by setting node references for them: ```python child_layer1.set_ref("sibling", child_layer2) child_layer2.set_ref("sibling", child_layer1) ``` If you call `model.to_bytes`, both references will be within the tree, so there will be no problem. But you would not be able to call `child_layer1.to_bytes` or `child_layer2.to_bytes`, as the link targets aren't reachable from [`Model.walk`](/docs/api-model#walk). Thinc's built-in layers follow a naming convention where combinators and stateless transformations are created from `snake_case` functions, while weights layers or higher level components are created from `CamelCased` names. This naming reflects the general usage purpose of the layer, rather than the details of exactly what top-level container is returned. Constructing models via functions allows your code to do some things that would be difficult or impossible with an API that exposes `__init__` methods directly, because it's difficult to return a different object instance from a class constructor. For instance, Thinc's `Relu` layer accepts the options `dropout` and `normalize`. These operations are implemented as separate layers, so the constructor uses the `chain` combinator to put everything together. You should feel free to take this type of approach in your own constructors too: you can design the components of your network to be smaller reusable pieces, while making the user-facing API refer to larger units. ### The forward function and backprop callback {#weights-layers-forward} Writing the forward function is the main part of writing a new layer --- it's where the computation actually takes place. The forward function is passed into [`Model.__init__`](/docs/api-model#init), and then kept as a reference within the model instance. You won't normally call your forward function directly. It will usually be invoked indirectly, via the [`__call__`](/docs/api-model#call), [`predict`](/docs/api-model#predict) and [`begin_update`](/docs/api-model#begin_update) methods. The implementation of the `Model` class is pretty straightforward, so you can have a look at the code to see how it all fits together. Because the `forward` function is invoked within the `Model` instance, it needs to stick to a strict signature. Your forward function needs to accept **exactly three arguments**: the model instance, the input data and a flag indicating whether the model is being invoked for training, or for prediction. It needs to return a tuple with the output, and the backprop callback. ```python ### Forward function for a Linear layer def linear_forward(model: Model, X, is_train): W = model.get_param("W") b = model.get_param("b") Y = X @ W.T + b def backprop(dY): model.inc_grad("b", dY.sum(axis=0)) model.inc_grad("W", dY.T @ X) return dY @ W return Y, backprop ``` | Argument | Type | Description | | ----------- | ----------------------------- | --------------------------------------------------- | |  `model` | Model | The model instance. | | `X` | Any | The inputs. | | `is_train` | bool | Whether the model is running in a training context. | | **RETURNS** | Tuple[Any, Callable] | The output and the backprop callback. | The model won't invoke your forward function with any extra positional or keyword arguments, so you'll normally attach what you need to the model, as `params`, `dims`, `attrs`, `layers`, `shims` or `refs`. At the beginning of your function, you'll fetch what you need from the model and carry out your computation. For example, the `random_chain_forward` function retrieves its child layers and the `prob` attribute, uses them to compute the output, and then returns it along with the `backprop` callback. The `backprop` callback uses some results from the `forward`'s scope (specifically the two child callbacks and the `prob` attribute), and returns the gradient of the input. ```python def random_chain_forward(model: Model, X, is_train: bool): child_layer1 = model.layers[0] child_layer2 = model.layers[1] prob = model.get_attr("prob") is_reversed = is_train and prob >= random.random() if is_reversed: Y, get_dX = child_layer2(X, is_train) Z, get_dY = child_layer1(Y, is_train) else: Y, get_dX = child_layer1(X, is_train) Z, get_dY = child_layer2(Y, is_train) def backprop(dZ): dY = get_dY(dZ) dX = get_dX(dY) return dX return Z, backprop ``` Instead of defining the `forward` function separately, it's sometimes more elegant to write it as a closure within the constructor. This is especially helpful for quick utilities and transforms. If you don't otherwise need a setting to be accessible from a model or serialized with it, you can simply reference it from the outer scope, rather than passing it in as an attribute. You should avoid referencing child layers in this way, however, as you do need to pass the child layers into the `layers` list – otherwise they will be not part of the model's tree. ```python def random_chain(child_layer1, child_layer2, prob=0.2): ... def random_chain_forward(model: Model, X, is_train: bool): # You can define the `forward` function as a closure. If so, it's fine # to use attributes from the outer scope, but child layers should be # retrieved from the model. child_layer1, child_layer2 = model.layers is_reversed = is_train and prob >= random.random() ... ... ``` Another way to pass data from the constructor into the forward function is partial function application. This is the best approach for static data that will be reliably available at creation and does not need to be serialized. Partial application is also the best way to establish temporary buffers for your forward function to reuse. Reusable buffers can be helpful for performance tuning to prevent repeat additional memory allocation. There are a few constraints that well-behaved forward functions should follow in order to make them interoperate better with other layers, and to help your code work smoothly in distributed settings. Many of these considerations are less relevant for quick hacks or experimentation, but even if everything stays between you and your editor, you're likely to find your code easier to work with and reason about if you keep these rules in mind, as they all amount to "avoid unnecessary side-effects". - **Params can be read-only.** The `model.get_params` method is allowed to return read-only arrays, or copies of the internal data. You should not assume that in-place changes to the params will have any effect. - **Inputs can be read-only.** You should avoid writing to input variables, but if it's _really_ necessary for efficiency, you should at least check the `array.flags["WRITEABLE"]` attribute, and make a copy if necessary. Equally, if it's crucial for your layer that variables are not written to, use `array.setflags(write=False)` to prevent any shenanigans. - **Writeable variables might get written to.** You'll often want to reference a variable returned by your forward function inside your backprop callback, as otherwise you'd have to recompute it. However, after your function has returned, the caller might write to the array, changing it out from under you. If the data is small, the best solution is to make a copy of variables you want to retain. If you're really worried about efficiency, you can set the array to read-only using `array.set_flags(write=False)`. - **Avoid calls to [`Model.set_param`](/docs/api-model#set_param).** If you do _have_ to change the params during the forward function or the backprop callback, `set_param` is the best way to do it – but you should try to prefer other designs, as other code may not expect params to change during forward or backprop. - **Don't call [`Model.set_dim`](/docs/api-model#set_dim).** There's not really a need to do this, and you're likely to cause a lot of problems for other layers. If the parent layer checks a child dimension and then invokes it, the parent should not have to double check that the dimensions of the child have changed. - **It's okay to update the [`Model.attrs`](/docs/api-model#properties).** If you do need to change state during the forward pass (for instance, for batch normalization), `model.attrs["some_attr"] = new_value` is the best approach. Of course, all else being equal, side-effects are worse than no side-effects – but sometimes it's just what you need to do. Consequently, your layer should expect that child layers are allowed to modify or set attrs during their forward or backward functions. You can avoid any of the read-only stuff by following a policy of never modifying your inputs, and always making a copy of your outputs if you need to retain them. This is the most conservative approach, and for most situations it's what we would recommend – it ensures your layer will work well even when combined with other layers that aren't written carefully. However, you'll sometimes be writing code where it's reasonable to worry about unnecessary copies. In these situations, the read-only flags work sort of like traffic rules. If everyone cooperates, you can go faster, but if someone forgets to indicate, there might be a crash. ### Writing the backprop callback {#backprop} Your `forward` function must return a callback to compute gradients of the parameters and weights during training. The callback must accept inputs that match the outputs of the forward pass and return outputs that match the inputs to the forward pass (the specifics of "matching" might differ between types, but for arrays, assume it means the same shape and type). If the forward function is `Y = forward(X)`, then the backprop callback should be `dX = backprop(dY)`, with `X.shape == dX.shape` and `Y.shape == dY.shape`. #### A more technical explanation Thinc's `forward` functions behave like functions transformed by JAX's [`jax.vjp`](https://jax.readthedocs.io/en/latest/jax.html#jax.vjp) function. Some readers may prefer their more technical description, which is that the `forward` function returns: A`(primals_out, vjpfun)` pair, where `primals_out` is `fun(*primals)`. `vjpfun` is a function from a cotangent vector with the same shape as `primals_out` to a tuple of cotangent vectors with the same shape as `primals`, representing the vector-Jacobian product of `fun` evaluated at `primals`. Your backprop callback will often refer to variables in the outer scope. This allows you to easily **reuse state from the forward pass**. The Python runtime will increment the reference count of all variables that your backprop callback references, and then decrement the reference counts once the callback is destroyed. We can see this working by attaching a `__del__` method to some classes, which show when the objects are being destroyed. ```python ### {small="true"} class Thing: def __del__(self): print("Deleted thing") class Other: def __del__(self): print("Deleted other") def outer(): thing = Thing() other = Other() def inner(): return thing return inner ``` ```python >>> callback = outer() Deleted other >>> callback = None Deleted thing ``` This behavior makes managing memory very easy: objects you reference will be kept alive, and objects you don't are eligible to be freed. You should therefore avoid unnecessary references if possible. For instance, if you only need the shape of an array, it is better to assign that to a local variable, rather than accessing it via the parent array. Your backprop callback is not guaranteed to be called, so you should not rely on it to compute side-effects. It is also valid for code to execute the backprop callback more than once, so your function should be prepared for that. However, it is not valid to call the backprop callback if the forward function was executed with `is_train=False`, so you can implement predict-only optimizations. It is also invalid for layers to change each others' parameters or dimensions during execution, so your function does not need to be prepared for that. Thinc does leave you with the responsibility for **calculating the gradients correctly**. If you do not get them right, your layer will not learn correctly. If you're having trouble, you might find [Thinc's built-in layers](https://github.com/explosion/thinc/blob/master/thinc/layers) a helpful reference, as they show how the backward pass should look for a number of different situations. They also serve as examples for how we would suggest you structure your code to make calculating the backward pass easier. Naming is especially important: you need to see the order of steps in the forward pass and unwind them in reverse. For complex cases, it also helps a lot to break out calculations into **helper functions that return a backprop callback**. Then your outer layer can simply call the callbacks in reverse. It also helps to follow a consistent naming scheme for these callbacks. We usually either name our callbacks by the result returned (like `get_dX)`, or the variable that you'll pass in (like `bp_dY`). Frustratingly, your layer might still limp on even with a mistake in the gradient calculation, making the problem hard to detect. As is often the case in programming, almost correct is the worst kind of incorrect. Often it's best to check your work with some tooling. Both [JAX](https://jax.readthedocs.io/en/latest/) and [Tangent](https://github.com/google/tangent) are very helpful for this. Often you'll write layers that are not meaningfully differentiable, or for which you do not need the gradients of the inputs. For instance, you might have a layer that lower-cases textual inputs. In these cases, the backprop callback should return **some appropriate falsy value** of the same type as the input to avoid raising spurious type errors. For instance, if the input is a list of strings, you would return an empty list; if the input is an array, you can return an empty array. ### The initialize function {#weights-layers-init} The last function you may need to define is the initializer, or "init", function. Like the `forward` function, your `init` function will be stored on the model instance, and then called by the [`Model.initialize`](/docs/api-model#initialize) method. You do not have to expect that the function will be called in other situations. Your `init` function will be called with an instance of your model and two optional arguments, which may provide an example batch of inputs (`X`) and an example batch of outputs (`Y`). The arguments may be provided positionally or by keyword (so the naming is significant: you must call the arguments `X` and `Y`). Your model can use the provided example data to **help calculate unset dimensions**, assist with parameter initialization, or calculate attributes. It is valid for your construction function to return your model with missing information, hoping that the information will be filled in later or at initialization via the example data. If the example data is not provided and you're left with unset dimensions or other incomplete state, you should raise an error. It is up to you to decide how you should handle receiving conflict information at construction and initialization time. Sometimes it will be better to overwrite the construction data, and other times it will be better to raise an error. ```python ### Initialize function def random_chain_init(model, X=None, Y=None): if X is not None and model.has_dim("nI") is None: model.set_dim("nI", X.shape[1]) if Y is not None and model.has_dim("nO") is None: model.set_dim("nO", Y.shape[1]) for child_layer in model.layers: child_layer.initialize(X=X, Y=Y) ``` The `model.initialize` method will not call your `init` function with any extra arguments, but you will often want to parameterize your `init` with settings from the constructor. This is especially common for weight initialization: there are many possible schemes, and the choice is often an important hyper-parameter. While you can communicate this information via the `attrs` dict, our favorite solution is to use [`functools.partial`](https://docs.python.org/3.6/library/functools.html#functools.partial). Partial function application lets you fill in a function's arguments at two different times, instead of doing it all at once --- which is exactly what we need here. This lets you write the `init` function with extra arguments, which you provide at creation time when the information is available. ```python ### Passing init args using partial {highlight="1,10,16"} from functools import partial from thinc.api import Model def constructor(nO=None, initial_value=1): return Model( "my-model", forward, dims={"nO": nO}, params={"b": None}, init=partial(init, initial_value=initial_value) ) def forward(model, X, is_train): ... def init(initial_value, model, X=None, Y=None): if Y is not None and model.has_dim("nO") is None: model.set_dim("nO", None) if not model.get_dim("nO"): raise ValueError(f"Cannot initialize {model.name}: dimension nO unset") b = model.ops.alloc1f(model.get_dim("nO")) b += initial_value model.set_param("b", b) ``` You can find real examples of the partial-application pattern in [`thinc.layers`](https://github.com/explosion/thinc/blob/master/thinc/layers). The [`Relu`](https://github.com/explosion/thinc/blob/master/thinc/layers/relu.py), [`Mish`](https://github.com/explosion/thinc/blob/master/thinc/layers/mish.py) and [`Maxout`](https://github.com/explosion/thinc/blob/master/thinc/layers/maxout.py) layers provide straightforward examples, among others. A call to [`Model.initialize`](/docs/api-model#initialize) will trigger subsequent calls down the model tree, as **each layer is responsible for calling the initialize method of each of its children** (although not necessarily in order). Prior to training, you can rely on your model's `init` function being called at least once in between the constructor and the first execution of your forward function. It is invalid for a parent to not call `initialize` on one of its children, and it is invalid to start training without calling `Model.initialize` first. However, it _is_ valid to create a layer and then load its state back with [`Model.from_dict`](/docs/api-model#from_dict), [`Model.from_bytes`](/docs/api-model#from_bytes) or [`Model.from_disk`](/docs/api-model#from_disk) without calling `model.initialize` first. This means that you should not write any side-effects in your `init` function that will not be replicated by deserialization. Deserialization will restore dimensions, parameters, node references and serializable attributes, but it will not replicate any changes you have made to the layer's node structure, such as changes to the `model.layers` list. You should therefore avoid making those changes within the `init`, or your model will not deserialize correctly. It is valid for your `init` function to be called **more than once**. This usually happens because the same model instance occurs twice within a a tree (which is allowed). Your `initialize` function should therefore be prepared to run twice. If you're simply setting dimensions and allocating and initializing parameters, having the init function run will generally be unproblematic. However, in special situations you may need to call external setup code, in which case having your `init` function run twice could be problematic. The best solution would probably be to set a global variable, possibly using the `model.id` attribute to allow the `init` to run once per model instance. You could also use partial function application to attach the flag in a mutable argument variable. ### Inspecting and updating model state {#model-state} As you build more complicated models, you'll often need to inspect your model in various ways. This is especially important when you're writing your own layers. Here's a quick summary of the different types of information you can attach and query. | | | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | [`Model.id`](/docs/api-model#attributes) | A numeric identifier, to distinguish different model instances. During [`Model.__init__`](/docs/api-model#init), the `Model.global_id` class attribute is incremented and the next value is used for the `model.id` value. | | [`Model.name`](/docs/api-model#attributes) | A string name for the model. | | [`Model.layers`](/docs/api-model#properties) [`Model.walk`](/docs/api-model#walk) | List the immediate sublayers of a model, or iterate over the model's whole subtree (including the model itself). | | [`Model.shims`](/docs/api-model#properties) | Wrappers for external libraries, such as PyTorch and TensorFlow. [`Shim`](/docs/api-model#shim) objects hold a reference to the external object, and provide a consistent interface for Thinc to work with, while also letting Thinc treat them separately from `Model` instances for the purpose of serialization and optimization. | | [`Model.has_dim`](/docs/api-model#has_dim) [`Model.get_dim`](/docs/api-model#get_dim) [`Model.set_dim`](/docs/api-model#set_dim) [`Model.dim_names`](/docs/api-model#properties) | Check, get, set and list the layer's **dimensions**. A dimension is an integer value that affects a model's parameters or the shape of its input data. | | [`Model.has_param`](/docs/api-model#has_param) [`Model.get_param`](/docs/api-model#get_param) [`Model.set_param`](/docs/api-model#set_param) [`Model.param_names`](/docs/api-model#properties) | Check, get, set and list the layer's **weights parameters**. A parameter is an array that can have a gradient and can be optimized. | | [`Model.has_grad`](/docs/api-model#has_grad) [`Model.get_grad`](/docs/api-model#get_grad) [`Model.set_grad`](/docs/api-model#set_grad) [`Model.inc_grad`](/docs/api-model#inc_grad) [`Model.grad_names`](/docs/api-model#properties) | Check, get, set, increment and list the layer's **weights gradients**. A gradient is an array of the same shape as a weights parameter, that increments values used to update the parameter during training. | | [`Model.has_ref`](/docs/api-model#has_ref) [`Model.get_ref`](/docs/api-model#get_ref) [`Model.set_ref`](/docs/api-model#set_ref) [`Model.ref_names`](/docs/api-model#properties) | Check, get, set and list the layer's **node references**. A node reference lets you easily refer to particular nodes within your model's subtree. For instance, if you want to expose the embedding table from your model, you can add a reference to it. | | [`Model.attrs`](/docs/api-model#properties) | A dict of the layer's **attributes**. Attributes are other information the layer needs, such as configuration or settings. You should ensure that attribute values you set are either JSON-serializable, or support a `to_bytes` method, or the attribute will prevent model serialization. | ### Naming conventions {#naming-conventions} Thinc names dimensions and parameters with strings, so you can use arbitrary names on your models. For the built-in [layers and combinators](/docs/api-layers), we use the following conventions: | | | | ---- | -------------------------------------------------------------------------- | | `nO` | The width of output arrays from the layer. | | `nI` | The width of input arrays from the layer. | | `nP` | Number of "pieces". Used in the [`Maxout`](/docs/api-layers#maxput) layer. | | `W` | A 2-dimensional weights parameter, for connection weights. | | `b` | A 1-dimensional weights parameter, for biases. | | `E` | A 2-dimensional weights parameter, for an embedding table. | --- ## Serializing models and data {#serializing} Of course, training a model isn't very useful without a way to save out the weights and load them back in later. Thinc supports **three ways of saving and loading your model**: 1. The most flexible is to use the [`Model.to_bytes`](/docs/api-model#to_bytes) method, which saves the model state to a byte string, serialized using the `msgpack` library. The result can then be loaded back using the [`Model.from_bytes`](/docs/api-model#from_bytes) method. 2. The [`Model.to_disk`](/docs/api-model#to_disk) method works similarly, except the result is saved to a path you provide instead. The result can be loaded back using the [`Model.from_disk`](/docs/api-model#from_disk) method. 3. Pickle the `Model` instance. This should work, but is not our recommendation for most use-cases. Pickle is inefficient in both time and space, does not work reliably across Python versions or platforms, and is not suitable for untrusted inputs, as unpickling an object allows arbitrary code execution by design. The `from_bytes` and `from_disk` methods are intended to be relatively safe: unlike formats such as Pickle, untrusted inputs are not intended to allow arbitrary code execution. This means you have to create the `Model` object yourself first, and then use that object to load in the state. To make this easier, you'll usually want to put your model creation code inside a function, and then **register it**. The [registry](/docs/api-config#registry) allows you to look up the function by name later, so you can pass along all the details to recreate your model in one message. Check out our [guide on the config system](/docs/usage-config) for more details. ### Serializing attributes {#serializing-attrs} When you call [`Model.to_bytes`](/docs/api-model#to_bytes) or [`Model.to_disk`](/docs/api-model#to_disk), the model and its layers, weights, parameters and attributes will be serialized to a byte string. Calling [`Model.from_bytes`](/docs/api-model#from_bytes) or [`Model.from_disk`](/docs/api-model#from_disk) lets you load a model back in. By default, Thinc uses MessagePack, which works out-of-the-box for all JSON-serializable data types. The `serialize_attr` and `deserialize_attr` functions that Thinc uses under the hood are [single-dispatch generic functions](https://docs.python.org/3/library/functools.html#functools.singledispatch). This means that you can **register different versions** of them that are chosen based on the **value and type of the attribute**. For example, let's say your model takes attributes that are [`DataFrame`](https://pandas.pydata.org/pandas-docs/stable/reference/frame.html) objects: ```python ### Model with custom attrs {highlight="4"} from thinc.api import Model import pandas as pd attrs = {"df": pd.DataFrame([10, 20, 30], columns=["a"])} model = Model("custom-model", lambda X: (X, lambda dY: dY), attrs=attrs) ``` To tell Thinc how to save and load them, you can use the `@serialize_attr.register` and `@deserialize_attr.register` decorators with the type `pd.DataFrame`. Whenever Thinc encounters an attribute value that's a dataframe, it will use these functions to serialize and deserialize it. ```python ### Custom attr serialization {highlight="5-6,11-12"} from thinc.api import serialize_attr, deserialize_attr import pandas as pd import numpy @serialize_attr.register(pd.DataFrame) def serialize_dataframe(_, value, name, model): """Serialize the value (a dataframe) to bytes.""" rec = value.to_records(index=False) return rec.tostring() @deserialize_attr.register(pd.DataFrame) def deserialize_dataframe(_, value, name, model): """Deserialize bytes to a dataframe.""" rec = numpy.frombuffer(value, dtype="i") return pd.DataFrame().from_records(rec) ``` The first argument of the function is always an instance of the attribute. This is used to decide which function to call. The `value` is the value to save or load – a dataframe to serialize or the bytestring to deserialize. The functions also give you access to the string name of the current attribute and the `Model` instance. This is useful if you need additional information or if you want to perform other side-effects when loading the data back in. For example, you could check if the model has another attribute specifying the data type of the array and use that when loading back the data: ```python ### {highlight="4-5"} @deserialize_attr.register(pd.DataFrame) def deserialize_dataframe(_, value, name, model): """Deserialize bytes to a dataframe.""" dtype = model.attrs.get("dtype", "i") rec = numpy.frombuffer(value, dtype=dtype) return pd.DataFrame().from_records(rec) ``` Since the attribute value is used to decide which serialization and deserialization function to use, make sure that your model defines **default values** for its attributes. This way, the correct function will be called when you run `model.from_bytes` or `model.from_disk` to load in the data. ```diff - attrs = {"df": None} + attrs = {"df": pd.DataFrame([10, 20, 30], columns=["a"])} model = Model("custom-model", lambda X: (X, lambda dY: dY), attrs=attrs) ``` thinc-release-v9.1.1/website/docs/usage-sequences.md000066400000000000000000000333471467064331700224710ustar00rootroot00000000000000--- title: Variable-length sequences teaser: Dataclasses for ragged, padded, paired and list-based sequences next: /docs/usage-type-checking --- Thinc's built-in layers support several ways to **encode variable-length sequence data**. The encodings are designed to avoid losing information, so you can compose operations smoothly and easily build hierarchical models over structured inputs. This page provides a summary of the different formats, their advantages and disadvantages, and a summary of which built-in layers accept and return them. There's no restrictions on what objects your own models can accept and return, so you're free to invent your own data types. ## Background and motivation {#background} The [`numpy.ndarray`](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html) object represents a multi-dimensional table of data. In the simplest case, there's only one dimension, or "axis", so the size of the array is equal to its length: ```python array1d = numpy.ndarray((10,)) assert array1d.size == 10 assert array1d.shape == (10,) ``` To make a two-dimensional array, we can instead write `array2d = numpy.ndarray((10, 16))`. This will be a table with 10 rows and 16 columns, and a total size of 160 items. However, the `ndarray` object does not have a native way to represent data with a **variable number of columns per row**. If the last row of your data only has 15 items rather than 16, you cannot create a two-dimensional array with only 159 items, where rows one to nine have 16 columns and the last row has 15 columns. The limitation makes a lot of sense: the rest of the `numpy` API presents operations defined in terms of regularly-shaped arrays, and there's often no obvious generalization to irregularly shaped data. While you could not represent the 159 items in a two-dimensional array, there's no reason why you couldn't keep the data together in a flat format, all in one dimension. You could keep track of the intended number of columns separately, and reshape the data to do various operations according to your intended definitions. This is essentially the approach that Thinc takes for variable-length sequences. Inputs very often are irregularly shaped. For instance, texts vary in length, often significantly. You might also want to represent your texts hierarchically: each word can be seen as a variable-length sequence of characters, each sentence a variable-length sequence of words, each paragraph a variable-length sequence of sentences, and each text a variable-length sequence of paragraphs. A single, padded `ndarray` is a poor choice for this type of hierarchical representation, as each dimension would need to be padded to its longest item. If the longest word in your batch is 10 characters, you will need to use 10 characters for every word. If the longest sentence in your batch has 40 words, every sentence will need to be 40 words. The inefficiency will be multiplied along each dimension, so that the vast majority of the final structure is empty space. Unfortunately, there is no single best solution that is most efficient for every situation. It depends on the shapes of the data, and the hardware being used. On GPU devices, it is often better to use **padded representations**, so long as there is only padding along one dimension. However, on CPU, **denser representations** are often more efficient, as maintaining parallelism is less important. Different libraries also introduce different considerations. For [JAX](https://github.com/google/jax), operations over irregularly-sized arrays are extremely expensive, as a new kernel will need to be compiled for every combination of shapes you provide. Thinc therefore provides a number of **different sequence formats**, with utility layers that convert between them. Thinc also provides layers that represent reversible transformations. The [`with_*` layers](/docs/api-layers#with_array) accept a layer as an argument, and transform inputs on the way into the layer, and then perform the opposite transformation on the way out. For instance, the [`with_padded`](/docs/api-layers#with_padded) wrapper will allow you to temporarily convert to a [`Padded`](/docs/api-types#padded) representation, for the scope of the layer being wrapped. --- ## Padded {#padded} The [`Padded`](/docs/api-types#padded) dataclass represents a **padded batch of sequences** sorted by descending length. The data is formatted in "sequence major" format, i.e. the first dimension represents the sequence position, and the second dimension represents the batch index. The `Padded` type uses three auxiliary integer arrays, to keep track of the actual sequence lengths and the original positions, so that the original structure can be restored. The third auxiliary array, `size_at_t`, allows the padded batch to be sliced to currently active sequences at different time steps. Although the underlying data is sequence-major, the `Padded` dataclass supports **getting items** or **slices along the batch dimension**: you can write `padded[1:3]` to retrieve a `Padded` object with sequence items one and two. The `Padded` format is well-suited for LSTM and other RNN models. ```python ### Example from thinc.api import get_current_ops, Padded ops = get_current_ops() sequences = [ ops.alloc2f(7, 5) + 1, ops.alloc2f(2, 5) + 2, ops.alloc2f(4, 5) + 3, ] padded = ops.list2padded(sequences) assert padded.data.shape == (7, 3, 5) # Data from sequence 0 is first, as it was the longest assert padded.data[:, 0] == 1 # Data from sequence 2 is second, and it's padded on dimension 0 assert padded.data[:4, 1] == 3 # Data from sequence 1 is third, also padded on dimension 0 assert padded.data[:2, 2] == 2 # Original positions assert list(padded.indices) == [0, 2, 1] # Slices refer to batch index. assert isinstance(padded[0], Padded) assert padded[0].data.shape == (7, 1, 5) ``` | | | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | **Operations** | [`Ops.list2padded`](/docs/api-backends#list2padded), [`Ops.padded2list`](/docs/api-backends#padded2list) | | **Transforms** | [`padded2list`](/docs/api-layers#padded2list), [`list2padded`](/docs/api-layers#list2padded), [`with_padded`](/docs/api-layers#with_padded) | | **Layers** | [`LSTM`](/docs/api-layers#lstm), [`PyTorchLSTM`](/docs/api-layers#lstm) | ## Ragged {#ragged} The [`Ragged`](/docs/api-types#ragged) dataclass represents a **concatenated batch of sequences**. An auxiliary array is used to keep track of the lengths. The `Ragged` format is memory efficient, and is efficient for some operations. However, it is not supported directly by most underlying operations. Per-sequence operations such as sequence transposition and matrix multiplication are relatively expensive, but Thinc does support custom CPU and CUDA kernels for more efficient reduction (aka. pooling) operation on ragged arrays. The `Ragged` format makes it easy to ignore the sequence structure of your data for some operations, such as word embeddings or feed-forward layers. These layers do not accept the `Ragged` object directly, but you can wrap the layer using the [`with_array`](/docs/api-layers#with_array) transform to make them compatible without requiring copy operations. The `with_array` transform will pass the underlying array data into the layer, and return the outputs as a `Ragged` object so that the sequence information remains available to the rest of your network. ```python ### Example from thinc.api import get_current_ops, Ragged, Linear, list2ragged ops = get_current_ops() sequences = [ ops.alloc2f(7, 5) + 1, ops.alloc2f(2, 5) + 2, ops.alloc2f(4, 5) + 3, ] list2ragged_model = list2ragged() ragged = list2ragged_model.predict(sequences) assert ragged.data.shape == (13, 5) # This will always be true: assert ragged.data.shape[0] == ragged.lengths.sum() # Data from sequence 0 is in the first 7 rows, followed by seqs 1 and 2 assert (ragged.data[:7] == 1).all() assert (ragged.data[7:2] == 2).all() assert (ragged.data[9:] == 3).all() # Indexing gets the batch item, and returns a Ragged object ragged[0].data.shape == (7, 5) # You can pass the data straight into dense layers model = Linear(6, 5).initialize() output = model.predict(ragged.data) ragged_out = Ragged(output, ragged.lengths) # Internally, data is reshaped to 2d. The original shape is accessible at the # the dataXd property. sequences3d = [ops.alloc3f(5, 6, 7), ops.alloc3f(10, 6, 7)] ragged3d = list2ragged_model.predict(sequences3d) ragged3d.data.shape == (15, 13) ragged3d.dataXd.shape == (15, 6, 7) ``` | | | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Operations** | [`Ops.ragged2list`](/docs/api-backends#ragged2list), [`Ops.list2ragged`](/docs/api-backends#list2ragged), [`Ops.reduce_sum`](/docs/api-backends#reduce_sum), [`Ops.reduce_mean`](/docs/api-backends#reduce_sum), [`Ops.reduce_max`](/docs/api-backends#reduce_sum) | | **Transforms** | [`with_ragged`](/docs/api-layers#with_ragged), [`ragged2list`](/docs/api-layers#ragged2list), [`list2ragged`](/docs/api-layers#list2ragged) | | **Layers** | [`reduce_sum`](/docs/api-layers#reduce_sum), [`reduce_mean`](/docs/api-layers#reduce_mean), [`reduce_max`](/docs/api-layers#reduce_max) | ## List[ArrayXd] {#list-array} A list of arrays is often the most convenient input and output format for sequence data, especially for runtime usage of the model. However, most mathematical operations require the data to be passed in **as a single array**, so you will usually need to transform the array list into another format to pass it into various layers. A common pattern is to use `list2padded` or `list2ragged` as the first layer of your network, and `ragged2list` or `padded2list` as the final layer. You could then opt to strip these from the network during training, so that you can make the transformation just once at the beginning of training. However, this does mean that you'll be training on the same batches of data in each epoch, which may lead to lower accuracies. | | | | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Operations** | [`Ops.ragged2list`](/docs/api-backends#ragged2list), [`Ops.list2ragged`](/docs/api-backends#list2ragged) , [`Ops.padded2list`](/docs/api-backends#padded2list), [`Ops.list2padded`](/docs/api-backends#list2padded) | | **Transforms** | [`ragged2list`](/docs/api-layers#ragged2list), [`list2ragged`](/docs/api-layers#list2ragged), [`padded2list`](/docs/api-layers#padded2list), [`list2padded`](/docs/api-layers#list2padded), [`with_ragged`](/docs/api-layers#with_ragged), [`with_padded`](/docs/api-layers#with_padded) | | **Layers** | [`reduce_sum`](/docs/api-layers#reduce_sum), [`reduce_mean`](/docs/api-layers#reduce_mean), [`reduce_max`](/docs/api-layers#reduce_max) | ## List[List[Any]] {#nested-list} Nested lists are a useful format for many types of **hierarchically structured data**. Often you'll need to write your own layers for these situations, but Thinc does have a helpful utility tool, the `with_flatten` transform. This transform can be applied around a layer in your network, and the layer will be called with a flattened representation of your list data. The outputs are then repackaged into lists, with arrays divided as needed. | | | | -------------- | ----------------------------------------------- | | **Transforms** | [`with_flatten`](/docs/api-layers#with_flatten) | ## Array {#array} Most Thinc layers that work on sequences do **not** expect plain arrays, because the array does not include any representation of where the sequences begin and end, which makes the semantics of some operations unclear. For instance, there's no way to accurately do mean pooling on an array of padded sequences without knowing where the sequences actually end. Max pooling is often also difficult, depending on the padding value. If the array represents sequences, you should **maintain the metadata** to treat it as an intelligible sequence. thinc-release-v9.1.1/website/docs/usage-training.md000066400000000000000000000254351467064331700223100ustar00rootroot00000000000000--- title: Training Models next: /docs/usage-frameworks --- Thinc provides a fairly minimalistic approach to training, leaving you in control to write the training loop. The library provides a few utilities for minibatching, hyperparameter scheduling, loss functions and weight initialization, but does not provide abstractions for data loading, progress tracking or hyperparameter optimization. ## The training loop {#training-loop} Thinc assumes that your model will be trained using some form of **minibatched stochastic gradient descent**. On each step of a standard training loop, you'll loop over batches of your data and call [`Model.begin_update`](/docs/api-model#begin_update) on the inputs of the batch, which will return a batch of predictions and a backpropagation callback. You'll then calculate the gradient of the loss with respect to the output, and provide it to the backprop callback which will increment the gradients of the model parameters as a side-effect. You can then pass an optimizer function into the [`Model.finish_update`](/docs/api-model#finish_update) method to update the weights. ```python ### Basic training loop for i in range(10): for X, Y in train_batches: Yh, backprop = model.begin_update(X) loss, dYh = get_loss_and_gradient(Yh, Y) backprop(dYh) model.finish_update(optimizer) ``` You'll usually want to make some additions to the loop to save out model checkpoints periodically, and to calculate and report progress statistics. Thinc also provides ready access to **lower-level details**, making it easy to experiment with arbitrary training variations. You can accumulate the gradients over multiple batches before calling the optimizer, call the `backprop` callback multiple times (or not at all if the update is small), and inject arbitrary code to change or report gradients for particular layers. The implementation is quite transparent, so you'll find it easy to implement such arbitrary modifications if you need to. ## Batching {#batching} A "minibatch" (or simply "batch" – we use the terms interchangeably) is just a group of samples that you update or predict over together. Batching the data is very important: most neural network models converge much faster and achieve better accuracy when the gradients are calculated using multiple samples. Thinc implements two batching helpers via the backend object [`Ops`](/docs/api-backend#ops), typically used via `model.ops`. They should cover the most common batching needs for training and evaluation. 1. [`minibatch`](/docs/api-backends#minibatch): Iterate slices from a sequence, optionally shuffled. 2. [`multibatch`](/docs/api-backends#multibatch): Minibatch one or more sequences and yield lists with one batch per sequence. ```python ### Example batches = model.ops.minibatch(128, data, shuffle=True) batches = model.ops.multibatch(128, train_X, train_Y, shuffle=True) ``` The batching methods take sequences of data and process them as a stream. They return a [`SizedGenerator`](/docs/api-types#sizedgenerator), a simple custom dataclass for generators that has a `__len__` and can repeatedly call the generator function. This also means that the batching works nicely with progress bars like [`tqdm`](https://github.com/tqdm/tqdm) and similar tools out-of-the-box. ```python ### With progress bar {highlight="1,4"} from tqdm import tqdm data = model.ops.multibatch(128, train_X, train_Y, shuffle=True) for X, Y in tqdm(data, leave=False): Yh, backprop = model.begin_update(X) ``` [`SizedGenerator`](/docs/api-types#sizedgenerator) objects hold a reference to the generator function and **call it repeatedly**, i.e. every time the sized generator is executed. This also means that the sized generator is **never consumed**. If you like, you can define it once outside your training loop, and on each iteration, the data will be **rebatched and reshuffled**. ```python ### Option 1 for i in range(10): for X, Y in model.ops.multibatch(128, train_X, train_Y, shuffle=True): # Update the model here for X, Y in model.ops.multibatch(128, dev_X, dev_Y): # Evaluate the model here ``` ```python ### Option 2 train_data = model.ops.multibatch(128, train_X, train_Y, shuffle=True) dev_data = model.ops.multibatch(128, dev_X, dev_Y) for i in range(10): for X, Y in train_data: # Update the model here for X, Y in dev_data: # Evaluate the model here ``` The `minibatch` and `multibatch` methods also support a `buffer` argument, which may be useful to promote better parallelism. If you're using an engine that supports asynchronous execution, such as PyTorch or [JAX](https://github.com/google/jax), an unbuffered stream could cause the engine to block unnecessarily. If you think this may be a problem, try setting a higher buffer, e.g. `buffer=500`, and see if it solves the problem. You could also simply consume the entire generator, by calling `list()` on it. Finally, `minibatch` and `multibatch` support **variable length batching**, based on a schedule you can provide as the `batch_size` argument. Simply pass in an iterable. Variable length batching is non-standard, but we regularly use it for some of [spaCy](https://spacy.io)'s models, especially the parser and entity recognizer. ```python from thinc.api import compounding batch_size = compounding(1.0, 16.0, 1.001) train_data = model.ops.multibatch(batch_size, train_X, train_Y, shuffle=True) ``` ![](images/schedules_custom2.svg) ```ini ### config {small="true"} [batch_size] @schedules = "compounding.v1" start = 1.0 stop = 16.0 compound = 1.001 ``` ```python ### Usage {small="true"} from thinc.api import Config, registry config = Config().from_str("./config.cfg") resolved = registry.resolve(config) batch_size = resolved["batch_size"] ``` --- ## Evaluation {#evaluation} Thinc does not provide utilities for calculating accuracy scores over either individual samples or whole datasets. In most situations, you will make a loop over batches of your inputs and targets, **calculate the accuracy** on the batch of data, and then **keep a tally of the scores**. ```python def evaluate(model, batch_size, Xs, Ys): correct = 0. total = 0. for X, Y in model.ops.multibatch(batch_size, Xs, Ys): correct += (model.predict(X).argmax(axis=0) == Y.argmax(axis=0)).sum() total += X.shape[0] return correct / total ``` During evaluation, take care to run your model **in a prediction context** (as opposed to a training context), by using either the [`Model.predict`](/docs/api-model#predict) method, or by passing the `is_train=False` flag to [`Model.__call__`](/docs/api-model#call). Some layers may behave differently during training and prediction in order to provide regularization. Dropout layers are the most common example. --- ## Loss calculators {#losses} When training your Thinc models, the most important loss calculation is not a scalar loss, but rather the **gradient of the loss with respect to your model output**. That's the figure you have to pass into the backprop callback. You actually don't need to calculate the scalar loss at all, although it's often helpful as a diagnostic statistic. Thinc provides a few [helpers for common loss functions](/docs/api-losses). Each helper is provided as a class, so you can pass in any settings or hyperparameters that your loss might require. The helper class can be used as a callable object, in which case it will return both the scalar loss and the gradient of the loss with respect to the outputs. You can also call the `get_grad` method to just get the gradients, or the `get_loss` method to just get the scalar loss. ```python ### Example {small="true"} from thinc.api import CategoricalCrossentropy loss_calc = CategoricalCrossentropy() grad, loss = loss_calc(guesses, truths) ``` ```ini ### config.cfg {small="true"} [loss] @losses = "CategoricalCrossentropy.v1" normalize = true ``` --- ## Setting learning rate schedules {#schedules} A common trick for stochastic gradient descent is to **vary the learning rate or other hyperparameters** over the course of training. Since there are many possible ways to vary the learning rate, Thinc lets you implement hyperparameter schedules as instances of the [`Schedule`](/docs/api-schedules#schedule) class. Thinc also provides a number of [popular schedules](/docs/api-schedules) built-in. You can use schedules directly, by calling the schedule with the `step` keyword argument and using it to update hyperparameters in your training loop. Since schedules are particularly common for optimization settings, the [`Optimizer`](/docs/api-optimizer) object accepts floats, lists, iterators, and [`Schedule`](/docs/api-schedules#schedule) instances for most of its parameters. When you call [`Optimizer.step_schedules`](/docs/api-optimizer#step_schedules), the optimizer will increase its step count and pass it to the schedules. For instance, this is how one creates an instance of the `Adam` optimizer with a custom learning rate schedule: ```python ### Custom learning rate schedule from thinc.api import Adam, Schedule def cycle(): values = [0.001, 0.01, 0.1] all_values = values + list(reversed(values)) return Schedule("cycle", _cycle_schedule, attrs={"all_values": all_values}) def _cycle_schedule(schedule: Schedule, step: int, **kwargs) -> float: all_values = schedule.attrs["all_values"] return all_values[step % len(all_values)] optimizer = Adam(learn_rate=cycle()) assert optimizer.learn_rate(optimizer.step) == 0.001 optimizer.step_schedules() assert optimizer.learn_rate(optimizer.step) == 0.01 optimizer.step_schedules() assert optimizer.learn_rate(optimizer.step) == 0.1 ``` ![](images/schedules_custom1.svg) You'll often want to describe your optimization schedules in your configuration file. That's also very easy: you can use the [`@thinc.registry.schedules`](/docs/api-config#registry) decorator to register your function, and then refer to it in your config as the `learn_rate` argument of the optimizer. Check out the [documentation on config files](/docs/usage-config) for more examples. ```python ### Registered function {small="true"} @thinc.registry.schedules("cycle.v1") def cycle(values): all_values = values + list(reversed(values)) return Schedule("cycle", _cycle_schedule, attrs={"all_values": all_values}) def _cycle_schedule(schedule: Schedule, step: int, **kwargs) -> float: all_values = schedule.attrs["all_values"] return all_values[step % len(all_values)] ``` ```ini ### config.cfg {small="true"} [optimizer] @optimizers = "Adam.v1" [optimizer.learn_rate] @schedules = "cycle.v1" values = [0.001, 0.01, 0.1] ``` --- ## Distributed training {#distributed} We expect to recommend [Ray](https://ray.io/) for distributed training. Ray offers a clean and simple API that fits well with Thinc's model design. Full support is still under development. thinc-release-v9.1.1/website/docs/usage-type-checking.md000066400000000000000000000467661467064331700232410ustar00rootroot00000000000000--- title: Type Checking teaser: Static type checking and real-time linting for neural network code next: /docs/api-model --- By this point you've probably seen that **Thinc** uses the new Python 3.6+ syntax for [**type hints**](https://docs.python.org/3/library/typing.html) or "type annotations". All the code base is type-annotated and it is recommended that you add at least **some types to your own code**, too. Type annotations can make your numeric code much more explicit, making it easier to come back to later. Type annotations also allow your editor (and many other tools) to perform **type checks** _before_ executing your code. They also power **autocompletion**. For example, if you try to add a `str` and an `int`, your editor will probably warn you that it is an invalid operation, without having to wait until you run the invalid code. It may also tell you that a function expects a `float`, so you don't pass it an invalid type. If your layer is typed as `Model[Floats2d, Ints1d]`, Thinc can tell you if its inputs and outputs are incompatible with the rest of your network. Thinc's type-system won't catch every error. It has no representation for the sizes of your dimensions, so a lot of invalid operations can't be detected until runtime. Sometimes the syntax gets quite ugly, and the error messages are often frustratingly opaque. Nevertheless, we do recommend you try it out, especially for your model definitions and the functions you're registering for the config system. ## Installation and setup {#install} [`mypy`](https://mypy.readthedocs.io/en/stable/) is the "standard" type checker for Python, in fact, that's where these new Python type hints were born. You can install `mypy` from pip or conda. If you use a virtual environment for your project, make sure that you install it in the same environment. ```bash ### pip {small="true"} $ pip install mypy ``` ```bash ### conda {small="true"} $ conda install -c conda-forge mypy ``` Thinc comes with a `mypy` plugin that **extends the normal functionality** to perform additional type checks in code using Thinc. If you installed Thinc, you already have the plugin. To enable the Thinc plugin for `mypy` you just have to create a file `mypy.ini` within your project folder. This will tell `mypy` to use the plugin in the module `thinc.mypy`. If you use [`pydantic`](https://github.com/samuelcolvin/pydantic) for [advanced configuration](/docs/usage-config#advanced-types), you can also enable `pydantic`'s plugin. If you're using Thinc as part of your Python package, you can also add the `[mypy]` section to your package's `setup.cfg`. ```ini ### mypy.ini {small="true"} [mypy] plugins = thinc.mypy ``` ```ini ### mypy.ini {small="true"} [mypy] plugins = thinc.mypy, pydantic.mypy ``` To type check a file or directory, you can now use the `mypy` command: ```bash $ mypy my_file.py ``` ### Setting up linting in your editor {#linting} Real-time linting is especially powerful, as it lets you type-check your code as it leaves your fingers. This often lets you catch errors in their original context, when they're least confusing. It can also save you trips to the documentation. ![Screenshot of mypy linting in Visual Studio Code](images/type_checking2.jpg) | | | | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Visual Studio Code** | If you use [Visual Studio Code](https://code.visualstudio.com/), make sure you install the [Python extension](https://code.visualstudio.com/docs/python/python-tutorial#_install-visual-studio-code-and-the-python-extension). Then select the appropriate [environment](https://code.visualstudio.com/docs/python/environments) in your editor. If you installed `mypy` in the same environment and select it in your editor, after adding the `mypy.ini` file (as described above) everything should work. | | **PyCharm** | If you use [PyCharm](https://www.jetbrains.com/pycharm/), make sure you [configure the Python Interpreter](https://www.jetbrains.com/help/pycharm/configuring-python-interpreter.html) for your project. Then [install](https://www.jetbrains.com/help/pycharm/managing-plugins.html) the ["Mypy" plugin](https://plugins.jetbrains.com/plugin/11086-mypy). You may also want to install the ["Mypy ​(Official)" plugin](https://plugins.jetbrains.com/plugin/13348-mypy-official-/). If you installed `mypy` in the same environment/interpreter, after adding the `mypy.ini` file (as described above) and installing the plugin, everything should work. | | **Other editors** | See the [`mypy` docs](https://github.com/python/mypy#ide-linter-integrations-and-pre-commit) for instructions for other editors like Vim, Emacs, Sublime Text and Atom. | To make sure everything is set up correctly, try opening the [`type_checking.py` example](https://github.com/explosion/thinc/blob/master/examples/type_checking.py) script in your editor, or run `mypy type_checking.py` on the command line. You should see several type errors as indicated in the code comments, including errors specific to Thinc. ## Static type checking {#static-type-checking} "Static type checking" means that your editor (or other tools) will check the code using the declared types _before_ running it. Because it is done before running the code, it's called "static". The contrary would be "dynamic" type checking, where checks are performed _at runtime_, while the program is running and the code is being executed. (Thinc also does [runtime validation](/docs/usage-models#validation) by the way!) As editors and similar tools can't just randomly run your code to verify that it's correct, we have these type annotations to help editors check the code and **provide autocompletion**. Even if you never run a type-checker, adding type-annotations to your code can greatly **improve its readability**. Multi-dimensional array libraries like numpy make it easy to write terse, fairly general code – but when you revisit the code later, it's often very hard to figure out what's happening without executing the code and debugging. ```python ### No types def do_things(A, B): A = A.reshape(A.shape + (B.shape[-1],)) A = A.sum(axis=-1) # Is this last line an error? Maybe they wanted axis=-1? return (B * A).sum() ``` ```python ### Types def do_things(A: Floats2d, B: Floats3d) -> float: A = A.reshape(A.shape + (B.shape[-1],)).sum(axis=-1) # Ah, the function says it returns float --- so this all makes sense. return (B * A).sum() ``` Type annotations provide a relatively concise way to **document** some of the most important information about your code. The same information can be provided in comments, but unless you use a consistent syntax, your type comments will probably be much longer and more distracting than the equivalent annotations. Another advantage of type annotations as documentation is that they can be **queried for more detail**, while with comments, you have to choose the level of detail to provide up-front. Thinc's type annotations take into account `numpy`'s tricky indexing system, and also the semantics of the different reduction operations as different arguments are passed in. This makes it much easier to follow along with steps that might have felt obvious to the author of the code. ```python ### Array shape types from thinc.types import Floats3d, Ints1d def numpy_shapes_pop_quiz(arr1: Floats3d, indices: Ints1d): # How many dimensions do each of these arrays have? q1 = arr1[0] q2 = arr1.mean() q3 = arr1[1:, 0] q4 = arr1[1:, :-1] q5 = arr1.sum(axis=0) q6 = arr1[1:, ..., :-1] q7 = arr1.sum(axis=(0, 1), keepdims=True) q8 = arr1[indices].cumsum() q9 = arr1[indices[indices]].ptp(axis=(-2, -1)) # Run mypy over the snippet to find out your score! reveal_type(q1) reveal_type(q2) reveal_type(q3) reveal_type(q4) reveal_type(q5) reveal_type(q6) reveal_type(q7) reveal_type(q8) reveal_type(q9) ``` [`reveal_type`](https://mypy.readthedocs.io/en/stable/cheat_sheet_py3.html#when-you-re-puzzled-or-when-things-are-complicated) is a "magic" function that `mypy` detects to log the type of a variable. You don't need to import it, it's global. It doesn't exist in Python, only in `mypy`. If you try to run the code using `reveal_type()` with Python it won't work. --- ## Using Thinc's custom types in your code {#custom-types} ### Array types {#array-types} Thinc relies heavily on the `numpy.ndarray` interface, which was not designed with type checking or type annotations in mind. The `numpy` API is extremely polymorphic, with most common operations returning a variety of output types depending on what combination of arguments are provided. Retrofitting a type system to the interface will always involve some compromise between "correctness" (whether the type-system approves all and only valid numpy code) and "type sanity": whether the type-system is able to infer useful types, so you can catch more bugs with less detailed annotations. Thinc's array types are like the classes from the built-in `typing` module: they are **not runtime types**. You will not create instances of them. You'll only use them with type declarations. This means you can use the same annotations for a number of classes that behave similarly, regardless of their inheritance relationships. While official type-annotations for numpy will likely have to lean towards correctness, Thinc has the luxury of **leaning heavily towards type-sanity**. We accept a few usage limitations, offer type-specific options for a few common operations ([array allocation](/docs/api-backends#alloc), [reshaping](/docs/api-backends#reshape) and [conversion](/docs/api-backends#asarray)), and declare a few usage patterns off-limits (such as passing `dtype` into many methods or functions). | | | | ---------------------------------------------------------- | -------------------------------------------------- | | `Floats1d`, `Floats2d`, `Floats3d`, `Floats4d`, `FloatsXd` | 1d, 2d, 3d, 4d and any-d arrays of floats. | | `Ints1d`, `Ints2d`, `Ints3d`, `Ints4d`, `IntsXd` | 1d, 2d, 3d, 4d and any-d arrays of ints. | | `Array1d`, `Array2d`, `Array3d`, `Array4d`, `ArrayXd` | 1d, 2d, 3d, 4d and any-d arrays of floats or ints. | We also compromise on how much detail the type-system can be expected to represent, setting on two useful distinctions: **broad data type** (ints vs. floats), and **number of dimensions** (1, 2, 3, 4, and many) – so we have 10 array subtypes in total. Notably, our type-system does not specify actual array shapes. Representing the shapes as well would be fantastic, but it would make the system far more verbose, complex and difficult to work with. ### Generic Model types {#model-types} Thinc also makes use of type-annotations for its model class, by making it a **[generic](https://docs.python.org/3/library/typing.html#generics) with two type parameters**, representing the **layer's input and output types**. Generics let you tell the type-system a little bit more information on a per-instance basis. For instance, the `typing.List` class is a generic: you can write `List[int]` to denote a list of integers, and `List[str]` to denote a list of strings. This helps you declare your interfaces more precisely, and lets the type-system infer types when you later loop over the list, all without having to declare your own subclass. Type-parameters for generics are written between square brackets, and are comma-delimited like function arguments. So to specify that a model takes a list of strings as input and produces a two-dimensional array of integers as output, you would write `Model[List[str], Ints2d]`. You can also under-specify either or both arguments, by writing e.g. `Model[Any, Any]`, `Model[Any, Ints2d]`, etc. If you specify simply `Model`, that is read as syntactic sugar for `Model[Any, Any]`. A common problem at first is that it feels natural to write simply `Model` for code that should be agnostic to input and output types. This generally works as an input annotation, but if you use it as a return type you'll often have problems. ```python ### Sane but wrong {small="true"} def pop_layer(model: Model) -> Model: model.layers.pop(0) return model ``` ```python ### Thanks, I hate it {small="true"} from typing import TypeVar _T = TypeVar("_T", bound=Model) def pop_layer(model: _T) -> _T: model.layers.pop(0) return model ``` The problem is that you need a way to note that the model your function is returning is of the same type as your function's argument. The [`typing.TypeVar`](https://docs.python.org/3/library/typing.html#typing.TypeVar) class provides a (syntactically awkward) solution: if you use the same `TypeVar` in your method definition, that will denote that the **two variables must have the same type**. However, the scoping behavior is very surprising: you can use the same `TypeVar` in _different_ function definitions, and it _won't_ bind the types between them. The behavior with respect to classes and generics is also quite subtle, and mostly left as an exercise to the reader by [the official documentation](https://docs.python.org/3/library/typing.html#typing.TypeVar). Although `TypeVar` will make your days a little bit worse, they are often necessary, and we suggest making peace with having to use them. However, in some situations you can instead use the [`@overload` decorator](https://docs.python.org/3/library/typing.html#typing.overload). This alternative will work whenever you can enumerate a small number of specific types. The `@overload` decorator lets you describe multiple input type to return type mappings for your function, without actually changing the return-type dispatch. It's also more flexible than `TypeVar`s in many situations, as you can express more subtle relationships. We use `@overload` extensively in our array definitions, to represent numpy's polymorphic behavior, so you can find some more complex examples of `@overload` in the `thinc.types` module. ```python ### Type logic with overload @overload def toggle_types(hello: str) -> int: ... @overload def toggle_types(hello: int) -> str: ... def toggle_types(hello: Union[str, int]) -> Union[str, int]: return 1 if isinstance(hello, str) else "hello" ``` ## Tips, tricks & best practices {#tips} - If you're just starting out with type annotations, try just using them in your model-building functions. The type annotations can help you plan your model "top down", so you can see when things aren't lining up even without running the type checker. - If you're using the [`@registry` decorator](/docs/usage-config#registry) to register functions for the config system, you probably want to add type annotations to your declaration. This lets the config system validate the arguments, which can catch a lot of errors. - Writing type-checked code invites slightly different conventions. You'll often want to split interfaces up into several functions, so that the types are a bit more specific. For instance, we made separate [`alloc2f`, `alloc2i`, `alloc3f` etc.](/docs/api-backends#alloc) methods on the `Ops` object, because these return specific types. We only use the generic one for generic code, where the desired type is unknown. - Instead of nested Python containers, try using the [`@dataclass`](https://docs.python.org/3/library/dataclasses.html) decorator to create small, behavior-less struct-like classes. You would have to create a name for the nested format anyway, so it may as well be a useful type. - It sometimes helps to think of the type-checker as trying to _falsify_ your code, rather than trying to _validate_ it. For instance, if you're looking at a particular piece of code, you might see that the variable passed into your function is of a certain type, and the type-checker knows that – so why does it raise a problem in the function? The answer is that the checker is thinking about _any possible_ input value, according to the type declarations. thinc-release-v9.1.1/website/gatsby-browser.js000066400000000000000000000007721467064331700214260ustar00rootroot00000000000000exports.onRouteUpdate = ({ location }) => { // Fix anchor links, especially if links are opened in new tab if (location.hash) { setTimeout(() => { const el = document.querySelector(`${location.hash}`) if (el) { // Navigate to targeted element el.scrollIntoView() // Force recomputing :target pseudo class with pushState/popState window.location.hash = location.hash } }, 0) } } thinc-release-v9.1.1/website/gatsby-config.js000066400000000000000000000055721467064331700212130ustar00rootroot00000000000000const meta = require('./meta.json') const autoprefixer = require('autoprefixer') const fs = require('fs') const plugins = [ { resolve: `gatsby-plugin-sass`, options: { postCssPlugins: [autoprefixer()], cssLoaderOptions: { localIdentName: process.env.NODE_ENV == 'development' ? '[name]-[local]-[hash:8]' : '[hash:8]', }, }, }, `gatsby-plugin-react-helmet`, { resolve: `gatsby-source-filesystem`, options: { name: `content`, path: `${__dirname}/docs`, }, }, { resolve: `gatsby-source-filesystem`, options: { name: `images`, path: `${__dirname}/src/images`, }, }, { resolve: 'gatsby-plugin-react-svg', options: { rule: { include: /src\/images\/(.*)\.svg/, }, }, }, { resolve: `gatsby-transformer-remark`, options: { plugins: [ `gatsby-remark-copy-linked-files`, `gatsby-remark-unwrap`, { resolve: `gatsby-remark-images`, options: { maxWidth: 790, linkImagesToOriginal: true, showCaptions: true, quality: 80, withWebp: { quality: 80 }, backgroundColor: 'transparent', disableBgImageOnAlpha: true, loading: 'lazy', }, }, `gatsby-remark-custom-attrs`, `gatsby-remark-code-blocks`, { resolve: `gatsby-remark-smartypants`, options: { dashes: 'oldschool', }, }, ], }, }, `gatsby-transformer-sharp`, `gatsby-plugin-sharp`, `gatsby-plugin-sitemap`, { resolve: `gatsby-plugin-manifest`, options: { name: meta.title, short_name: meta.title, start_url: `/`, background_color: meta.theme, theme_color: meta.theme, display: `minimal-ui`, icon: `src/images/icon.png`, }, }, { resolve: `gatsby-plugin-plausible`, options: { domain: meta.domain, }, }, `gatsby-plugin-offline`, ] plugins.push({ resolve: `gatsby-plugin-sass-resources`, options: { resources: ['./src/styles/base.sass'], }, }) if (fs.existsSync('./src/fonts')) { plugins.push({ resolve: `gatsby-plugin-sass-resources`, options: { resources: ['./src/styles/fonts.sass'], }, }) } module.exports = { siteMetadata: meta, plugins, } thinc-release-v9.1.1/website/gatsby-node.js000066400000000000000000000042321467064331700206630ustar00rootroot00000000000000const path = require('path') const { createFilePath } = require('gatsby-source-filesystem') const pageTemplate = path.resolve('src/templates/docs.js') function replacePath(pagePath) { return pagePath === `/` ? pagePath : pagePath.replace(/\/$/, ``) } exports.onCreatePage = ({ page, actions }) => { const { createPage, deletePage } = actions const oldPage = Object.assign({}, page) if (oldPage.path != '/dev-404-page/') { page.path = replacePath(page.path) if (page.path !== oldPage.path) { deletePage(oldPage) createPage(page) } } } exports.onCreateNode = ({ node, actions, getNode }) => { const { createNodeField } = actions if (node.internal.type === 'MarkdownRemark') { const slug = createFilePath({ node, getNode, basePath: 'docs', trailingSlash: false }) createNodeField({ name: 'slug', node, value: `/docs${slug}` }) } } exports.createPages = ({ actions, graphql }) => { const { createPage } = actions return graphql(` { allMarkdownRemark { edges { node { frontmatter { title } fields { slug } } } } } `).then(result => { if (result.errors) { return Promise.reject(result.errors) } const posts = result.data.allMarkdownRemark.edges posts.forEach(({ node }) => { createPage({ path: replacePath(node.fields.slug), component: pageTemplate, context: { slug: node.fields.slug, }, }) }) }) } exports.onCreateWebpackConfig = ({ stage, actions, getConfig }) => { const config = getConfig() const miniCssExtractPlugin = config.plugins.find( plugin => plugin.constructor.name === 'MiniCssExtractPlugin' ) if (miniCssExtractPlugin) { miniCssExtractPlugin.options.ignoreOrder = true } actions.replaceWebpackConfig(config) } thinc-release-v9.1.1/website/meta.json000066400000000000000000000047571467064331700177460ustar00rootroot00000000000000{ "title": "Thinc", "slogan": "A refreshing functional take on deep learning", "description": "Thinc is a lightweight type-checked deep learning library for composing models, with support for layers defined in frameworks like PyTorch and TensorFlow.", "siteUrl": "https://thinc.ai", "domain": "thinc.ai", "twitter": "explosion_ai", "github": "explosion/thinc", "email": "contact@explosion.ai", "company": "Explosion", "companyUrl": "https://explosion.ai", "imprintUrl": "https://explosion.ai/legal", "theme": "#291e56", "sidebar": [ { "label": "Get started", "items": [ { "text": "Introduction", "url": "/docs/" }, { "text": "Concept & Design", "url": "/docs/concept" }, { "text": "Installation & Setup", "url": "/docs/install" }, { "text": "Examples & Tutorials", "url": "https://github.com/explosion/thinc/#-selected-examples-and-notebooks" }, { "text": "Backprop 101", "url": "/docs/backprop101" } ] }, { "label": "Usage", "items": [ { "text": "Configuration System", "url": "/docs/usage-config" }, { "text": "Defining & Using Models", "url": "/docs/usage-models" }, { "text": "Training Models", "url": "/docs/usage-training" }, { "text": "PyTorch, TensorFlow etc.", "url": "/docs/usage-frameworks" }, { "text": "Variable-length Sequences", "url": "/docs/usage-sequences" }, { "text": "Type Checking", "url": "/docs/usage-type-checking" } ] }, { "label": "API", "items": [ { "text": "Model", "url": "/docs/api-model" }, { "text": "Layers", "url": "/docs/api-layers" }, { "text": "Optimizers", "url": "/docs/api-optimizers" }, { "text": "Initializers", "url": "/docs/api-initializers" }, { "text": "Schedules", "url": "/docs/api-schedules" }, { "text": "Losses", "url": "/docs/api-loss" }, { "text": "Config & Registry", "url": "/docs/api-config" }, { "text": "Types & Dataclasses", "url": "/docs/api-types" }, { "text": "Backends & Math", "url": "/docs/api-backends" }, { "text": "Utilities & Extras", "url": "/docs/api-util" } ] } ] } thinc-release-v9.1.1/website/package-lock.json000066400000000000000000075610241467064331700213430ustar00rootroot00000000000000{ "name": "thinc.ai", "version": "0.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "thinc.ai", "version": "0.0.1", "dependencies": { "@tippy.js/react": "^2.2.2", "autoprefixer": "^10.4.13", "classnames": "^2.2.6", "gatsby": "^4.18.2", "gatsby-image": "^2.11.0", "gatsby-plugin-google-analytics": "^4.25.0", "gatsby-plugin-manifest": "^4.25.0", "gatsby-plugin-offline": "^5.25.0", "gatsby-plugin-plausible": "^0.0.7", "gatsby-plugin-react-helmet": "^5.25.0", "gatsby-plugin-react-svg": "^3.3.0", "gatsby-plugin-remove-trailing-slashes": "^4.19.0", "gatsby-plugin-sass": "^5.25.0", "gatsby-plugin-sass-resources": "^3.0.1", "gatsby-plugin-sharp": "^4.25.0", "gatsby-plugin-sitemap": "^5.25.0", "gatsby-remark-copy-linked-files": "^5.25.0", "gatsby-remark-images": "^6.25.0", "gatsby-remark-prismjs": "^6.25.0", "gatsby-remark-smartypants": "^5.25.0", "gatsby-remark-unwrap-images": "^1.0.2", "gatsby-source-filesystem": "^4.25.0", "gatsby-transformer-remark": "^5.25.1", "gatsby-transformer-sharp": "^4.25.0", "html-to-react": "^1.3.4", "parse-numeric-range": "0.0.2", "prismjs": "^1.15.0", "react": "^16.8.2", "react-dom": "^16.8.2", "react-helmet": "^5.2.0", "react-jss": "^8.6.1", "rehype-react": "^3.1.0", "remark-react": "^5.0.1", "slugify": "^1.3.6" }, "devDependencies": { "babel-cli": "^6.26.0", "babel-core": "^6.26.0", "babel-plugin-transform-class-properties": "^6.24.1", "babel-plugin-transform-decorators-legacy": "^1.3.4", "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-plugin-transform-react-remove-prop-types": "^0.4.13", "babel-preset-env": "^1.6.1", "babel-preset-react": "^6.24.1", "json5": "^2.1.0", "md-attr-parser": "^1.2.1", "prettier": "^1.16.4", "unist-util-remove": "^1.0.3", "unist-util-visit": "^1.4.0" }, "engines": { "node": "16" } }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@ardatan/relay-compiler": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz", "integrity": "sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==", "dependencies": { "@babel/core": "^7.14.0", "@babel/generator": "^7.14.0", "@babel/parser": "^7.14.0", "@babel/runtime": "^7.0.0", "@babel/traverse": "^7.14.0", "@babel/types": "^7.0.0", "babel-preset-fbjs": "^3.4.0", "chalk": "^4.0.0", "fb-watchman": "^2.0.0", "fbjs": "^3.0.0", "glob": "^7.1.1", "immutable": "~3.7.6", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "relay-runtime": "12.0.0", "signedsource": "^1.0.0", "yargs": "^15.3.1" }, "bin": { "relay-compiler": "bin/relay-compiler" }, "peerDependencies": { "graphql": "*" } }, "node_modules/@ardatan/relay-compiler/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@ardatan/relay-compiler/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@ardatan/relay-compiler/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dependencies": { "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { "version": "7.20.10", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.20.12", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.20.7", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-module-transforms": "^7.20.11", "@babel/helpers": "^7.20.7", "@babel/parser": "^7.20.7", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.12", "@babel/types": "^7.20.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" } }, "node_modules/@babel/core/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/@babel/core/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/eslint-parser": { "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", "semver": "^6.3.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || >=14.0.0" }, "peerDependencies": { "@babel/core": ">=7.11.0", "eslint": "^7.5.0 || ^8.0.0" } }, "node_modules/@babel/eslint-parser/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", "dependencies": { "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/generator/node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "bin": { "jsesc": "bin/jsesc" }, "engines": { "node": ">=4" } }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "dependencies": { "@babel/helper-explode-assignable-expression": "^7.18.6", "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "dependencies": { "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.20.12", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "regexpu-core": "^5.2.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "bin": { "jsesc": "bin/jsesc" } }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/regexpu-core": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", "regjsgen": "^0.7.1", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { "node": ">=4" } }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/regjsgen": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==" }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dependencies": { "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" }, "peerDependencies": { "@babel/core": "^7.4.0-0" } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-explode-assignable-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "dependencies": { "@babel/template": "^7.18.10", "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", "dependencies": { "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.10", "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-wrap-function": "^7.18.9", "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-replace-supers": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.7", "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dependencies": { "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dependencies": { "@babel/types": "^7.20.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.19.4", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "dependencies": { "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", "@babel/traverse": "^7.20.5", "@babel/types": "^7.20.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", "dependencies": { "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.7", "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/@babel/parser": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", "bin": { "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-proposal-optional-chaining": "^7.20.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.13.0" } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-class-static-block": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "node_modules/@babel/plugin-proposal-dynamic-import": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-json-strings": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "dependencies": { "@babel/compat-data": "^7.20.5", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.20.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-chaining": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.20.5", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-flow": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", "dependencies": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz", "integrity": "sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-classes": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-classes/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { "node": ">=4" } }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/template": "^7.20.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-flow-strip-types": { "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz", "integrity": "sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg==", "dependencies": { "@babel/helper-plugin-utils": "^7.19.0", "@babel/plugin-syntax-flow": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.18.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dependencies": { "@babel/helper-compilation-targets": "^7.18.9", "@babel/helper-function-name": "^7.18.9", "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-literals": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", "dependencies": { "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", "dependencies": { "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-simple-access": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-identifier": "^7.19.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dependencies": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.20.5", "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-replace-supers": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-display-name": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz", "integrity": "sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-jsx-development": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", "dependencies": { "@babel/plugin-transform-react-jsx": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "regenerator-transform": "^0.15.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-regenerator/node_modules/regenerator-transform": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.19.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", "dependencies": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.19.0", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-typescript": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.7.tgz", "integrity": "sha512-m3wVKEvf6SoszD8pu4NZz3PvfKRCMgk6D6d0Qi9hNnlM5M6CFS92EgF4EiHVLKbU0r/r7ty1hg7NPZwE7WRbYw==", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-typescript": "^7.20.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-env": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", "dependencies": { "@babel/compat-data": "^7.20.1", "@babel/helper-compilation-targets": "^7.20.0", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", "@babel/plugin-proposal-async-generator-functions": "^7.20.1", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-json-strings": "^7.18.6", "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", "@babel/plugin-proposal-object-rest-spread": "^7.20.2", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.18.6", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.20.0", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.20.2", "@babel/plugin-transform-classes": "^7.20.2", "@babel/plugin-transform-computed-properties": "^7.18.9", "@babel/plugin-transform-destructuring": "^7.20.2", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", "@babel/plugin-transform-for-of": "^7.18.8", "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.19.6", "@babel/plugin-transform-modules-commonjs": "^7.19.6", "@babel/plugin-transform-modules-systemjs": "^7.19.6", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.20.1", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", "@babel/plugin-transform-spread": "^7.19.0", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.20.2", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", "core-js-compat": "^3.25.1", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-env/node_modules/core-js-compat": { "version": "3.27.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.1.tgz", "integrity": "sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==", "dependencies": { "browserslist": "^4.21.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-modules": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-react": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-transform-react-display-name": "^7.18.6", "@babel/plugin-transform-react-jsx": "^7.18.6", "@babel/plugin-transform-react-jsx-development": "^7.18.6", "@babel/plugin-transform-react-pure-annotations": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-typescript": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-transform-typescript": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/runtime": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", "dependencies": { "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.7.tgz", "integrity": "sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg==", "dependencies": { "core-js-pure": "^3.25.1", "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3/node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/@babel/runtime/node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/@babel/template": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { "version": "7.20.12", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/@babel/traverse/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { "node": ">=4" } }, "node_modules/@babel/traverse/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/types": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "dependencies": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types/node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "engines": { "node": ">=4" } }, "node_modules/@builder.io/partytown": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/@builder.io/partytown/-/partytown-0.5.4.tgz", "integrity": "sha512-qnikpQgi30AS01aFlNQV6l8/qdZIcP76mp90ti+u4rucXHsn4afSKivQXApqxvrQG9+Ibv45STyvHizvxef/7A==", "bin": { "partytown": "bin/partytown.cjs" } }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.1.1", "espree": "^7.3.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/@eslint/eslintrc/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.19.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@eslint/eslintrc/node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "engines": { "node": ">= 4" } }, "node_modules/@eslint/eslintrc/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@gatsbyjs/parcel-namer-relative-to-cwd": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@gatsbyjs/parcel-namer-relative-to-cwd/-/parcel-namer-relative-to-cwd-1.10.0.tgz", "integrity": "sha512-JSiOxG2SD64joKfcCOdujIpqmhs+k5Ic1sO/hQ83EVF6G9DJJTf8n12rGb2rzPb00TFT4ldb/nWxQRV+kQTlPA==", "dependencies": { "@babel/runtime": "^7.18.0", "@parcel/namer-default": "2.6.2", "@parcel/plugin": "2.6.2", "gatsby-core-utils": "^3.25.0" }, "engines": { "node": ">=14.15.0", "parcel": "2.x" } }, "node_modules/@gatsbyjs/reach-router": { "version": "1.3.9", "resolved": "https://registry.npmjs.org/@gatsbyjs/reach-router/-/reach-router-1.3.9.tgz", "integrity": "sha512-/354IaUSM54xb7K/TxpLBJB94iEAJ3P82JD38T8bLnIDWF+uw8+W/82DKnQ7y24FJcKxtVmG43aiDLG88KSuYQ==", "dependencies": { "invariant": "^2.2.3", "prop-types": "^15.6.1", "react-lifecycles-compat": "^3.0.4" }, "peerDependencies": { "react": "15.x || 16.x || 17.x || 18.x", "react-dom": "15.x || 16.x || 17.x || 18.x" } }, "node_modules/@gatsbyjs/webpack-hot-middleware": { "version": "2.25.3", "resolved": "https://registry.npmjs.org/@gatsbyjs/webpack-hot-middleware/-/webpack-hot-middleware-2.25.3.tgz", "integrity": "sha512-ul17OZ8Dlw+ATRbnuU+kwxuAlq9lKbYz/2uBS1FLCdgoPTF1H2heP7HbUbgfMZbfRQNcCG2rMscMnr32ritCDw==", "dependencies": { "ansi-html-community": "0.0.8", "html-entities": "^2.3.3", "strip-ansi": "^6.0.0" } }, "node_modules/@gatsbyjs/webpack-hot-middleware/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/@gatsbyjs/webpack-hot-middleware/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/@graphql-codegen/add": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-3.2.3.tgz", "integrity": "sha512-sQOnWpMko4JLeykwyjFTxnhqjd/3NOG2OyMuvK76Wnnwh8DRrNf2VEs2kmSvLl7MndMlOj7Kh5U154dVcvhmKQ==", "dependencies": { "@graphql-codegen/plugin-helpers": "^3.1.1", "tslib": "~2.4.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/@graphql-codegen/add/node_modules/@graphql-codegen/plugin-helpers": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", "dependencies": { "@graphql-tools/utils": "^9.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.4.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/@graphql-codegen/add/node_modules/change-case-all": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", "dependencies": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } }, "node_modules/@graphql-codegen/core": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-2.6.8.tgz", "integrity": "sha512-JKllNIipPrheRgl+/Hm/xuWMw9++xNQ12XJR/OHHgFopOg4zmN3TdlRSyYcv/K90hCFkkIwhlHFUQTfKrm8rxQ==", "dependencies": { "@graphql-codegen/plugin-helpers": "^3.1.1", "@graphql-tools/schema": "^9.0.0", "@graphql-tools/utils": "^9.1.1", "tslib": "~2.4.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/@graphql-codegen/core/node_modules/@graphql-codegen/plugin-helpers": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", "dependencies": { "@graphql-tools/utils": "^9.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.4.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/@graphql-codegen/core/node_modules/change-case-all": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", "dependencies": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } }, "node_modules/@graphql-codegen/plugin-helpers": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.7.2.tgz", "integrity": "sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg==", "dependencies": { "@graphql-tools/utils": "^8.8.0", "change-case-all": "1.0.14", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.4.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/@graphql-codegen/plugin-helpers/node_modules/@graphql-tools/utils": { "version": "8.13.1", "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz", "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==", "dependencies": { "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@graphql-codegen/schema-ast": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-2.6.1.tgz", "integrity": "sha512-5TNW3b1IHJjCh07D2yQNGDQzUpUl2AD+GVe1Dzjqyx/d2Fn0TPMxLsHsKPS4Plg4saO8FK/QO70wLsP7fdbQ1w==", "dependencies": { "@graphql-codegen/plugin-helpers": "^3.1.2", "@graphql-tools/utils": "^9.0.0", "tslib": "~2.4.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/@graphql-codegen/schema-ast/node_modules/@graphql-codegen/plugin-helpers": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", "dependencies": { "@graphql-tools/utils": "^9.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.4.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/@graphql-codegen/schema-ast/node_modules/change-case-all": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", "dependencies": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } }, "node_modules/@graphql-codegen/typescript": { "version": "2.8.7", "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-2.8.7.tgz", "integrity": "sha512-Nm5keWqIgg/VL7fivGmglF548tJRP2ttSmfTMuAdY5GNGTJTVZOzNbIOfnbVEDMMWF4V+quUuSyeUQ6zRxtX1w==", "dependencies": { "@graphql-codegen/plugin-helpers": "^3.1.2", "@graphql-codegen/schema-ast": "^2.6.1", "@graphql-codegen/visitor-plugin-common": "2.13.7", "auto-bind": "~4.0.0", "tslib": "~2.4.0" }, "peerDependencies": { "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/@graphql-codegen/typescript-operations": { "version": "2.5.12", "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-2.5.12.tgz", "integrity": "sha512-/w8IgRIQwmebixf514FOQp2jXOe7vxZbMiSFoQqJgEgzrr42joPsgu4YGU+owv2QPPmu4736OcX8FSavb7SLiA==", "dependencies": { "@graphql-codegen/plugin-helpers": "^3.1.2", "@graphql-codegen/typescript": "^2.8.7", "@graphql-codegen/visitor-plugin-common": "2.13.7", "auto-bind": "~4.0.0", "tslib": "~2.4.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/@graphql-codegen/typescript-operations/node_modules/@graphql-codegen/plugin-helpers": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", "dependencies": { "@graphql-tools/utils": "^9.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.4.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/@graphql-codegen/typescript-operations/node_modules/change-case-all": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", "dependencies": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } }, "node_modules/@graphql-codegen/typescript/node_modules/@graphql-codegen/plugin-helpers": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", "dependencies": { "@graphql-tools/utils": "^9.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.4.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/@graphql-codegen/typescript/node_modules/change-case-all": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", "dependencies": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } }, "node_modules/@graphql-codegen/visitor-plugin-common": { "version": "2.13.7", "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.7.tgz", "integrity": "sha512-xE6iLDhr9sFM1qwCGJcCXRu5MyA0moapG2HVejwyAXXLubYKYwWnoiEigLH2b5iauh6xsl6XP8hh9D1T1dn5Cw==", "dependencies": { "@graphql-codegen/plugin-helpers": "^3.1.2", "@graphql-tools/optimize": "^1.3.0", "@graphql-tools/relay-operation-optimizer": "^6.5.0", "@graphql-tools/utils": "^9.0.0", "auto-bind": "~4.0.0", "change-case-all": "1.0.15", "dependency-graph": "^0.11.0", "graphql-tag": "^2.11.0", "parse-filepath": "^1.0.2", "tslib": "~2.4.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/@graphql-codegen/plugin-helpers": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", "dependencies": { "@graphql-tools/utils": "^9.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.4.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/change-case-all": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", "dependencies": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } }, "node_modules/@graphql-tools/code-file-loader": { "version": "7.3.15", "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-7.3.15.tgz", "integrity": "sha512-cF8VNc/NANTyVSIK8BkD/KSXRF64DvvomuJ0evia7tJu4uGTXgDjimTMWsTjKRGOOBSTEbL6TA8e4DdIYq6Udw==", "dependencies": { "@graphql-tools/graphql-tag-pluck": "7.4.2", "@graphql-tools/utils": "9.1.3", "globby": "^11.0.3", "tslib": "^2.4.0", "unixify": "^1.0.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@graphql-tools/graphql-tag-pluck": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.4.2.tgz", "integrity": "sha512-SXM1wR5TExrxocQTxZK5r74jTbg8GxSYLY3mOPCREGz6Fu7PNxMxfguUzGUAB43Mf44Dn8oVztzd2eitv2Qgww==", "dependencies": { "@babel/parser": "^7.16.8", "@babel/plugin-syntax-import-assertions": "7.20.0", "@babel/traverse": "^7.16.8", "@babel/types": "^7.16.8", "@graphql-tools/utils": "9.1.3", "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@graphql-tools/load": { "version": "7.8.8", "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-7.8.8.tgz", "integrity": "sha512-gMuQdO2jXmI0BNUc1MafxRQTWVMUtuH500pZAQtOdDdNJppV7lJdY6mMhITQ2qnhYDuMrcZPHhIkcftyQfkgUg==", "dependencies": { "@graphql-tools/schema": "9.0.12", "@graphql-tools/utils": "9.1.3", "p-limit": "3.1.0", "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@graphql-tools/merge": { "version": "8.3.14", "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.14.tgz", "integrity": "sha512-zV0MU1DnxJLIB0wpL4N3u21agEiYFsjm6DI130jqHpwF0pR9HkF+Ni65BNfts4zQelP0GjkHltG+opaozAJ1NA==", "dependencies": { "@graphql-tools/utils": "9.1.3", "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@graphql-tools/optimize": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-1.3.1.tgz", "integrity": "sha512-5j5CZSRGWVobt4bgRRg7zhjPiSimk+/zIuColih8E8DxuFOaJ+t0qu7eZS5KXWBkjcd4BPNuhUPpNlEmHPqVRQ==", "dependencies": { "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@graphql-tools/relay-operation-optimizer": { "version": "6.5.14", "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.14.tgz", "integrity": "sha512-RAy1fMfXig9X3gIkYnfEmv0mh20vZuAgWDq+zf1MrrsCAP364B+DKrBjLwn3D+4e0PMTlqwmqR0JB5t1VtZn2w==", "dependencies": { "@ardatan/relay-compiler": "12.0.0", "@graphql-tools/utils": "9.1.3", "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@graphql-tools/schema": { "version": "9.0.12", "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.12.tgz", "integrity": "sha512-DmezcEltQai0V1y96nwm0Kg11FDS/INEFekD4nnVgzBqawvznWqK6D6bujn+cw6kivoIr3Uq//QmU/hBlBzUlQ==", "dependencies": { "@graphql-tools/merge": "8.3.14", "@graphql-tools/utils": "9.1.3", "tslib": "^2.4.0", "value-or-promise": "1.0.11" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@graphql-tools/utils": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.1.3.tgz", "integrity": "sha512-bbJyKhs6awp1/OmP+WKA1GOyu9UbgZGkhIj5srmiMGLHohEOKMjW784Sk0BZil1w2x95UPu0WHw6/d/HVCACCg==", "dependencies": { "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", "deprecated": "Moved to 'npm install @sideway/address'" }, "node_modules/@hapi/bourne": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", "deprecated": "This version has been deprecated and is no longer supported or maintained" }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, "node_modules/@hapi/joi": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", "deprecated": "Switch to 'npm install joi'", "dependencies": { "@hapi/address": "2.x.x", "@hapi/bourne": "1.x.x", "@hapi/hoek": "8.x.x", "@hapi/topo": "3.x.x" } }, "node_modules/@hapi/joi/node_modules/@hapi/hoek": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", "deprecated": "This version has been deprecated and is no longer supported or maintained" }, "node_modules/@hapi/joi/node_modules/@hapi/topo": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", "deprecated": "This version has been deprecated and is no longer supported or maintained", "dependencies": { "@hapi/hoek": "^8.3.0" } }, "node_modules/@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dependencies": { "@hapi/hoek": "^9.0.0" } }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", "minimatch": "^3.0.4" }, "engines": { "node": ">=10.10.0" } }, "node_modules/@humanwhocodes/config-array/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/@humanwhocodes/config-array/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dependencies": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.17", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@lezer/common": { "version": "0.15.12", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz", "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==" }, "node_modules/@lezer/lr": { "version": "0.15.8", "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz", "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==", "dependencies": { "@lezer/common": "^0.15.0" } }, "node_modules/@lmdb/lmdb-darwin-arm64": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.3.tgz", "integrity": "sha512-RXwGZ/0eCqtCY8FLTM/koR60w+MXyvBUpToXiIyjOcBnC81tAlTUHrRUavCEWPI9zc9VgvpK3+cbumPyR8BSuA==", "cpu": [ "arm64" ], "optional": true, "os": [ "darwin" ] }, "node_modules/@lmdb/lmdb-darwin-x64": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.3.tgz", "integrity": "sha512-337dNzh5yCdNCTk8kPfoU7jR3otibSlPDGW0vKZT97rKnQMb9tNdto3RtWoGPsQ8hKmlRZpojOJtmwjncq1MoA==", "cpu": [ "x64" ], "optional": true, "os": [ "darwin" ] }, "node_modules/@lmdb/lmdb-linux-arm": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.3.tgz", "integrity": "sha512-mU2HFJDGwECkoD9dHQEfeTG5mp8hNS2BCfwoiOpVPMeapjYpQz9Uw3FkUjRZ4dGHWKbin40oWHuL0bk2bCx+Sg==", "cpu": [ "arm" ], "optional": true, "os": [ "linux" ] }, "node_modules/@lmdb/lmdb-linux-arm64": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.3.tgz", "integrity": "sha512-VJw60Mdgb4n+L0fO1PqfB0C7TyEQolJAC8qpqvG3JoQwvyOv6LH7Ib/WE3wxEW9nuHmVz9jkK7lk5HfWWgoO1Q==", "cpu": [ "arm64" ], "optional": true, "os": [ "linux" ] }, "node_modules/@lmdb/lmdb-linux-x64": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.3.tgz", "integrity": "sha512-qaReO5aV8griBDsBr8uBF/faO3ieGjY1RY4p8JvTL6Mu1ylLrTVvOONqKFlNaCwrmUjWw5jnf7VafxDAeQHTow==", "cpu": [ "x64" ], "optional": true, "os": [ "linux" ] }, "node_modules/@lmdb/lmdb-win32-x64": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.3.tgz", "integrity": "sha512-cK+Elf3RjEzrm3SerAhrFWL5oQAsZSJ/LmjL1joIpTfEP1etJJ9CTRvdaV6XLYAxaEkfdhk/9hOvHLbR9yIhCA==", "cpu": [ "x64" ], "optional": true, "os": [ "win32" ] }, "node_modules/@mapbox/hast-util-table-cell-style": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.1.3.tgz", "integrity": "sha512-QsEsh5YaDvHoMQ2YHdvZy2iDnU3GgKVBTcHf6cILyoWDZtPSdlG444pL/ioPYO/GpXSfODBb9sefEetfC4v9oA==", "dependencies": { "unist-util-visit": "^1.3.0" }, "engines": { "node": ">=4" } }, "node_modules/@mischnic/json-sourcemap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz", "integrity": "sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==", "dependencies": { "@lezer/common": "^0.15.7", "@lezer/lr": "^0.15.4", "json5": "^2.2.1" }, "engines": { "node": ">=12.0.0" } }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.2.0.tgz", "integrity": "sha512-Z9LFPzfoJi4mflGWV+rv7o7ZbMU5oAU9VmzCgL240KnqDW65Y2HFCT3MW06/ITJSnbVLacmcEJA8phywK7JinQ==", "cpu": [ "arm64" ], "optional": true, "os": [ "darwin" ] }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.2.0.tgz", "integrity": "sha512-vq0tT8sjZsy4JdSqmadWVw6f66UXqUCabLmUVHZwUFzMgtgoIIQjT4VVRHKvlof3P/dMCkbMJ5hB1oJ9OWHaaw==", "cpu": [ "x64" ], "optional": true, "os": [ "darwin" ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.2.0.tgz", "integrity": "sha512-SaJ3Qq4lX9Syd2xEo9u3qPxi/OB+5JO/ngJKK97XDpa1C587H9EWYO6KD8995DAjSinWvdHKRrCOXVUC5fvGOg==", "cpu": [ "arm" ], "optional": true, "os": [ "linux" ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.2.0.tgz", "integrity": "sha512-hlxxLdRmPyq16QCutUtP8Tm6RDWcyaLsRssaHROatgnkOxdleMTgetf9JsdncL8vLh7FVy/RN9i3XR5dnb9cRA==", "cpu": [ "arm64" ], "optional": true, "os": [ "linux" ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.2.0.tgz", "integrity": "sha512-94y5PJrSOqUNcFKmOl7z319FelCLAE0rz/jPCWS+UtdMZvpa4jrQd+cJPQCLp2Fes1yAW/YUQj/Di6YVT3c3Iw==", "cpu": [ "x64" ], "optional": true, "os": [ "linux" ] }, "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.2.0.tgz", "integrity": "sha512-XrC0JzsqQSvOyM3t04FMLO6z5gCuhPE6k4FXuLK5xf52ZbdvcFe1yBmo7meCew9B8G2f0T9iu9t3kfTYRYROgA==", "cpu": [ "x64" ], "optional": true, "os": [ "win32" ] }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", "dependencies": { "eslint-scope": "5.1.1" } }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { "node": ">= 8" } }, "node_modules/@parcel/bundler-default": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.6.2.tgz", "integrity": "sha512-XIa3had/MIaTGgRFkHApXwytYs77k4geaNcmlb6nzmAABcYjW1CLYh83Zt0AbzLFsDT9ZcRY3u2UjhNf6efSaw==", "dependencies": { "@parcel/diagnostic": "2.6.2", "@parcel/hash": "2.6.2", "@parcel/plugin": "2.6.2", "@parcel/utils": "2.6.2", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", "parcel": "^2.6.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/cache": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.6.2.tgz", "integrity": "sha512-hhJ6AsEGybeQZd9c/GYqfcKTgZKQXu3Xih6TlnP3gdR3KZoJOnb40ovHD1yYg4COvfcXThKP1cVJ18J6rcv3IA==", "dependencies": { "@parcel/fs": "2.6.2", "@parcel/logger": "2.6.2", "@parcel/utils": "2.6.2", "lmdb": "2.5.2" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" }, "peerDependencies": { "@parcel/core": "^2.6.2" } }, "node_modules/@parcel/cache/node_modules/@lmdb/lmdb-darwin-arm64": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", "cpu": [ "arm64" ], "optional": true, "os": [ "darwin" ] }, "node_modules/@parcel/cache/node_modules/@lmdb/lmdb-darwin-x64": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", "cpu": [ "x64" ], "optional": true, "os": [ "darwin" ] }, "node_modules/@parcel/cache/node_modules/@lmdb/lmdb-linux-arm": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", "cpu": [ "arm" ], "optional": true, "os": [ "linux" ] }, "node_modules/@parcel/cache/node_modules/@lmdb/lmdb-linux-arm64": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", "cpu": [ "arm64" ], "optional": true, "os": [ "linux" ] }, "node_modules/@parcel/cache/node_modules/@lmdb/lmdb-linux-x64": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", "cpu": [ "x64" ], "optional": true, "os": [ "linux" ] }, "node_modules/@parcel/cache/node_modules/@lmdb/lmdb-win32-x64": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", "cpu": [ "x64" ], "optional": true, "os": [ "win32" ] }, "node_modules/@parcel/cache/node_modules/lmdb": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", "hasInstallScript": true, "dependencies": { "msgpackr": "^1.5.4", "node-addon-api": "^4.3.0", "node-gyp-build-optional-packages": "5.0.3", "ordered-binary": "^1.2.4", "weak-lru-cache": "^1.2.2" }, "optionalDependencies": { "@lmdb/lmdb-darwin-arm64": "2.5.2", "@lmdb/lmdb-darwin-x64": "2.5.2", "@lmdb/lmdb-linux-arm": "2.5.2", "@lmdb/lmdb-linux-arm64": "2.5.2", "@lmdb/lmdb-linux-x64": "2.5.2", "@lmdb/lmdb-win32-x64": "2.5.2" } }, "node_modules/@parcel/cache/node_modules/node-addon-api": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" }, "node_modules/@parcel/codeframe": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.6.2.tgz", "integrity": "sha512-oFlHr6HCaYYsB4SHkU+gn9DKtbzvv3/4NdwMX0/6NAKyYVI7inEsXyPGw2Bbd2ZCFatW9QJZUETF0etvh5AEfQ==", "dependencies": { "chalk": "^4.1.0" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/codeframe/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@parcel/codeframe/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@parcel/codeframe/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@parcel/compressor-raw": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.6.2.tgz", "integrity": "sha512-P3c8jjV5HVs+fNDjhvq7PtHXNm687nit1iwTS5VAt+ScXKhKBhoIJ56q+9opcw0jnXVjAAgZqcRZ50oAJBGdKw==", "dependencies": { "@parcel/plugin": "2.6.2" }, "engines": { "node": ">= 12.0.0", "parcel": "^2.6.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/core": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.6.2.tgz", "integrity": "sha512-JlKS3Ux0ngmdooSBbzQLShHJdsapF9E7TGMo1hFaHRquZip/DaqzvysYrgMJlDuCoLArciq5ei7ZKzGeK9zexA==", "dependencies": { "@mischnic/json-sourcemap": "^0.1.0", "@parcel/cache": "2.6.2", "@parcel/diagnostic": "2.6.2", "@parcel/events": "2.6.2", "@parcel/fs": "2.6.2", "@parcel/graph": "2.6.2", "@parcel/hash": "2.6.2", "@parcel/logger": "2.6.2", "@parcel/package-manager": "2.6.2", "@parcel/plugin": "2.6.2", "@parcel/source-map": "^2.0.0", "@parcel/types": "2.6.2", "@parcel/utils": "2.6.2", "@parcel/workers": "2.6.2", "abortcontroller-polyfill": "^1.1.9", "base-x": "^3.0.8", "browserslist": "^4.6.6", "clone": "^2.1.1", "dotenv": "^7.0.0", "dotenv-expand": "^5.1.0", "json5": "^2.2.0", "msgpackr": "^1.5.4", "nullthrows": "^1.1.1", "semver": "^5.7.1" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/core/node_modules/dotenv": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", "engines": { "node": ">=6" } }, "node_modules/@parcel/diagnostic": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.6.2.tgz", "integrity": "sha512-3ODSBkKVihENU763z1/1DhGAWFhYWRxOCOShC72KXp+GFnSgGiBsxclu8NBa/N948Rzp8lqQI8U1nLcKkh0O/w==", "dependencies": { "@mischnic/json-sourcemap": "^0.1.0", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/events": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.6.2.tgz", "integrity": "sha512-IaCjOeA5ercdFVi1EZOmUHhGfIysmCUgc2Th9hMugSFO0I3GzRsBcAdP6XPfWm+TV6sQ/qZRfdk/drUxoAupnw==", "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/fs": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.6.2.tgz", "integrity": "sha512-mIhqdF3tjgeoIGqW7Nc/xfM2ClID7o8livwUe5lpQEP+ZaIBiMigXs6ckv3WToCACK+3uylrSD2A/HmlhrxMqQ==", "dependencies": { "@parcel/fs-search": "2.6.2", "@parcel/types": "2.6.2", "@parcel/utils": "2.6.2", "@parcel/watcher": "^2.0.0", "@parcel/workers": "2.6.2" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" }, "peerDependencies": { "@parcel/core": "^2.6.2" } }, "node_modules/@parcel/fs-search": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.6.2.tgz", "integrity": "sha512-4STid1zqtGnmGjHD/2TG2g/zPDiCTtE3IAS24QYH3eiUAz2uoKGgEqd2tZbZ2yI96jtCuIhC1bzVu8Hbykls7w==", "dependencies": { "detect-libc": "^1.0.3" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/graph": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-2.6.2.tgz", "integrity": "sha512-DPH4G/RBFJWayIN2fnhDXqhUw75n7k15YsGzdDKiXuwwz4wMOjoL4cyrI6zOf1SIyh3guRmeTYJ4jjPzwrLYww==", "dependencies": { "@parcel/utils": "2.6.2", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/hash": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.6.2.tgz", "integrity": "sha512-tFB+cJU1Wqag6WyJgsmx3nx+xhmjcNZqtWh/MtK1lHNnZdDRk6bjr7SapnygBwruz+SmSt5bbdVThcpk2dRCcA==", "dependencies": { "detect-libc": "^1.0.3", "xxhash-wasm": "^0.4.2" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/logger": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.6.2.tgz", "integrity": "sha512-Sz5YGCj1DbEiX0/G8Uw97LLZ0uEK+qtWcRAkHNpJpeMiSqDiRNevxXltz42EcLo+oCh4d4wyiVzwi9mNwzhS/Q==", "dependencies": { "@parcel/diagnostic": "2.6.2", "@parcel/events": "2.6.2" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/markdown-ansi": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.6.2.tgz", "integrity": "sha512-N/h9J4eibhc+B+krzvPMzFUWL37GudBIZBa7XSLkcuH6MnYYfh6rrMvhIyyESwk6VkcZNVzAeZrGQqxEs0dHDQ==", "dependencies": { "chalk": "^4.1.0" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/markdown-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@parcel/markdown-ansi/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@parcel/markdown-ansi/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@parcel/namer-default": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.6.2.tgz", "integrity": "sha512-mp7bx/BQaIuohmZP0uE+gAmDBzzH0Yu8F4yCtE611lc6i0mou+nWRhzyKLNC/ieuI8DB3BFh2QQKeTxJn4W0qg==", "dependencies": { "@parcel/diagnostic": "2.6.2", "@parcel/plugin": "2.6.2", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", "parcel": "^2.6.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/node-resolver-core": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-2.6.2.tgz", "integrity": "sha512-4b2L5QRYlTybvv3+TIRtwg4PPJXy+cRShCBa8eu1K0Fj297Afe8MOZrcVV+RIr2KPMIRXcIJoqDmOhyci/DynA==", "dependencies": { "@parcel/diagnostic": "2.6.2", "@parcel/utils": "2.6.2", "nullthrows": "^1.1.1", "semver": "^5.7.1" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/optimizer-terser": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/optimizer-terser/-/optimizer-terser-2.6.2.tgz", "integrity": "sha512-ZSEVQ3G3zOiVPeHvH+BrHegZybrQj9kWQAaAA92leSqbvf6UaX4xqXbGRg2OttNFtbGYBzIl28Zm4t2SLeUIuA==", "dependencies": { "@parcel/diagnostic": "2.6.2", "@parcel/plugin": "2.6.2", "@parcel/source-map": "^2.0.0", "@parcel/utils": "2.6.2", "nullthrows": "^1.1.1", "terser": "^5.2.0" }, "engines": { "node": ">= 12.0.0", "parcel": "^2.6.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/package-manager": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.6.2.tgz", "integrity": "sha512-xGMqTgnwTE3rgzYwUZMKxR8fzmP5iSYz/gj2H8FR3pEmwh/8xCMtNjTSth+hPVGuqgRZ6JxwpfdY/fXdZ61ViQ==", "dependencies": { "@parcel/diagnostic": "2.6.2", "@parcel/fs": "2.6.2", "@parcel/logger": "2.6.2", "@parcel/types": "2.6.2", "@parcel/utils": "2.6.2", "@parcel/workers": "2.6.2", "semver": "^5.7.1" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" }, "peerDependencies": { "@parcel/core": "^2.6.2" } }, "node_modules/@parcel/packager-js": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.6.2.tgz", "integrity": "sha512-fm5rKWtaExR0W+UEKWivXNPysRFxuBCdskdxDByb1J1JeGMvp7dJElbi8oXDAQM4MnM5EyG7cg47SlMZNTLm4A==", "dependencies": { "@parcel/diagnostic": "2.6.2", "@parcel/hash": "2.6.2", "@parcel/plugin": "2.6.2", "@parcel/source-map": "^2.0.0", "@parcel/utils": "2.6.2", "globals": "^13.2.0", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", "parcel": "^2.6.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/packager-js/node_modules/globals": { "version": "13.19.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@parcel/packager-raw": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.6.2.tgz", "integrity": "sha512-Rl3ZkMtMjb+LEvRowijDD8fibUAS6rWK0/vZQMk9cDNYCP2gCpZayLk0HZIGxneeTbosf/0sbngHq4VeRQOnQA==", "dependencies": { "@parcel/plugin": "2.6.2" }, "engines": { "node": ">= 12.0.0", "parcel": "^2.6.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/plugin": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.6.2.tgz", "integrity": "sha512-wbbWsM23Pr+8xtLSvf+UopXdVYlpKCCx6PuuZaZcKo+9IcDCWoGXD4M8Kkz14qBmkFn5uM00mULUqmVdSibB2w==", "dependencies": { "@parcel/types": "2.6.2" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/reporter-dev-server": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.6.2.tgz", "integrity": "sha512-5QtL3ETMFL161jehlIK6rjBM+Pqk5cMhr60s9yLYqE1GY4M4gMj+Act+FXViyM6gmMA38cPxDvUsxTKBYXpFCw==", "dependencies": { "@parcel/plugin": "2.6.2", "@parcel/utils": "2.6.2" }, "engines": { "node": ">= 12.0.0", "parcel": "^2.6.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/resolver-default": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.6.2.tgz", "integrity": "sha512-Lo5sWb5QkjWvdBr+TdmAF6Mszb/sMldBBatc1osQTkHXCy679VMH+lfyiWxHbwK+F1pmdMeBJpYcMxvrgT8EsA==", "dependencies": { "@parcel/node-resolver-core": "2.6.2", "@parcel/plugin": "2.6.2" }, "engines": { "node": ">= 12.0.0", "parcel": "^2.6.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/runtime-js": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.6.2.tgz", "integrity": "sha512-0S3JFwgvs6FmEx2dHta9R0Sfu8vCnFAm4i7Y4efGHtAcTrF2CHjyiz4/hG+RQGJ70eoWW463Q+8qt6EKbkaOBQ==", "dependencies": { "@parcel/plugin": "2.6.2", "@parcel/utils": "2.6.2", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", "parcel": "^2.6.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/source-map": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", "dependencies": { "detect-libc": "^1.0.3" }, "engines": { "node": "^12.18.3 || >=14" } }, "node_modules/@parcel/transformer-js": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.6.2.tgz", "integrity": "sha512-uhXAMTjE/Q61amflV8qVpb73mj+mIdXIMH0cSks1/gDIAxcgIvWvrE14P4TvY6zJ1q1iRJRIRUN6cFSXqjjLSA==", "dependencies": { "@parcel/diagnostic": "2.6.2", "@parcel/plugin": "2.6.2", "@parcel/source-map": "^2.0.0", "@parcel/utils": "2.6.2", "@parcel/workers": "2.6.2", "@swc/helpers": "^0.4.2", "browserslist": "^4.6.6", "detect-libc": "^1.0.3", "nullthrows": "^1.1.1", "regenerator-runtime": "^0.13.7", "semver": "^5.7.1" }, "engines": { "node": ">= 12.0.0", "parcel": "^2.6.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" }, "peerDependencies": { "@parcel/core": "^2.6.2" } }, "node_modules/@parcel/transformer-js/node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/@parcel/transformer-json": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.6.2.tgz", "integrity": "sha512-QGcIIvbPF/u10ihYvQhxXqb2QMXWSzcBxJrOSIXIl74TUGrWX05D5LmjDA/rzm/n/kvRnBkFNP60R/smYb8x+Q==", "dependencies": { "@parcel/plugin": "2.6.2", "json5": "^2.2.0" }, "engines": { "node": ">= 12.0.0", "parcel": "^2.6.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/types": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.6.2.tgz", "integrity": "sha512-MV8BFpCIs2jMUvK2RHqzkoiuOQ//JIbrD1zocA2YRW3zuPL/iABvbAABJoXpoPCKikVWOoCWASgBfWQo26VvJQ==", "dependencies": { "@parcel/cache": "2.6.2", "@parcel/diagnostic": "2.6.2", "@parcel/fs": "2.6.2", "@parcel/package-manager": "2.6.2", "@parcel/source-map": "^2.0.0", "@parcel/workers": "2.6.2", "utility-types": "^3.10.0" } }, "node_modules/@parcel/utils": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.6.2.tgz", "integrity": "sha512-Ug7hpRxjgbY5AopW55nY7MmGMVmwmN+ihfCmxJkBUoESTG/3iq8uME7GjyOgW5DkQc2K7q62i8y8N0wCJT1u4Q==", "dependencies": { "@parcel/codeframe": "2.6.2", "@parcel/diagnostic": "2.6.2", "@parcel/hash": "2.6.2", "@parcel/logger": "2.6.2", "@parcel/markdown-ansi": "2.6.2", "@parcel/source-map": "^2.0.0", "chalk": "^4.1.0" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/utils/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@parcel/utils/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@parcel/utils/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@parcel/watcher": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.1.0.tgz", "integrity": "sha512-8s8yYjd19pDSsBpbkOHnT6Z2+UJSuLQx61pCFM0s5wSRvKCEMDjd/cHY3/GI1szHIWbpXpsJdg3V6ISGGx9xDw==", "hasInstallScript": true, "dependencies": { "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^3.2.1", "node-gyp-build": "^4.3.0" }, "engines": { "node": ">= 10.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, "node_modules/@parcel/watcher/node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/@parcel/watcher/node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/@parcel/watcher/node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/@parcel/watcher/node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/@parcel/watcher/node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, "node_modules/@parcel/workers": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.6.2.tgz", "integrity": "sha512-wBgUjJQm+lDd12fPRUmk09+ujTA9DgwPdqylSFK0OtI/yT6A+2kArUqjp8IwWo2tCJXoMzXBne2XQIWKqMiN4Q==", "dependencies": { "@parcel/diagnostic": "2.6.2", "@parcel/logger": "2.6.2", "@parcel/types": "2.6.2", "@parcel/utils": "2.6.2", "chrome-trace-event": "^1.0.2", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" }, "peerDependencies": { "@parcel/core": "^2.6.2" } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", "dependencies": { "ansi-html-community": "^0.0.8", "common-path-prefix": "^3.0.0", "core-js-pure": "^3.23.3", "error-stack-parser": "^2.0.6", "find-up": "^5.0.0", "html-entities": "^2.1.0", "loader-utils": "^2.0.4", "schema-utils": "^3.0.0", "source-map": "^0.7.3" }, "engines": { "node": ">= 10.13" }, "peerDependencies": { "@types/webpack": "4.x || 5.x", "react-refresh": ">=0.10.0 <1.0.0", "sockjs-client": "^1.4.0", "type-fest": ">=0.17.0 <4.0.0", "webpack": ">=4.43.0 <6.0.0", "webpack-dev-server": "3.x || 4.x", "webpack-hot-middleware": "2.x", "webpack-plugin-serve": "0.x || 1.x" }, "peerDependenciesMeta": { "@types/webpack": { "optional": true }, "sockjs-client": { "optional": true }, "type-fest": { "optional": true }, "webpack-dev-server": { "optional": true }, "webpack-hot-middleware": { "optional": true }, "webpack-plugin-serve": { "optional": true } } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "engines": { "node": ">= 8" } }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", "dependencies": { "@hapi/hoek": "^9.0.0" } }, "node_modules/@sideway/formula": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" } }, "node_modules/@sindresorhus/slugify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.2.tgz", "integrity": "sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA==", "dependencies": { "@sindresorhus/transliterate": "^0.1.1", "escape-string-regexp": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@sindresorhus/slugify/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@sindresorhus/transliterate": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz", "integrity": "sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w==", "dependencies": { "escape-string-regexp": "^2.0.0", "lodash.deburr": "^4.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@sindresorhus/transliterate/node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "engines": { "node": ">=8" } }, "node_modules/@swc/helpers": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dependencies": { "defer-to-connect": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/@tippy.js/react": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@tippy.js/react/-/react-2.2.3.tgz", "integrity": "sha512-5XYvbQujzDj9r00JYEz/cBtm6DutjOdv2azdco53B+eWF7FDBCQfkLVn87wimfEpmGK0vqRQv/cwFxFcoOP98Q==", "deprecated": "This package has moved to @tippyjs/react (the same but without a dot in the scoped organization) due to issues some shells had with the dot when installing the package.", "dependencies": { "prop-types": "^15.6.2", "tippy.js": "^4.3.4" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "node_modules/@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "engines": { "node": ">=10.13.0" } }, "node_modules/@turist/fetch": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@turist/fetch/-/fetch-7.2.0.tgz", "integrity": "sha512-2x7EGw+6OJ29phunsbGvtxlNmSfcuPcyYudkMbi8gARCP9eJ1CtuMvnVUHL//O9Ixi9SJiug8wNt6lj86pN8XQ==", "dependencies": { "@types/node-fetch": "2" }, "peerDependencies": { "node-fetch": "2" } }, "node_modules/@turist/time": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/@turist/time/-/time-0.0.2.tgz", "integrity": "sha512-qLOvfmlG2vCVw5fo/oz8WAZYlpe5a5OurgTj3diIxJCdjRHpapC+vQCz3er9LV79Vcat+DifBjeAhOAdmndtDQ==" }, "node_modules/@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "node_modules/@types/common-tags": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.1.tgz", "integrity": "sha512-20R/mDpKSPWdJs5TOpz3e7zqbeCNuMCPhV7Yndk9KU2Rbij2r5W4RzwDPkzC+2lzUqXYu9rFzTktCBnDjHuNQg==" }, "node_modules/@types/component-emitter": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==" }, "node_modules/@types/configstore": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-2.1.1.tgz", "integrity": "sha512-YY+hm3afkDHeSM2rsFXxeZtu0garnusBWNG1+7MknmDWQHqcH2w21/xOU9arJUi8ch4qyFklidANLCu3ihhVwQ==" }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" }, "node_modules/@types/cors": { "version": "2.8.13", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/debug": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" }, "node_modules/@types/eslint": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { "version": "3.7.4", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" }, "node_modules/@types/get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-3.2.0.tgz", "integrity": "sha512-TiNg8R1kjDde5Pub9F9vCwZA/BNW9HeXP5b9j7Qucqncy/McfPZ6xze/EyBdXS5FhMIGN6Fx3vg75l5KHy3V1Q==" }, "node_modules/@types/glob": { "version": "5.0.37", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.37.tgz", "integrity": "sha512-ATA/xrS7CZ3A2WCPVY4eKdNpybq56zqlTirnHhhyOztZM/lPxJzusOBI3BsaXbu6FrUluqzvMlI4sZ6BDYMlMg==", "dependencies": { "@types/minimatch": "*", "@types/node": "*" } }, "node_modules/@types/hast": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, "node_modules/@types/http-proxy": { "version": "1.17.9", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/lodash": { "version": "4.14.191", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" }, "node_modules/@types/mdast": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" }, "node_modules/@types/mkdirp": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" }, "node_modules/@types/node-fetch": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", "dependencies": { "@types/node": "*", "form-data": "^3.0.0" } }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/parse5": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" }, "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/reach__router": { "version": "1.3.11", "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.3.11.tgz", "integrity": "sha512-j23ChnIEiW8aAP4KT8OVyTXOFr+Ri65BDnwzmfHFO9WHypXYevHFjeil1Cj7YH3emfCE924BwAmgW4hOv7Wg3g==", "dependencies": { "@types/react": "*" } }, "node_modules/@types/react": { "version": "18.0.26", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/rimraf": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.5.tgz", "integrity": "sha512-YyP+VfeaqAyFmXoTh3HChxOQMyjByRMsHU7kc5KOJkSlXudhMhQIALbYV7rHh/l8d2lX3VUQzprrcAgWdRuU8g==", "dependencies": { "@types/glob": "*", "@types/node": "*" } }, "node_modules/@types/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "node_modules/@types/sharp": { "version": "0.30.5", "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.30.5.tgz", "integrity": "sha512-EhO29617AIBqxoVtpd1qdBanWpspk/kD2B6qTFRJ31Q23Rdf+DNU1xlHSwtqvwq1vgOqBwq1i38SX+HGCymIQg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-gVC1InwyVrO326wbBZw+AO3u2vRXz/iRWq9jYhpG4W8LXyIgDv3ZmcLQ5Q4Gs+gFMyqx+viFoFT+l3p61QFCmQ==" }, "node_modules/@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, "node_modules/@types/yoga-layout": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", "dependencies": { "@typescript-eslint/experimental-utils": "4.33.0", "@typescript-eslint/scope-manager": "4.33.0", "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", "regexpp": "^3.1.0", "semver": "^7.3.5", "tsutils": "^3.21.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "@typescript-eslint/parser": "^4.0.0", "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/@typescript-eslint/experimental-utils": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", "dependencies": { "@types/json-schema": "^7.0.7", "@typescript-eslint/scope-manager": "4.33.0", "@typescript-eslint/types": "4.33.0", "@typescript-eslint/typescript-estree": "4.33.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "*" } }, "node_modules/@typescript-eslint/parser": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", "dependencies": { "@typescript-eslint/scope-manager": "4.33.0", "@typescript-eslint/types": "4.33.0", "@typescript-eslint/typescript-estree": "4.33.0", "debug": "^4.3.1" }, "engines": { "node": "^10.12.0 || >=12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/parser/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/@typescript-eslint/parser/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@typescript-eslint/scope-manager": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", "dependencies": { "@typescript-eslint/types": "4.33.0", "@typescript-eslint/visitor-keys": "4.33.0" }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/types": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/typescript-estree": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", "dependencies": { "@typescript-eslint/types": "4.33.0", "@typescript-eslint/visitor-keys": "4.33.0", "debug": "^4.3.1", "globby": "^11.0.3", "is-glob": "^4.0.1", "semver": "^7.3.5", "tsutils": "^3.21.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/@typescript-eslint/visitor-keys": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", "dependencies": { "@typescript-eslint/types": "4.33.0", "eslint-visitor-keys": "^2.0.0" }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@vercel/webpack-asset-relocator-loader": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/@vercel/webpack-asset-relocator-loader/-/webpack-asset-relocator-loader-1.7.3.tgz", "integrity": "sha512-vizrI18v8Lcb1PmNNUBz7yxPxxXoOeuaVEjTG9MjvDrphjiSxFZrRJ5tIghk+qdLFRCXI5HBCshgobftbmrC5g==", "dependencies": { "resolve": "^1.10.0" } }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.1" } }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-section": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.1", "@webassemblyjs/wasm-opt": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", "@webassemblyjs/wast-printer": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/ieee754": "1.11.1", "@webassemblyjs/leb128": "1.11.1", "@webassemblyjs/utf8": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/ieee754": "1.11.1", "@webassemblyjs/leb128": "1.11.1", "@webassemblyjs/utf8": "1.11.1" } }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dependencies": { "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/abortcontroller-polyfill": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" } }, "node_modules/acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "peerDependencies": { "acorn": "^8" } }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-loose": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.3.0.tgz", "integrity": "sha512-75lAs9H19ldmW+fAbyqHdjgdCrz0pWGXKmnqFoh8PyVd1L2RIb4RzYrSjmopeqv3E1G3/Pimu6GgLlrGbrkF7w==", "dependencies": { "acorn": "^8.5.0" }, "engines": { "node": ">=0.4.0" } }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "engines": { "node": ">=0.4.0" } }, "node_modules/address": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", "engines": { "node": ">= 0.12.0" } }, "node_modules/adjust-sourcemap-loader": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" }, "engines": { "node": ">=8.9" } }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/anser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/anser/-/anser-2.1.1.tgz", "integrity": "sha512-nqLm4HxOTpeLOxcmB3QWmV5TcDFhW9y/fyQ+hivtDFcK4OQ+pQ5fzPnXHM1Mfcm0VkLtvVi1TCPr++Qy0Q/3EQ==" }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dependencies": { "string-width": "^4.1.0" } }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "engines": { "node": ">=4" } }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "engines": [ "node >= 0.8.0" ], "bin": { "ansi-html": "bin/ansi-html" } }, "node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "engines": { "node": ">=0.10.0" } }, "node_modules/ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "engines": { "node": ">=0.10.0" } }, "node_modules/anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "optional": true, "dependencies": { "micromatch": "^2.1.5", "normalize-path": "^2.0.0" } }, "node_modules/append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, "node_modules/application-config-path": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz", "integrity": "sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==" }, "node_modules/arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/aria-query": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", "dependencies": { "@babel/runtime": "^7.10.2", "@babel/runtime-corejs3": "^7.10.2" }, "engines": { "node": ">=6.0" } }, "node_modules/arity-n": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", "integrity": "sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==" }, "node_modules/arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==", "dev": true, "optional": true, "dependencies": { "arr-flatten": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/array-includes": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-iterate": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz", "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "engines": { "node": ">=8" } }, "node_modules/array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/array.prototype.flat": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flatmap": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.tosorted": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0", "get-intrinsic": "^1.1.3" } }, "node_modules/arrify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "engines": { "node": ">=8" } }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "engines": { "node": ">=8" } }, "node_modules/async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" }, "node_modules/async-cache": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/async-cache/-/async-cache-1.1.0.tgz", "integrity": "sha512-YDQc4vBn5NFhY6g6HhVshyi3Fy9+SQ5ePnE7JLDJn1DoL+i7ER+vMwtTNOYk9leZkYMnOwpBCWqyLDPw8Aig8g==", "deprecated": "No longer maintained. Use [lru-cache](http://npm.im/lru-cache) version 7.6 or higher, and provide an asynchronous `fetchMethod` option.", "dependencies": { "lru-cache": "^4.0.0" } }, "node_modules/async-cache/node_modules/lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "node_modules/async-cache/node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, "node_modules/async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true, "optional": true }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "engines": { "node": ">= 4.0.0" } }, "node_modules/atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "bin": { "atob": "bin/atob.js" }, "engines": { "node": ">= 4.5.0" } }, "node_modules/auto-bind": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/autoprefixer": { "version": "10.4.13", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", "funding": [ { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" } ], "dependencies": { "browserslist": "^4.21.4", "caniuse-lite": "^1.0.30001426", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" }, "bin": { "autoprefixer": "bin/autoprefixer" }, "engines": { "node": "^10 || ^12 || >=14" }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/axe-core": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.2.tgz", "integrity": "sha512-b1WlTV8+XKLj9gZy2DZXgQiyDp9xkkoe2a6U6UbYccScq2wgH/YwCeI2/Jq2mgo0HzQxqJOjWZBLeA/mqsk5Mg==", "engines": { "node": ">=4" } }, "node_modules/axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "dependencies": { "follow-redirects": "^1.14.0" } }, "node_modules/axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" }, "node_modules/babel-cli": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", "integrity": "sha512-wau+BDtQfuSBGQ9PzzFL3REvR9Sxnd4LKwtcHAiPjhugA7K/80vpHXafj+O5bAqJOuSefjOx5ZJnNSR2J1Qw6Q==", "dev": true, "dependencies": { "babel-core": "^6.26.0", "babel-polyfill": "^6.26.0", "babel-register": "^6.26.0", "babel-runtime": "^6.26.0", "commander": "^2.11.0", "convert-source-map": "^1.5.0", "fs-readdir-recursive": "^1.0.0", "glob": "^7.1.2", "lodash": "^4.17.4", "output-file-sync": "^1.1.2", "path-is-absolute": "^1.0.1", "slash": "^1.0.0", "source-map": "^0.5.6", "v8flags": "^2.1.1" }, "bin": { "babel": "bin/babel.js", "babel-doctor": "bin/babel-doctor.js", "babel-external-helpers": "bin/babel-external-helpers.js", "babel-node": "bin/babel-node.js" }, "optionalDependencies": { "chokidar": "^1.6.1" } }, "node_modules/babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", "dev": true, "dependencies": { "chalk": "^1.1.3", "esutils": "^2.0.2", "js-tokens": "^3.0.2" } }, "node_modules/babel-core": { "version": "6.26.3", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "dependencies": { "babel-code-frame": "^6.26.0", "babel-generator": "^6.26.0", "babel-helpers": "^6.24.1", "babel-messages": "^6.23.0", "babel-register": "^6.26.0", "babel-runtime": "^6.26.0", "babel-template": "^6.26.0", "babel-traverse": "^6.26.0", "babel-types": "^6.26.0", "babylon": "^6.18.0", "convert-source-map": "^1.5.1", "debug": "^2.6.9", "json5": "^0.5.1", "lodash": "^4.17.4", "minimatch": "^3.0.4", "path-is-absolute": "^1.0.1", "private": "^0.1.8", "slash": "^1.0.0", "source-map": "^0.5.7" } }, "node_modules/babel-core/node_modules/json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", "dev": true, "bin": { "json5": "lib/cli.js" } }, "node_modules/babel-eslint": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", "peer": true, "dependencies": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.7.0", "@babel/traverse": "^7.7.0", "@babel/types": "^7.7.0", "eslint-visitor-keys": "^1.0.0", "resolve": "^1.12.0" }, "engines": { "node": ">=6" }, "peerDependencies": { "eslint": ">= 4.12.1" } }, "node_modules/babel-eslint/node_modules/eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "peer": true, "engines": { "node": ">=4" } }, "node_modules/babel-extract-comments": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", "dependencies": { "babylon": "^6.18.0" }, "engines": { "node": ">=4" } }, "node_modules/babel-generator": { "version": "6.26.1", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "dependencies": { "babel-messages": "^6.23.0", "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "detect-indent": "^4.0.0", "jsesc": "^1.3.0", "lodash": "^4.17.4", "source-map": "^0.5.7", "trim-right": "^1.0.1" } }, "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", "integrity": "sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==", "dev": true, "dependencies": { "babel-helper-explode-assignable-expression": "^6.24.1", "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "node_modules/babel-helper-builder-react-jsx": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", "integrity": "sha512-02I9jDjnVEuGy2BR3LRm9nPRb/+Ja0pvZVLr1eI5TYAA/dB0Xoc+WBo50+aDfhGDLhlBY1+QURjn9uvcFd8gzg==", "dev": true, "dependencies": { "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "esutils": "^2.0.2" } }, "node_modules/babel-helper-call-delegate": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", "integrity": "sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ==", "dev": true, "dependencies": { "babel-helper-hoist-variables": "^6.24.1", "babel-runtime": "^6.22.0", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "node_modules/babel-helper-define-map": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", "integrity": "sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA==", "dev": true, "dependencies": { "babel-helper-function-name": "^6.24.1", "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "lodash": "^4.17.4" } }, "node_modules/babel-helper-explode-assignable-expression": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", "integrity": "sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "node_modules/babel-helper-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", "integrity": "sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==", "dev": true, "dependencies": { "babel-helper-get-function-arity": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "node_modules/babel-helper-get-function-arity": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", "integrity": "sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "node_modules/babel-helper-hoist-variables": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", "integrity": "sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "node_modules/babel-helper-optimise-call-expression": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", "integrity": "sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "node_modules/babel-helper-regex": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", "integrity": "sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg==", "dev": true, "dependencies": { "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "lodash": "^4.17.4" } }, "node_modules/babel-helper-remap-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", "integrity": "sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg==", "dev": true, "dependencies": { "babel-helper-function-name": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "node_modules/babel-helper-replace-supers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", "integrity": "sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw==", "dev": true, "dependencies": { "babel-helper-optimise-call-expression": "^6.24.1", "babel-messages": "^6.23.0", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "node_modules/babel-helpers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "node_modules/babel-loader": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", "dependencies": { "find-cache-dir": "^3.3.1", "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "engines": { "node": ">= 8.9" }, "peerDependencies": { "@babel/core": "^7.0.0", "webpack": ">=2" } }, "node_modules/babel-loader/node_modules/schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dependencies": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" }, "engines": { "node": ">= 8.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, "node_modules/babel-messages": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-add-module-exports": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==" }, "node_modules/babel-plugin-check-es2015-constants": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", "integrity": "sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dependencies": { "object.assign": "^4.1.0" } }, "node_modules/babel-plugin-lodash": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz", "integrity": "sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg==", "dependencies": { "@babel/helper-module-imports": "^7.0.0-beta.49", "@babel/types": "^7.0.0-beta.49", "glob": "^7.1.1", "lodash": "^4.17.10", "require-package-name": "^2.0.1" } }, "node_modules/babel-plugin-macros": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" }, "engines": { "node": ">=10", "npm": ">=6" } }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dependencies": { "@babel/compat-data": "^7.17.7", "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.3", "core-js-compat": "^3.25.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-corejs3/node_modules/core-js-compat": { "version": "3.27.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.1.tgz", "integrity": "sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==", "dependencies": { "browserslist": "^4.21.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-remove-graphql-queries": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-4.25.0.tgz", "integrity": "sha512-enyqRNRrn7vTG3nwg1V+XhoAJIyUv3ZukQCs5KbHOK+WNDDiGZQzIG+FCiZFACScdZBJWyx7TYRYbOFJZ/KEGg==", "dependencies": { "@babel/runtime": "^7.15.4", "@babel/types": "^7.15.4", "gatsby-core-utils": "^3.25.0" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "@babel/core": "^7.0.0", "gatsby": "^4.0.0-next" } }, "node_modules/babel-plugin-syntax-async-functions": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw==", "dev": true }, "node_modules/babel-plugin-syntax-class-properties": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", "integrity": "sha512-chI3Rt9T1AbrQD1s+vxw3KcwC9yHtF621/MacuItITfZX344uhQoANjpoSJZleAmW2tjlolqB/f+h7jIqXa7pA==", "dev": true }, "node_modules/babel-plugin-syntax-decorators": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", "integrity": "sha512-AWj19x2aDm8qFQ5O2JcD6pwJDW1YdcnO+1b81t7gxrGjz5VHiUqeYWAR4h7zueWMalRelrQDXprv2FrY1dbpbw==", "dev": true }, "node_modules/babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "integrity": "sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==", "dev": true }, "node_modules/babel-plugin-syntax-flow": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", "integrity": "sha512-HbTDIoG1A1op7Tl/wIFQPULIBA61tsJ8Ntq2FAhLwuijrzosM/92kAfgU1Q3Kc7DH/cprJg5vDfuTY4QUL4rDA==", "dev": true }, "node_modules/babel-plugin-syntax-jsx": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==", "dev": true }, "node_modules/babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==" }, "node_modules/babel-plugin-syntax-trailing-function-commas": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", "integrity": "sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ==", "dev": true }, "node_modules/babel-plugin-transform-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", "integrity": "sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw==", "dev": true, "dependencies": { "babel-helper-remap-async-to-generator": "^6.24.1", "babel-plugin-syntax-async-functions": "^6.8.0", "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-class-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", "integrity": "sha512-n4jtBA3OYBdvG5PRMKsMXJXHfLYw/ZOmtxCLOOwz6Ro5XlrColkStLnz1AS1L2yfPA9BKJ1ZNlmVCLjAL9DSIg==", "dev": true, "dependencies": { "babel-helper-function-name": "^6.24.1", "babel-plugin-syntax-class-properties": "^6.8.0", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "node_modules/babel-plugin-transform-decorators-legacy": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==", "dev": true, "dependencies": { "babel-plugin-syntax-decorators": "^6.1.18", "babel-runtime": "^6.2.0", "babel-template": "^6.3.0" } }, "node_modules/babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", "integrity": "sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", "integrity": "sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-es2015-block-scoping": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", "integrity": "sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw==", "dev": true, "dependencies": { "babel-runtime": "^6.26.0", "babel-template": "^6.26.0", "babel-traverse": "^6.26.0", "babel-types": "^6.26.0", "lodash": "^4.17.4" } }, "node_modules/babel-plugin-transform-es2015-classes": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", "integrity": "sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag==", "dev": true, "dependencies": { "babel-helper-define-map": "^6.24.1", "babel-helper-function-name": "^6.24.1", "babel-helper-optimise-call-expression": "^6.24.1", "babel-helper-replace-supers": "^6.24.1", "babel-messages": "^6.23.0", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "node_modules/babel-plugin-transform-es2015-computed-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", "integrity": "sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "node_modules/babel-plugin-transform-es2015-destructuring": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", "integrity": "sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-es2015-duplicate-keys": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", "integrity": "sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "node_modules/babel-plugin-transform-es2015-for-of": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", "integrity": "sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-es2015-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", "integrity": "sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg==", "dev": true, "dependencies": { "babel-helper-function-name": "^6.24.1", "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "node_modules/babel-plugin-transform-es2015-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", "integrity": "sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-es2015-modules-amd": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", "integrity": "sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA==", "dev": true, "dependencies": { "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "node_modules/babel-plugin-transform-es2015-modules-commonjs": { "version": "6.26.2", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, "dependencies": { "babel-plugin-transform-strict-mode": "^6.24.1", "babel-runtime": "^6.26.0", "babel-template": "^6.26.0", "babel-types": "^6.26.0" } }, "node_modules/babel-plugin-transform-es2015-modules-systemjs": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", "integrity": "sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg==", "dev": true, "dependencies": { "babel-helper-hoist-variables": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "node_modules/babel-plugin-transform-es2015-modules-umd": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", "integrity": "sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw==", "dev": true, "dependencies": { "babel-plugin-transform-es2015-modules-amd": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "node_modules/babel-plugin-transform-es2015-object-super": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", "integrity": "sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA==", "dev": true, "dependencies": { "babel-helper-replace-supers": "^6.24.1", "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-es2015-parameters": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ==", "dev": true, "dependencies": { "babel-helper-call-delegate": "^6.24.1", "babel-helper-get-function-arity": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "node_modules/babel-plugin-transform-es2015-shorthand-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", "integrity": "sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "node_modules/babel-plugin-transform-es2015-spread": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", "integrity": "sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-es2015-sticky-regex": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", "integrity": "sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ==", "dev": true, "dependencies": { "babel-helper-regex": "^6.24.1", "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "node_modules/babel-plugin-transform-es2015-template-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", "integrity": "sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-es2015-typeof-symbol": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", "integrity": "sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-es2015-unicode-regex": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", "integrity": "sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ==", "dev": true, "dependencies": { "babel-helper-regex": "^6.24.1", "babel-runtime": "^6.22.0", "regexpu-core": "^2.0.0" } }, "node_modules/babel-plugin-transform-exponentiation-operator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", "integrity": "sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==", "dev": true, "dependencies": { "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", "babel-plugin-syntax-exponentiation-operator": "^6.8.0", "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-flow-strip-types": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", "integrity": "sha512-TxIM0ZWNw9oYsoTthL3lvAK3+eTujzktoXJg4ubGvICGbVuXVYv5hHv0XXpz8fbqlJaGYY4q5SVzaSmsg3t4Fg==", "dev": true, "dependencies": { "babel-plugin-syntax-flow": "^6.18.0", "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-object-rest-spread": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", "integrity": "sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA==", "dependencies": { "babel-plugin-syntax-object-rest-spread": "^6.8.0", "babel-runtime": "^6.26.0" } }, "node_modules/babel-plugin-transform-react-display-name": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", "integrity": "sha512-QLYkLiZeeED2PKd4LuXGg5y9fCgPB5ohF8olWUuETE2ryHNRqqnXlEVP7RPuef89+HTfd3syptMGVHeoAu0Wig==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-react-jsx": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", "integrity": "sha512-s+q/Y2u2OgDPHRuod3t6zyLoV8pUHc64i/O7ZNgIOEdYTq+ChPeybcKBi/xk9VI60VriILzFPW+dUxAEbTxh2w==", "dev": true, "dependencies": { "babel-helper-builder-react-jsx": "^6.24.1", "babel-plugin-syntax-jsx": "^6.8.0", "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-react-jsx-self": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", "integrity": "sha512-Y3ZHP1nunv0U1+ysTNwLK39pabHj6cPVsfN4TRC7BDBfbgbyF4RifP5kd6LnbuMV9wcfedQMe7hn1fyKc7IzTQ==", "dev": true, "dependencies": { "babel-plugin-syntax-jsx": "^6.8.0", "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-react-jsx-source": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", "integrity": "sha512-pcDNDsZ9q/6LJmujQ/OhjeoIlp5Nl546HJ2yiFIJK3mYpgNXhI5/S9mXfVxu5yqWAi7HdI7e/q6a9xtzwL69Vw==", "dev": true, "dependencies": { "babel-plugin-syntax-jsx": "^6.8.0", "babel-runtime": "^6.22.0" } }, "node_modules/babel-plugin-transform-react-remove-prop-types": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" }, "node_modules/babel-plugin-transform-regenerator": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", "integrity": "sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg==", "dev": true, "dependencies": { "regenerator-transform": "^0.10.0" } }, "node_modules/babel-plugin-transform-strict-mode": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", "integrity": "sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==", "dev": true, "dependencies": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "node_modules/babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", "dev": true, "dependencies": { "babel-runtime": "^6.26.0", "core-js": "^2.5.0", "regenerator-runtime": "^0.10.5" } }, "node_modules/babel-preset-env": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", "dev": true, "dependencies": { "babel-plugin-check-es2015-constants": "^6.22.0", "babel-plugin-syntax-trailing-function-commas": "^6.22.0", "babel-plugin-transform-async-to-generator": "^6.22.0", "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", "babel-plugin-transform-es2015-block-scoping": "^6.23.0", "babel-plugin-transform-es2015-classes": "^6.23.0", "babel-plugin-transform-es2015-computed-properties": "^6.22.0", "babel-plugin-transform-es2015-destructuring": "^6.23.0", "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", "babel-plugin-transform-es2015-for-of": "^6.23.0", "babel-plugin-transform-es2015-function-name": "^6.22.0", "babel-plugin-transform-es2015-literals": "^6.22.0", "babel-plugin-transform-es2015-modules-amd": "^6.22.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", "babel-plugin-transform-es2015-modules-umd": "^6.23.0", "babel-plugin-transform-es2015-object-super": "^6.22.0", "babel-plugin-transform-es2015-parameters": "^6.23.0", "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", "babel-plugin-transform-es2015-spread": "^6.22.0", "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", "babel-plugin-transform-es2015-template-literals": "^6.22.0", "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", "babel-plugin-transform-exponentiation-operator": "^6.22.0", "babel-plugin-transform-regenerator": "^6.22.0", "browserslist": "^3.2.6", "invariant": "^2.2.2", "semver": "^5.3.0" } }, "node_modules/babel-preset-env/node_modules/browserslist": { "version": "3.2.8", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", "dev": true, "dependencies": { "caniuse-lite": "^1.0.30000844", "electron-to-chromium": "^1.3.47" }, "bin": { "browserslist": "cli.js" } }, "node_modules/babel-preset-fbjs": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", "dependencies": { "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-object-rest-spread": "^7.0.0", "@babel/plugin-syntax-class-properties": "^7.0.0", "@babel/plugin-syntax-flow": "^7.0.0", "@babel/plugin-syntax-jsx": "^7.0.0", "@babel/plugin-syntax-object-rest-spread": "^7.0.0", "@babel/plugin-transform-arrow-functions": "^7.0.0", "@babel/plugin-transform-block-scoped-functions": "^7.0.0", "@babel/plugin-transform-block-scoping": "^7.0.0", "@babel/plugin-transform-classes": "^7.0.0", "@babel/plugin-transform-computed-properties": "^7.0.0", "@babel/plugin-transform-destructuring": "^7.0.0", "@babel/plugin-transform-flow-strip-types": "^7.0.0", "@babel/plugin-transform-for-of": "^7.0.0", "@babel/plugin-transform-function-name": "^7.0.0", "@babel/plugin-transform-literals": "^7.0.0", "@babel/plugin-transform-member-expression-literals": "^7.0.0", "@babel/plugin-transform-modules-commonjs": "^7.0.0", "@babel/plugin-transform-object-super": "^7.0.0", "@babel/plugin-transform-parameters": "^7.0.0", "@babel/plugin-transform-property-literals": "^7.0.0", "@babel/plugin-transform-react-display-name": "^7.0.0", "@babel/plugin-transform-react-jsx": "^7.0.0", "@babel/plugin-transform-shorthand-properties": "^7.0.0", "@babel/plugin-transform-spread": "^7.0.0", "@babel/plugin-transform-template-literals": "^7.0.0", "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/babel-preset-fbjs/node_modules/babel-plugin-syntax-trailing-function-commas": { "version": "7.0.0-beta.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" }, "node_modules/babel-preset-flow": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", "integrity": "sha512-PQZFJXnM3d80Vq4O67OE6EMVKIw2Vmzy8UXovqulNogCtblWU8rzP7Sm5YgHiCg4uejUxzCkHfNXQ4Z6GI+Dhw==", "dev": true, "dependencies": { "babel-plugin-transform-flow-strip-types": "^6.22.0" } }, "node_modules/babel-preset-react": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", "integrity": "sha512-phQe3bElbgF887UM0Dhz55d22ob8czTL1kbhZFwpCE6+R/X9kHktfwmx9JZb+bBSVRGphP5tZ9oWhVhlgjrX3Q==", "dev": true, "dependencies": { "babel-plugin-syntax-jsx": "^6.3.13", "babel-plugin-transform-react-display-name": "^6.23.0", "babel-plugin-transform-react-jsx": "^6.24.1", "babel-plugin-transform-react-jsx-self": "^6.22.0", "babel-plugin-transform-react-jsx-source": "^6.22.0", "babel-preset-flow": "^6.23.0" } }, "node_modules/babel-register": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==", "dev": true, "dependencies": { "babel-core": "^6.26.0", "babel-runtime": "^6.26.0", "core-js": "^2.5.0", "home-or-tmp": "^2.0.0", "lodash": "^4.17.4", "mkdirp": "^0.5.1", "source-map-support": "^0.4.15" } }, "node_modules/babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", "dependencies": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" } }, "node_modules/babel-runtime/node_modules/regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "node_modules/babel-template": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", "dev": true, "dependencies": { "babel-runtime": "^6.26.0", "babel-traverse": "^6.26.0", "babel-types": "^6.26.0", "babylon": "^6.18.0", "lodash": "^4.17.4" } }, "node_modules/babel-traverse": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", "dev": true, "dependencies": { "babel-code-frame": "^6.26.0", "babel-messages": "^6.23.0", "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "babylon": "^6.18.0", "debug": "^2.6.8", "globals": "^9.18.0", "invariant": "^2.2.2", "lodash": "^4.17.4" } }, "node_modules/babel-types": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", "dev": true, "dependencies": { "babel-runtime": "^6.26.0", "esutils": "^2.0.2", "lodash": "^4.17.4", "to-fast-properties": "^1.0.3" } }, "node_modules/babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "bin": { "babylon": "bin/babylon.js" } }, "node_modules/backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" }, "node_modules/bail": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "optional": true, "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", "component-emitter": "^1.2.1", "define-property": "^1.0.0", "isobject": "^3.0.1", "mixin-deep": "^1.2.0", "pascalcase": "^0.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/base-x": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", "dependencies": { "safe-buffer": "^5.0.1" } }, "node_modules/base/node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "optional": true, "dependencies": { "is-descriptor": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/base/node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/base64-arraybuffer": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==", "engines": { "node": ">= 0.6.0" } }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "engines": { "node": "^4.5.0 || >= 5.9" } }, "node_modules/better-opn": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz", "integrity": "sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==", "dependencies": { "open": "^7.0.3" }, "engines": { "node": ">8.0.0" } }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, "optional": true, "dependencies": { "file-uri-to-path": "1.0.0" } }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "node_modules/bl/node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" }, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/boxen": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dependencies": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", "chalk": "^4.1.0", "cli-boxes": "^2.2.1", "string-width": "^4.2.2", "type-fest": "^0.20.2", "widest-line": "^3.1.0", "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/boxen/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/boxen/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/boxen/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==", "dev": true, "optional": true, "dependencies": { "expand-range": "^1.8.1", "preserve": "^0.2.0", "repeat-element": "^1.1.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/brcast": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/brcast/-/brcast-3.0.2.tgz", "integrity": "sha512-f5XwwFCCuvgqP2nMH/hJ74FqnGmb4X3D+NC//HphxJzzhsZvSZa+Hk/syB7j3ZHpPDLMoYU8oBgviRWfNvEfKA==" }, "node_modules/browserslist": { "version": "4.21.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" } ], "dependencies": { "caniuse-lite": "^1.0.30001400", "electron-to-chromium": "^1.4.251", "node-releases": "^2.0.6", "update-browserslist-db": "^1.0.9" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dependencies": { "node-int64": "^0.4.0" } }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { "streamsearch": "^1.1.0" }, "engines": { "node": ">=10.16.0" } }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "engines": { "node": ">= 0.8" } }, "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "optional": true, "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", "get-value": "^2.0.6", "has-value": "^1.0.0", "isobject": "^3.0.1", "set-value": "^2.0.0", "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/cache-base/node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/cache-manager": { "version": "2.11.1", "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.11.1.tgz", "integrity": "sha512-XhUuc9eYwkzpK89iNewFwtvcDYMUsvtwzHeyEOPJna/WsVsXcrzsA1ft2M0QqPNunEzLhNCYPo05tEfG+YuNow==", "dependencies": { "async": "1.5.2", "lodash.clonedeep": "4.5.0", "lru-cache": "4.0.0" } }, "node_modules/cache-manager/node_modules/lru-cache": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", "integrity": "sha512-WKhDkjlLwzE8jAQdQlsxLUQTPXLCKX/4cJk6s5AlRtJkDBk0IKH5O51bVDH61K9N4bhbbyvLM6EiOuE8ovApPA==", "dependencies": { "pseudomap": "^1.0.1", "yallist": "^2.0.0" } }, "node_modules/cache-manager/node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, "node_modules/cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "engines": { "node": ">=10.6.0" } }, "node_modules/cacheable-request": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/cacheable-request/node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { "pump": "^3.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "engines": { "node": ">=6" } }, "node_modules/camel-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "node_modules/caniuse-lite": { "version": "1.0.30001442", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz", "integrity": "sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow==", "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" } ] }, "node_modules/capital-case": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, "node_modules/ccount": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/change-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/change-case-all": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.14.tgz", "integrity": "sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA==", "dependencies": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } }, "node_modules/character-entities": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/character-entities-html4": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/character-entities-legacy": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/character-reference-invalid": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "node_modules/cheerio": { "version": "1.0.0-rc.12", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "htmlparser2": "^8.0.1", "parse5": "^7.0.0", "parse5-htmlparser2-tree-adapter": "^7.0.0" }, "engines": { "node": ">= 6" }, "funding": { "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, "node_modules/cheerio-select": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", "css-what": "^6.1.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" }, "funding": { "url": "https://github.com/sponsors/fb55" } }, "node_modules/chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==", "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", "dev": true, "optional": true, "dependencies": { "anymatch": "^1.3.0", "async-each": "^1.0.0", "glob-parent": "^2.0.0", "inherits": "^2.0.1", "is-binary-path": "^1.0.0", "is-glob": "^2.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.0.0" }, "optionalDependencies": { "fsevents": "^1.0.0" } }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "engines": { "node": ">=6.0" } }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "node_modules/class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "optional": true, "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", "isobject": "^3.0.0", "static-extend": "^0.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "optional": true, "dependencies": { "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "node_modules/class-utils/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "optional": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/class-utils/node_modules/kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/classnames": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, "node_modules/cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dependencies": { "restore-cursor": "^3.1.0" }, "engines": { "node": ">=8" } }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "engines": { "node": ">= 10" } }, "node_modules/clipboardy": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", "dependencies": { "arch": "^2.1.1", "execa": "^1.0.0", "is-wsl": "^2.1.1" }, "engines": { "node": ">=8" } }, "node_modules/clipboardy/node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" }, "engines": { "node": ">=4.8" } }, "node_modules/clipboardy/node_modules/execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" }, "engines": { "node": ">=6" } }, "node_modules/clipboardy/node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dependencies": { "pump": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/clipboardy/node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/clipboardy/node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dependencies": { "path-key": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/clipboardy/node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "engines": { "node": ">=4" } }, "node_modules/clipboardy/node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dependencies": { "shebang-regex": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/clipboardy/node_modules/shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/clipboardy/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "bin/which" } }, "node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "node_modules/cliui/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/cliui/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "engines": { "node": ">=0.8" } }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", "shallow-clone": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dependencies": { "mimic-response": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/collapse-white-space": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", "dev": true, "optional": true, "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" }, "engines": { "node": ">=12.5.0" } }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-string": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "node_modules/colorette": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { "delayed-stream": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, "node_modules/comma-separated-tokens": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/command-exists": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "engines": { "node": ">=4.0.0" } }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "node_modules/compose-function": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", "integrity": "sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==", "dependencies": { "arity-n": "^1.0.4" } }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, "engines": { "node": ">= 0.6" } }, "node_modules/compression": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", "compressible": "~2.0.16", "debug": "2.6.9", "on-headers": "~1.0.2", "safe-buffer": "5.1.2", "vary": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "engines": [ "node >= 0.8" ], "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "node_modules/configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "dependencies": { "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", "make-dir": "^3.0.0", "unique-string": "^2.0.0", "write-file-atomic": "^3.0.0", "xdg-basedir": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" }, "node_modules/constant-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case": "^2.0.2" } }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "engines": { "node": ">= 0.6" } }, "node_modules/convert-hrtime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==", "engines": { "node": ">=8" } }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", "hasInstallScript": true }, "node_modules/core-js-compat": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.0.tgz", "integrity": "sha512-YK6fwFjCOKWwGnjFUR3c544YsnA/7DoLL0ysncuOJ4pwbriAtOpvM2bygdlcXbvQCQZ7bBU9CL4t7tGl7ETRpQ==", "dependencies": { "browserslist": "^4.16.3", "semver": "7.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat/node_modules/semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", "bin": { "semver": "bin/semver.js" } }, "node_modules/core-js-pure": { "version": "3.27.1", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.27.1.tgz", "integrity": "sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw==", "hasInstallScript": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dependencies": { "object-assign": "^4", "vary": "^1" }, "engines": { "node": ">= 0.10" } }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" }, "engines": { "node": ">=10" } }, "node_modules/create-gatsby": { "version": "2.25.0", "resolved": "https://registry.npmjs.org/create-gatsby/-/create-gatsby-2.25.0.tgz", "integrity": "sha512-96Kl/6Far2j65/vFv/6Mb9+T+/4oW8hlC3UmdfjgBgUIzTPFmezY1ygPu2dfCKjprWkArB8DpE7EsAaJoRKB1Q==", "dependencies": { "@babel/runtime": "^7.15.4" }, "bin": { "create-gatsby": "cli.js" } }, "node_modules/cross-fetch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "dependencies": { "node-fetch": "2.6.7" } }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "engines": { "node": ">=8" } }, "node_modules/css": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", "dependencies": { "inherits": "^2.0.3", "source-map": "^0.6.1", "source-map-resolve": "^0.5.2", "urix": "^0.1.0" } }, "node_modules/css-declaration-sorter": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", "engines": { "node": "^10 || ^12 || >=14" }, "peerDependencies": { "postcss": "^8.0.9" } }, "node_modules/css-loader": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", "dependencies": { "icss-utils": "^5.1.0", "loader-utils": "^2.0.0", "postcss": "^8.2.15", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.1.0", "schema-utils": "^3.0.0", "semver": "^7.3.5" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^4.27.0 || ^5.0.0" } }, "node_modules/css-loader/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/css-loader/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/css-loader/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/css-minimizer-webpack-plugin": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-2.0.0.tgz", "integrity": "sha512-cG/uc94727tx5pBNtb1Sd7gvUPzwmcQi1lkpfqTpdkuNq75hJCw7bIVsCNijLm4dhDcr1atvuysl2rZqOG8Txw==", "dependencies": { "cssnano": "^5.0.0", "jest-worker": "^26.3.0", "p-limit": "^3.0.2", "postcss": "^8.2.9", "schema-utils": "^3.0.0", "serialize-javascript": "^5.0.1", "source-map": "^0.6.1" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^5.0.0" }, "peerDependenciesMeta": { "clean-css": { "optional": true }, "csso": { "optional": true } } }, "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, "node_modules/css-select": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/fb55" } }, "node_modules/css-selector-parser": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==" }, "node_modules/css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/css-tree/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, "node_modules/css-vendor": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz", "integrity": "sha512-Vx/Vl3zsHj32Z+WTNzGjd2iSbSIJTYHMmyGUT2nzCjj0Xk4qLfwpQ8nF6TQ5oo3Cf0s/An3DTc7LclH1BkAXbQ==", "dependencies": { "is-in-browser": "^1.0.2" } }, "node_modules/css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "engines": { "node": ">= 6" }, "funding": { "url": "https://github.com/sponsors/fb55" } }, "node_modules/css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" }, "node_modules/css/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "bin": { "cssesc": "bin/cssesc" }, "engines": { "node": ">=4" } }, "node_modules/cssfilter": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" }, "node_modules/cssnano": { "version": "5.1.14", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", "dependencies": { "cssnano-preset-default": "^5.2.13", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/cssnano" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/cssnano-preset-default": { "version": "5.2.13", "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", "dependencies": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", "postcss-merge-longhand": "^5.1.7", "postcss-merge-rules": "^5.1.3", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", "postcss-normalize-positions": "^5.1.1", "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", "postcss-reduce-initial": "^5.1.1", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/cssnano-utils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/csso": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dependencies": { "css-tree": "^1.1.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/csstype": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dependencies": { "es5-ext": "^0.10.50", "type": "^1.0.1" } }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" }, "node_modules/date-fns": { "version": "2.29.3", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", "engines": { "node": ">=0.11" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/date-fns" } }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "engines": { "node": ">=0.10.0" } }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "engines": { "node": ">=0.10" } }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dependencies": { "mimic-response": "^3.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "engines": { "node": ">=4.0.0" } }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "engines": { "node": ">=0.10.0" } }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "engines": { "node": ">=10" } }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "engines": { "node": ">=8" } }, "node_modules/define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "optional": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/define-property/node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { "node": ">=0.4.0" } }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { "node": ">= 0.8" } }, "node_modules/dependency-graph": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "engines": { "node": ">= 0.6.0" } }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/detab": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", "dependencies": { "repeat-string": "^1.5.4" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==", "dev": true, "dependencies": { "repeating": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "bin": { "detect-libc": "bin/detect-libc.js" }, "engines": { "node": ">=0.10" } }, "node_modules/detect-port": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dependencies": { "address": "^1.0.1", "debug": "4" }, "bin": { "detect": "bin/detect-port.js", "detect-port": "bin/detect-port.js" } }, "node_modules/detect-port-alt": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", "dependencies": { "address": "^1.0.1", "debug": "^2.6.0" }, "bin": { "detect": "bin/detect-port", "detect-port": "bin/detect-port" }, "engines": { "node": ">= 4.2.1" } }, "node_modules/detect-port/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/detect-port/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/devcert": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.2.2.tgz", "integrity": "sha512-UsLqvtJGPiGwsIZnJINUnFYaWgK7CroreGRndWHZkRD58tPFr3pVbbSyHR8lbh41+azR4jKvuNZ+eCoBZGA5kA==", "dependencies": { "@types/configstore": "^2.1.1", "@types/debug": "^0.0.30", "@types/get-port": "^3.2.0", "@types/glob": "^5.0.34", "@types/lodash": "^4.14.92", "@types/mkdirp": "^0.5.2", "@types/node": "^8.5.7", "@types/rimraf": "^2.0.2", "@types/tmp": "^0.0.33", "application-config-path": "^0.1.0", "command-exists": "^1.2.4", "debug": "^3.1.0", "eol": "^0.9.1", "get-port": "^3.2.0", "glob": "^7.1.2", "is-valid-domain": "^0.1.6", "lodash": "^4.17.4", "mkdirp": "^0.5.1", "password-prompt": "^1.0.4", "rimraf": "^2.6.2", "sudo-prompt": "^8.2.0", "tmp": "^0.0.33", "tslib": "^1.10.0" } }, "node_modules/devcert/node_modules/@types/node": { "version": "8.10.66", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" }, "node_modules/devcert/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { "ms": "^2.1.1" } }, "node_modules/devcert/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/devcert/node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dependencies": { "os-tmpdir": "~1.0.2" }, "engines": { "node": ">=0.6.0" } }, "node_modules/devcert/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dependencies": { "path-type": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=6.0.0" } }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dependencies": { "utila": "~0.4" } }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } ] }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dependencies": { "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" }, "funding": { "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/domutils": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.1" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/dot-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dependencies": { "is-obj": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/dotenv": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", "engines": { "node": ">=10" } }, "node_modules/dotenv-expand": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "node_modules/duplexer3": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "engines": { "node": ">= 4" } }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { "once": "^1.4.0" } }, "node_modules/engine.io": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.2.tgz", "integrity": "sha512-t5z6zjXuVLhXDMiFJPYsPOWEER8B0tIsD3ETgw19S1yg9zryvUfY3Vhtk3Gf4sihw/bQGIqQ//gjvVlu+Ca0bQ==", "dependencies": { "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~4.0.0", "ws": "~7.4.2" }, "engines": { "node": ">=10.0.0" } }, "node_modules/engine.io-client": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-4.1.4.tgz", "integrity": "sha512-843fqAdKeUMFqKi1sSjnR11tJ4wi8sIefu6+JC1OzkkJBmjtc/gM/rZ53tJfu5Iae/3gApm5veoS+v+gtT0+Fg==", "dependencies": { "base64-arraybuffer": "0.1.4", "component-emitter": "~1.3.0", "debug": "~4.3.1", "engine.io-parser": "~4.0.1", "has-cors": "1.1.0", "parseqs": "0.0.6", "parseuri": "0.0.6", "ws": "~7.4.2", "xmlhttprequest-ssl": "~1.6.2", "yeast": "0.1.2" } }, "node_modules/engine.io-client/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/engine.io-client/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/engine.io-parser": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.3.tgz", "integrity": "sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==", "dependencies": { "base64-arraybuffer": "0.1.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/engine.io/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/engine.io/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/enhanced-resolve": { "version": "5.12.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" }, "engines": { "node": ">=10.13.0" } }, "node_modules/enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dependencies": { "ansi-colors": "^4.1.1" }, "engines": { "node": ">=8.6" } }, "node_modules/entities": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", "engines": { "node": ">=0.12" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/envinfo": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "bin": { "envinfo": "dist/cli.js" }, "engines": { "node": ">=4" } }, "node_modules/eol": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/error-stack-parser": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dependencies": { "stackframe": "^1.3.4" } }, "node_modules/es-abstract": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.0.tgz", "integrity": "sha512-GUGtW7eXQay0c+PRq0sGIKSdaBorfVqsCMhGHo4elP7YVqZu9nCZS4UkK4gv71gOWNMra/PaSKD3ao1oWExO0g==", "dependencies": { "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.0", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.4", "is-array-buffer": "^3.0.0", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", "dependencies": { "has": "^1.0.3" } }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es5-ext": { "version": "0.10.62", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", "hasInstallScript": true, "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", "next-tick": "^1.1.0" }, "engines": { "node": ">=0.10" } }, "node_modules/es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dependencies": { "d": "1", "es5-ext": "^0.10.35", "es6-symbol": "^3.1.1" } }, "node_modules/es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "node_modules/es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "dependencies": { "d": "^1.0.1", "ext": "^1.1.2" } }, "node_modules/es6-weak-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "dependencies": { "d": "1", "es5-ext": "^0.10.46", "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.1" } }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { "node": ">=6" } }, "node_modules/escape-goat": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", "engines": { "node": ">=8" } }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } }, "node_modules/eslint": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", "espree": "^7.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.1.2", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "progress": "^2.0.0", "regexpp": "^3.1.0", "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { "node": "^10.12.0 || >=12.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-react-app": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", "dependencies": { "confusing-browser-globals": "^1.0.10" }, "engines": { "node": "^10.12.0 || >=12.0.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^4.0.0", "@typescript-eslint/parser": "^4.0.0", "babel-eslint": "^10.0.0", "eslint": "^7.5.0", "eslint-plugin-flowtype": "^5.2.0", "eslint-plugin-import": "^2.22.0", "eslint-plugin-jest": "^24.0.0", "eslint-plugin-jsx-a11y": "^6.3.1", "eslint-plugin-react": "^7.20.3", "eslint-plugin-react-hooks": "^4.0.8", "eslint-plugin-testing-library": "^3.9.0" }, "peerDependenciesMeta": { "eslint-plugin-jest": { "optional": true }, "eslint-plugin-testing-library": { "optional": true } } }, "node_modules/eslint-import-resolver-node": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dependencies": { "debug": "^3.2.7", "resolve": "^1.20.0" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-node/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/eslint-module-utils": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", "dependencies": { "debug": "^3.2.7" }, "engines": { "node": ">=4" }, "peerDependenciesMeta": { "eslint": { "optional": true } } }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/eslint-plugin-flowtype": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.10.0.tgz", "integrity": "sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw==", "dependencies": { "lodash": "^4.17.15", "string-natural-compare": "^3.0.1" }, "engines": { "node": "^10.12.0 || >=12.0.0" }, "peerDependencies": { "eslint": "^7.1.0" } }, "node_modules/eslint-plugin-import": { "version": "2.26.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "dependencies": { "array-includes": "^3.1.4", "array.prototype.flat": "^1.2.5", "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", "eslint-module-utils": "^2.7.3", "has": "^1.0.3", "is-core-module": "^2.8.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.values": "^1.1.5", "resolve": "^1.22.0", "tsconfig-paths": "^3.14.1" }, "engines": { "node": ">=4" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/eslint-plugin-import/node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/eslint-plugin-import/node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.6.1", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", "dependencies": { "@babel/runtime": "^7.18.9", "aria-query": "^4.2.2", "array-includes": "^3.1.5", "ast-types-flow": "^0.0.7", "axe-core": "^4.4.3", "axobject-query": "^2.2.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "has": "^1.0.3", "jsx-ast-utils": "^3.3.2", "language-tags": "^1.0.5", "minimatch": "^3.1.2", "semver": "^6.3.0" }, "engines": { "node": ">=4.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-react": { "version": "7.31.11", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.6", "object.fromentries": "^2.0.6", "object.hasown": "^1.1.2", "object.values": "^1.1.6", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.3", "semver": "^6.3.0", "string.prototype.matchall": "^4.0.8" }, "engines": { "node": ">=4" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "node_modules/eslint-plugin-react-hooks": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "engines": { "node": ">=10" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/eslint-plugin-react/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/eslint-scope/node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "engines": { "node": ">=4.0" } }, "node_modules/eslint-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dependencies": { "eslint-visitor-keys": "^2.0.0" }, "engines": { "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" }, "peerDependencies": { "eslint": ">=5" } }, "node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "engines": { "node": ">=10" } }, "node_modules/eslint-webpack-plugin": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.7.0.tgz", "integrity": "sha512-bNaVVUvU4srexGhVcayn/F4pJAz19CWBkKoMx7aSQ4wtTbZQCnG5O9LHCE42mM+JSKOUp7n6vd5CIwzj7lOVGA==", "dependencies": { "@types/eslint": "^7.29.0", "arrify": "^2.0.1", "jest-worker": "^27.5.1", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "schema-utils": "^3.1.1" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0", "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/eslint-webpack-plugin/node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/eslint-webpack-plugin/node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": ">= 10.13.0" } }, "node_modules/eslint-webpack-plugin/node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, "node_modules/eslint-webpack-plugin/node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { "node": ">=0.10.0" } }, "node_modules/eslint-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/eslint/node_modules/@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dependencies": { "@babel/highlight": "^7.10.4" } }, "node_modules/eslint/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/eslint/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "engines": { "node": ">=4" } }, "node_modules/eslint/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/eslint/node_modules/globals": { "version": "13.19.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "engines": { "node": ">= 4" } }, "node_modules/eslint/node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/eslint/node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/eslint/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/eslint/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/eslint/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/eslint/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/eslint/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dependencies": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/espree/node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "engines": { "node": ">=4" } }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, "node_modules/esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dependencies": { "estraverse": "^5.1.0" }, "engines": { "node": ">=0.10" } }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dependencies": { "estraverse": "^5.2.0" }, "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "engines": { "node": ">=0.10.0" } }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } }, "node_modules/event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", "dependencies": { "d": "1", "es5-ext": "~0.10.14" } }, "node_modules/event-source-polyfill": { "version": "1.0.25", "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.25.tgz", "integrity": "sha512-hQxu6sN1Eq4JjoI7ITdQeGGUN193A2ra83qC0Ltm9I2UJVAten3OFVN6k5RX4YWeCS0BoC8xg/5czOCIHVosQg==" }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { "node": ">=0.8.x" } }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==", "dev": true, "optional": true, "dependencies": { "is-posix-bracket": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/expand-range": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", "dev": true, "optional": true, "dependencies": { "fill-range": "^2.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "engines": { "node": ">=6" } }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", "serve-static": "1.15.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.10.0" } }, "node_modules/express-graphql": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/express-graphql/-/express-graphql-0.12.0.tgz", "integrity": "sha512-DwYaJQy0amdy3pgNtiTDuGGM2BLdj+YO2SgbKoLliCfuHv3VVTt7vNG/ZqK2hRYjtYHE2t2KB705EU94mE64zg==", "dependencies": { "accepts": "^1.3.7", "content-type": "^1.0.4", "http-errors": "1.8.0", "raw-body": "^2.4.1" }, "engines": { "node": ">= 10.x" }, "peerDependencies": { "graphql": "^14.7.0 || ^15.3.0" } }, "node_modules/express-graphql/node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "engines": { "node": ">= 0.6" } }, "node_modules/express-graphql/node_modules/http-errors": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/express-graphql/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "engines": { "node": ">= 0.6" } }, "node_modules/express-graphql/node_modules/toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "engines": { "node": ">=0.6" } }, "node_modules/express-http-proxy": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/express-http-proxy/-/express-http-proxy-1.6.3.tgz", "integrity": "sha512-/l77JHcOUrDUX8V67E287VEUQT0lbm71gdGVoodnlWBziarYKgMcpqT7xvh/HM8Jv52phw8Bd8tY+a7QjOr7Yg==", "dependencies": { "debug": "^3.0.1", "es6-promise": "^4.1.1", "raw-body": "^2.3.0" }, "engines": { "node": ">=6.0.0" } }, "node_modules/express-http-proxy/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { "ms": "^2.1.1" } }, "node_modules/express-http-proxy/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/express/node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dependencies": { "type": "^2.7.2" } }, "node_modules/ext/node_modules/type": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dependencies": { "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" }, "engines": { "node": ">=4" } }, "node_modules/external-editor/node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dependencies": { "os-tmpdir": "~1.0.2" }, "engines": { "node": ">=0.6.0" } }, "node_modules/extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==", "dev": true, "optional": true, "dependencies": { "is-extglob": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-glob/node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/fast-glob/node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/fast-glob/node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/fast-glob/node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/fast-glob/node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "engines": { "node": ">= 4.9.1" } }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dependencies": { "bser": "2.1.1" } }, "node_modules/fbjs": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", "dependencies": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", "loose-envify": "^1.0.0", "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", "ua-parser-js": "^0.7.30" } }, "node_modules/fbjs-css-vars": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" }, "node_modules/fd": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/fd/-/fd-0.0.3.tgz", "integrity": "sha512-iAHrIslQb3U68OcMSP0kkNWabp7sSN6d2TBSb2JO3gcLJVDd4owr/hKM4SFJovFOUeeXeItjYgouEDTMWiVAnA==" }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dependencies": { "escape-string-regexp": "^1.0.5" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dependencies": { "flat-cache": "^3.0.4" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/file-type": { "version": "16.5.4", "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", "dependencies": { "readable-web-to-node-stream": "^3.0.0", "strtok3": "^6.2.4", "token-types": "^4.1.1" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true, "optional": true }, "node_modules/filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", "engines": { "node": ">=4" } }, "node_modules/filenamify": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", "dependencies": { "filename-reserved-regex": "^2.0.0", "strip-outer": "^1.0.1", "trim-repeated": "^1.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/filesize": { "version": "8.0.7", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", "engines": { "node": ">= 0.4.0" } }, "node_modules/fill-range": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "optional": true, "dependencies": { "is-number": "^2.1.0", "isobject": "^2.0.0", "randomatic": "^3.0.0", "repeat-element": "^1.1.2", "repeat-string": "^1.5.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/filter-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flat-cache/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, "node_modules/follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], "engines": { "node": ">=4.0" }, "peerDependenciesMeta": { "debug": { "optional": true } } }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/for-own": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", "dev": true, "optional": true, "dependencies": { "for-in": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", "dependencies": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", "chalk": "^4.1.0", "chokidar": "^3.4.2", "cosmiconfig": "^6.0.0", "deepmerge": "^4.2.2", "fs-extra": "^9.0.0", "glob": "^7.1.6", "memfs": "^3.1.2", "minimatch": "^3.0.4", "schema-utils": "2.7.0", "semver": "^7.3.2", "tapable": "^1.0.0" }, "engines": { "node": ">=10", "yarn": ">=1.0.0" }, "peerDependencies": { "eslint": ">= 6", "typescript": ">= 2.7", "vue-template-compiler": "*", "webpack": ">= 4" }, "peerDependenciesMeta": { "eslint": { "optional": true }, "vue-template-compiler": { "optional": true } } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.7.2" }, "engines": { "node": ">=8" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { "node": ">=0.10.0" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, "engines": { "node": ">=8.10.0" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dependencies": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", "ajv-keywords": "^3.4.1" }, "engines": { "node": ">= 8.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "engines": { "node": ">=6" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" } }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "engines": { "node": ">= 0.6" } }, "node_modules/fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "engines": { "node": "*" }, "funding": { "type": "patreon", "url": "https://www.patreon.com/infusion" } }, "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", "dev": true, "optional": true, "dependencies": { "map-cache": "^0.2.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "node_modules/fs-exists-cached": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", "integrity": "sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==" }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { "node": ">=12" } }, "node_modules/fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", "dev": true, "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "dependencies": { "bindings": "^1.5.0", "nan": "^2.12.1" }, "engines": { "node": ">= 4.0" } }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.0", "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gatsby": { "version": "4.25.2", "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-4.25.2.tgz", "integrity": "sha512-HKSWRdTOK5IBFDDgCKiPXiyszfdTTGZ+pple6My6dQ5a5U+Gn1PpjBIiYj4Me9WJAveQzC7tChsqBVVt7r6few==", "hasInstallScript": true, "dependencies": { "@babel/code-frame": "^7.14.0", "@babel/core": "^7.15.5", "@babel/eslint-parser": "^7.15.4", "@babel/helper-plugin-utils": "^7.14.5", "@babel/parser": "^7.15.5", "@babel/runtime": "^7.15.4", "@babel/traverse": "^7.15.4", "@babel/types": "^7.15.4", "@builder.io/partytown": "^0.5.2", "@gatsbyjs/reach-router": "^1.3.9", "@gatsbyjs/webpack-hot-middleware": "^2.25.2", "@graphql-codegen/add": "^3.1.1", "@graphql-codegen/core": "^2.5.1", "@graphql-codegen/plugin-helpers": "^2.4.2", "@graphql-codegen/typescript": "^2.4.8", "@graphql-codegen/typescript-operations": "^2.3.5", "@graphql-tools/code-file-loader": "^7.2.14", "@graphql-tools/load": "^7.5.10", "@jridgewell/trace-mapping": "^0.3.13", "@nodelib/fs.walk": "^1.2.8", "@parcel/cache": "2.6.2", "@parcel/core": "2.6.2", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", "@types/http-proxy": "^1.17.7", "@typescript-eslint/eslint-plugin": "^4.33.0", "@typescript-eslint/parser": "^4.33.0", "@vercel/webpack-asset-relocator-loader": "^1.7.0", "acorn-loose": "^8.3.0", "acorn-walk": "^8.2.0", "address": "1.1.2", "anser": "^2.1.0", "autoprefixer": "^10.4.0", "axios": "^0.21.1", "babel-loader": "^8.2.3", "babel-plugin-add-module-exports": "^1.0.4", "babel-plugin-dynamic-import-node": "^2.3.3", "babel-plugin-lodash": "^3.3.4", "babel-plugin-remove-graphql-queries": "^4.25.0", "babel-preset-gatsby": "^2.25.0", "better-opn": "^2.1.1", "bluebird": "^3.7.2", "browserslist": "^4.17.5", "cache-manager": "^2.11.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", "common-tags": "^1.8.0", "compression": "^1.7.4", "cookie": "^0.4.1", "core-js": "^3.22.3", "cors": "^2.8.5", "css-loader": "^5.2.7", "css-minimizer-webpack-plugin": "^2.0.0", "css.escape": "^1.5.1", "date-fns": "^2.25.0", "debug": "^3.2.7", "deepmerge": "^4.2.2", "detect-port": "^1.3.0", "devcert": "^1.2.0", "dotenv": "^8.6.0", "enhanced-resolve": "^5.8.3", "error-stack-parser": "^2.1.4", "eslint": "^7.32.0", "eslint-config-react-app": "^6.0.0", "eslint-plugin-flowtype": "^5.10.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.6.1", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", "eslint-webpack-plugin": "^2.7.0", "event-source-polyfill": "1.0.25", "execa": "^5.1.1", "express": "^4.17.1", "express-graphql": "^0.12.0", "express-http-proxy": "^1.6.3", "fastest-levenshtein": "^1.0.12", "fastq": "^1.13.0", "file-loader": "^6.2.0", "find-cache-dir": "^3.3.2", "fs-exists-cached": "1.0.0", "fs-extra": "^10.1.0", "gatsby-cli": "^4.25.0", "gatsby-core-utils": "^3.25.0", "gatsby-graphiql-explorer": "^2.25.0", "gatsby-legacy-polyfills": "^2.25.0", "gatsby-link": "^4.25.0", "gatsby-page-utils": "^2.25.0", "gatsby-parcel-config": "0.16.0", "gatsby-plugin-page-creator": "^4.25.0", "gatsby-plugin-typescript": "^4.25.0", "gatsby-plugin-utils": "^3.19.0", "gatsby-react-router-scroll": "^5.25.0", "gatsby-script": "^1.10.0", "gatsby-telemetry": "^3.25.0", "gatsby-worker": "^1.25.0", "glob": "^7.2.3", "globby": "^11.1.0", "got": "^11.8.5", "graphql": "^15.7.2", "graphql-compose": "^9.0.7", "graphql-playground-middleware-express": "^1.7.22", "graphql-tag": "^2.12.6", "hasha": "^5.2.2", "invariant": "^2.2.4", "is-relative": "^1.0.0", "is-relative-url": "^3.0.0", "joi": "^17.4.2", "json-loader": "^0.5.7", "latest-version": "5.1.0", "lmdb": "2.5.3", "lodash": "^4.17.21", "md5-file": "^5.0.0", "meant": "^1.0.3", "memoizee": "^0.4.15", "micromatch": "^4.0.4", "mime": "^2.5.2", "mini-css-extract-plugin": "1.6.2", "mitt": "^1.2.0", "moment": "^2.29.1", "multer": "^1.4.5-lts.1", "node-fetch": "^2.6.6", "node-html-parser": "^5.3.3", "normalize-path": "^3.0.0", "null-loader": "^4.0.1", "opentracing": "^0.14.5", "p-defer": "^3.0.0", "parseurl": "^1.3.3", "physical-cpu-count": "^2.0.0", "platform": "^1.3.6", "postcss": "^8.3.11", "postcss-flexbugs-fixes": "^5.0.2", "postcss-loader": "^5.3.0", "prompts": "^2.4.2", "prop-types": "^15.7.2", "query-string": "^6.14.1", "raw-loader": "^4.0.2", "react-dev-utils": "^12.0.1", "react-refresh": "^0.14.0", "react-server-dom-webpack": "0.0.0-experimental-c8b778b7f-20220825", "redux": "4.1.2", "redux-thunk": "^2.4.0", "resolve-from": "^5.0.0", "semver": "^7.3.7", "shallow-compare": "^1.2.2", "signal-exit": "^3.0.5", "slugify": "^1.6.1", "socket.io": "3.1.2", "socket.io-client": "3.1.3", "st": "^2.0.0", "stack-trace": "^0.0.10", "string-similarity": "^1.2.2", "strip-ansi": "^6.0.1", "style-loader": "^2.0.0", "terser-webpack-plugin": "^5.2.4", "tmp": "^0.2.1", "true-case-path": "^2.2.1", "type-of": "^2.0.1", "url-loader": "^4.1.1", "uuid": "^8.3.2", "webpack": "^5.61.0", "webpack-dev-middleware": "^4.3.0", "webpack-merge": "^5.8.0", "webpack-stats-plugin": "^1.0.3", "webpack-virtual-modules": "^0.3.2", "xstate": "4.32.1", "yaml-loader": "^0.8.0" }, "bin": { "gatsby": "cli.js" }, "engines": { "node": ">=14.15.0" }, "optionalDependencies": { "gatsby-sharp": "^0.19.0" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0", "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0" } }, "node_modules/gatsby-cli": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-4.25.0.tgz", "integrity": "sha512-CJ2PCsfFmn9Xqc/jg9MFMU1BG5oQGiej1TFFx8GhChJ+kGhi9ANnNM+qo1K4vOmoMnsT4SSGiPAFD10AWFqpAQ==", "hasInstallScript": true, "dependencies": { "@babel/code-frame": "^7.14.0", "@babel/core": "^7.15.5", "@babel/generator": "^7.16.8", "@babel/helper-plugin-utils": "^7.16.7", "@babel/preset-typescript": "^7.16.7", "@babel/runtime": "^7.15.4", "@babel/template": "^7.16.7", "@babel/types": "^7.16.8", "@jridgewell/trace-mapping": "^0.3.13", "@types/common-tags": "^1.8.1", "better-opn": "^2.1.1", "boxen": "^5.1.2", "chalk": "^4.1.2", "clipboardy": "^2.3.0", "common-tags": "^1.8.2", "convert-hrtime": "^3.0.0", "create-gatsby": "^2.25.0", "envinfo": "^7.8.1", "execa": "^5.1.1", "fs-exists-cached": "^1.0.0", "fs-extra": "^10.1.0", "gatsby-core-utils": "^3.25.0", "gatsby-telemetry": "^3.25.0", "hosted-git-info": "^3.0.8", "is-valid-path": "^0.1.1", "joi": "^17.4.2", "lodash": "^4.17.21", "node-fetch": "^2.6.6", "opentracing": "^0.14.5", "pretty-error": "^2.1.2", "progress": "^2.0.3", "prompts": "^2.4.2", "redux": "4.1.2", "resolve-cwd": "^3.0.0", "semver": "^7.3.7", "signal-exit": "^3.0.6", "stack-trace": "^0.0.10", "strip-ansi": "^6.0.1", "update-notifier": "^5.1.0", "yargs": "^15.4.1", "yoga-layout-prebuilt": "^1.10.0", "yurnalist": "^2.1.0" }, "bin": { "gatsby": "cli.js" }, "engines": { "node": ">=14.15.0" } }, "node_modules/gatsby-cli/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/gatsby-cli/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/gatsby-cli/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/gatsby-cli/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/gatsby-cli/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/gatsby-cli/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/gatsby-cli/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/gatsby-cli/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/gatsby-core-utils": { "version": "3.25.0", "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.25.0.tgz", "integrity": "sha512-lmMDwbnKpqAi+8WWd7MvCTCx3E0u7j8sbVgydERNCYVxKVpzD/aLCH4WPb4EE9m1H1rSm76w0Z+MaentyB/c/Q==", "dependencies": { "@babel/runtime": "^7.15.4", "ci-info": "2.0.0", "configstore": "^5.0.1", "fastq": "^1.13.0", "file-type": "^16.5.3", "fs-extra": "^10.1.0", "got": "^11.8.5", "import-from": "^4.0.0", "lmdb": "2.5.3", "lock": "^1.1.0", "node-object-hash": "^2.3.10", "proper-lockfile": "^4.1.2", "resolve-from": "^5.0.0", "tmp": "^0.2.1", "xdg-basedir": "^4.0.0" }, "engines": { "node": ">=14.15.0" } }, "node_modules/gatsby-graphiql-explorer": { "version": "2.25.0", "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-2.25.0.tgz", "integrity": "sha512-/NDsaW4x3/KtvzmxYvedhDwUW1kb7gQO6iOhCkillVJSYBd6mPB8aOSulM49fyCT76UXGYFtRaUI8fyOkmpWhg==", "dependencies": { "@babel/runtime": "^7.15.4" }, "engines": { "node": ">=14.15.0" } }, "node_modules/gatsby-image": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/gatsby-image/-/gatsby-image-2.11.0.tgz", "integrity": "sha512-H1va64RgXizYXONhoqB3rAdSqALZi0hkBYqEsc0peVEYzb2maRhEwOchg65hKvp3HT/ahnfrik59epRguYvi/g==", "deprecated": "gatsby-image is now gatsby-plugin-image: https://npm.im/gatsby-plugin-image. This package will no longer receive updates.", "dependencies": { "@babel/runtime": "^7.12.5", "object-fit-images": "^3.2.4", "prop-types": "^15.7.2" }, "engines": { "node": ">=10.13.0" } }, "node_modules/gatsby-legacy-polyfills": { "version": "2.25.0", "resolved": "https://registry.npmjs.org/gatsby-legacy-polyfills/-/gatsby-legacy-polyfills-2.25.0.tgz", "integrity": "sha512-cMeFwMH1FGENo2gNpyTyMYc/CJ7uBGE26n89OGrVVvBMaQegK+CMNZBOh09sLrXUcOp8hSOX2IwzvOlo6CdWpg==", "dependencies": { "@babel/runtime": "^7.15.4", "core-js-compat": "3.9.0" } }, "node_modules/gatsby-link": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-4.25.0.tgz", "integrity": "sha512-Fpwk45sUMPvFUAZehNE8SLb3vQyVSxt9YxU++ZZECyukK4A/3Wxk3eIzoNvwfpMfWu6pnAkqcBhIO6KAfvbPGQ==", "dependencies": { "@types/reach__router": "^1.3.10", "gatsby-page-utils": "^2.25.0", "prop-types": "^15.8.1" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "@gatsbyjs/reach-router": "^1.3.5", "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0", "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0" } }, "node_modules/gatsby-page-utils": { "version": "2.25.0", "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-2.25.0.tgz", "integrity": "sha512-TlwS149JCeb3xGANeV8HdcQi9Q8J9hYwlO9jdxLGVIXVGbWIMWFrDuwx382jOOsISGQ3jfByToNulUzO6fiqig==", "dependencies": { "@babel/runtime": "^7.15.4", "bluebird": "^3.7.2", "chokidar": "^3.5.3", "fs-exists-cached": "^1.0.0", "gatsby-core-utils": "^3.25.0", "glob": "^7.2.3", "lodash": "^4.17.21", "micromatch": "^4.0.5" }, "engines": { "node": ">=14.15.0" } }, "node_modules/gatsby-page-utils/node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/gatsby-page-utils/node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" } }, "node_modules/gatsby-page-utils/node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/gatsby-page-utils/node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/gatsby-page-utils/node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/gatsby-page-utils/node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/gatsby-page-utils/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/gatsby-page-utils/node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/gatsby-page-utils/node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/gatsby-page-utils/node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/gatsby-page-utils/node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, "node_modules/gatsby-page-utils/node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { "node": ">=0.10.0" } }, "node_modules/gatsby-page-utils/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, "engines": { "node": ">=8.10.0" } }, "node_modules/gatsby-parcel-config": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/gatsby-parcel-config/-/gatsby-parcel-config-0.16.0.tgz", "integrity": "sha512-2+hOg6cMBGZ8r+4lN3k+dOWGvku453vbZCAhp6V3RuFYxbWuvDFP7Icr0GCOyZ62utkFr9m7H2U1Wjf4KOHyEQ==", "dependencies": { "@gatsbyjs/parcel-namer-relative-to-cwd": "^1.10.0", "@parcel/bundler-default": "2.6.2", "@parcel/compressor-raw": "2.6.2", "@parcel/namer-default": "2.6.2", "@parcel/optimizer-terser": "2.6.2", "@parcel/packager-js": "2.6.2", "@parcel/packager-raw": "2.6.2", "@parcel/reporter-dev-server": "2.6.2", "@parcel/resolver-default": "2.6.2", "@parcel/runtime-js": "2.6.2", "@parcel/transformer-js": "2.6.2", "@parcel/transformer-json": "2.6.2" }, "engines": { "parcel": "2.x" }, "peerDependencies": { "@parcel/core": "^2.0.0" } }, "node_modules/gatsby-plugin-google-analytics": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-google-analytics/-/gatsby-plugin-google-analytics-4.25.0.tgz", "integrity": "sha512-fbHrViBAbJ0Ch2gcpuJQlGxWoapaNed42k75eR4gCiZPzaTUvCKagJgLG8ro8ukD1rfD594lgLzdSEaYYcH4WQ==", "dependencies": { "@babel/runtime": "^7.15.4", "minimatch": "3.0.4", "web-vitals": "^1.1.2" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next", "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0", "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0" } }, "node_modules/gatsby-plugin-google-analytics/node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/gatsby-plugin-manifest": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-manifest/-/gatsby-plugin-manifest-4.25.0.tgz", "integrity": "sha512-2n7v+TvhWUMoOJEaeiPDFsf9jvOImKLZpnzxE8e6ZeeoGeDngXSZhkkP3x2UYIknHtZXUUjFJh8BaVBXiB1dSQ==", "dependencies": { "@babel/runtime": "^7.15.4", "gatsby-core-utils": "^3.25.0", "gatsby-plugin-utils": "^3.19.0", "semver": "^7.3.7", "sharp": "^0.30.7" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next" } }, "node_modules/gatsby-plugin-manifest/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/gatsby-plugin-manifest/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/gatsby-plugin-manifest/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/gatsby-plugin-offline": { "version": "5.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-offline/-/gatsby-plugin-offline-5.25.0.tgz", "integrity": "sha512-WqAcnYvMpL1xwXF5Jf9BXTihLNktuqQHFUX0TPsQVJrmfjSNv4LxhgiWfeUuGiCO881EOHClXnBn6TqxIdS4EA==", "dependencies": { "@babel/runtime": "^7.15.4", "cheerio": "^1.0.0-rc.10", "gatsby-core-utils": "^3.25.0", "glob": "^7.2.3", "idb-keyval": "^3.2.0", "lodash": "^4.17.21", "workbox-build": "^4.3.1" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next", "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0", "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0" } }, "node_modules/gatsby-plugin-page-creator": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-4.25.0.tgz", "integrity": "sha512-plHek7xHSV9l1bLPa1JAnxzBqP7j2ihCPRwpBk/wIJAR8cG65wjAT+Nu8DKpW0+2/MYill84ns1r2m8g0L/7bg==", "dependencies": { "@babel/runtime": "^7.15.4", "@babel/traverse": "^7.15.4", "@sindresorhus/slugify": "^1.1.2", "chokidar": "^3.5.3", "fs-exists-cached": "^1.0.0", "fs-extra": "^10.1.0", "gatsby-core-utils": "^3.25.0", "gatsby-page-utils": "^2.25.0", "gatsby-plugin-utils": "^3.19.0", "gatsby-telemetry": "^3.25.0", "globby": "^11.1.0", "lodash": "^4.17.21" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next" } }, "node_modules/gatsby-plugin-page-creator/node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/gatsby-plugin-page-creator/node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" } }, "node_modules/gatsby-plugin-page-creator/node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/gatsby-plugin-page-creator/node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/gatsby-plugin-page-creator/node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/gatsby-plugin-page-creator/node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/gatsby-plugin-page-creator/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/gatsby-plugin-page-creator/node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/gatsby-plugin-page-creator/node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/gatsby-plugin-page-creator/node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/gatsby-plugin-page-creator/node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { "node": ">=0.10.0" } }, "node_modules/gatsby-plugin-page-creator/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, "engines": { "node": ">=8.10.0" } }, "node_modules/gatsby-plugin-plausible": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/gatsby-plugin-plausible/-/gatsby-plugin-plausible-0.0.7.tgz", "integrity": "sha512-pWCXsrWal8lWMmZ1wJ2dolbwZZR1CZU1LVR/K1rYC8NeA+uqTLY8h3uH3hFgP5n8jmRRenOSJ9SjWM9OIdCjOA==", "dependencies": { "@babel/runtime": "^7.9.2", "minimatch": "3.0.4", "react": "^16.13.1" }, "peerDependencies": { "gatsby": ">=2.0.0", "react": ">=16.0.0", "react-dom": ">=16.0.0" } }, "node_modules/gatsby-plugin-plausible/node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/gatsby-plugin-react-helmet": { "version": "5.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-5.25.0.tgz", "integrity": "sha512-sU/xae/sGuYFcFDpqUxwXnaOmx8xrU2Q+XSULqAapji0uTBhW6al6CJsaPFigi8IOG2bQX8ano2iWWcGF3/GHw==", "dependencies": { "@babel/runtime": "^7.15.4" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next", "react-helmet": "^5.1.3 || ^6.0.0" } }, "node_modules/gatsby-plugin-react-svg": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-react-svg/-/gatsby-plugin-react-svg-3.3.0.tgz", "integrity": "sha512-kFPElMFu1QCkiFCm1pSrVkOHAeafU6wkD0qCVPs7nL/Txh5KFh0aOO6Feiwvfre1Jo+Eg3lwCuGmgsy9L+4pDg==", "dependencies": { "svg-react-loader": "^0.4.6" }, "peerDependencies": { "gatsby": "^5.0.0 || ^4.0.0 || ^3.0.0 || ^2.0.0" } }, "node_modules/gatsby-plugin-remove-trailing-slashes": { "version": "4.19.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-remove-trailing-slashes/-/gatsby-plugin-remove-trailing-slashes-4.19.0.tgz", "integrity": "sha512-3zyL+6pqQIeAvABi3PbtVi285n9CVCopzLZNiCLN81/xPiCggA1yyNaZVV3eS1ZbOVFlWCAFyEBRl6E6QeI2BQ==", "deprecated": "This plugin's functionality is now built-in to Gatsby. Use the trailingSlash feature: https://gatsby.dev/trailing-slash. This package will no longer receive updates.", "dependencies": { "@babel/runtime": "^7.15.4" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next" } }, "node_modules/gatsby-plugin-sass": { "version": "5.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-sass/-/gatsby-plugin-sass-5.25.0.tgz", "integrity": "sha512-e+47Z24DI+Uh3KcUbj/WvTyH4ZPXcC4zlwqhzspv1Ye+xMS1ipTsIelvBuTwiiEWBs6cqdcYAPhn7HoXX/errw==", "dependencies": { "@babel/runtime": "^7.15.4", "resolve-url-loader": "^3.1.4", "sass-loader": "^10.1.1" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next", "sass": "^1.30.0" } }, "node_modules/gatsby-plugin-sass-resources": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/gatsby-plugin-sass-resources/-/gatsby-plugin-sass-resources-3.0.1.tgz", "integrity": "sha512-C332NqMOd6z0q7F02OmL/Bl7BoJyD73vcfpF22M+qVy3TE9ugL94Pcdpki8s5TUSwJgqgs9qkTuLD+jDphMsWw==", "dependencies": { "@babel/runtime": "^7.0.0", "sass-resources-loader": "^1.3.3", "webpack": "^5.0.0" }, "peerDependencies": { "gatsby": "^4.0.0" } }, "node_modules/gatsby-plugin-sharp": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-sharp/-/gatsby-plugin-sharp-4.25.0.tgz", "integrity": "sha512-8XiSKibQyp6pOFHEkEdRCpoDA3Ywcq5PKftNMExZ51MormT0+WqRC7ynuU+0fzktDTbbSyREvblKa+21Id+rRA==", "dependencies": { "@babel/runtime": "^7.15.4", "async": "^3.2.4", "bluebird": "^3.7.2", "debug": "^4.3.4", "filenamify": "^4.3.0", "fs-extra": "^10.1.0", "gatsby-core-utils": "^3.25.0", "gatsby-plugin-utils": "^3.19.0", "lodash": "^4.17.21", "probe-image-size": "^7.2.3", "semver": "^7.3.7", "sharp": "^0.30.7" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next" } }, "node_modules/gatsby-plugin-sharp/node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, "node_modules/gatsby-plugin-sharp/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/gatsby-plugin-sharp/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/gatsby-plugin-sharp/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/gatsby-plugin-sharp/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/gatsby-plugin-sharp/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/gatsby-plugin-sitemap": { "version": "5.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-sitemap/-/gatsby-plugin-sitemap-5.25.0.tgz", "integrity": "sha512-0MYinO0MTsOIEd7d2NOCm/JVdFIMgoIEFem/S0gMpuW4rBCpsE6McPmRKGZl2bp277jEhU8ACt4/49nsCA1AoA==", "dependencies": { "@babel/runtime": "^7.15.4", "common-tags": "^1.8.2", "minimatch": "^3.1.2", "sitemap": "^7.0.0" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next", "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0", "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0" } }, "node_modules/gatsby-plugin-typescript": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-4.25.0.tgz", "integrity": "sha512-8BTtiVWuIqIEGx/PBBMWd6FYPgel16hT3js7SMo5oI9K4EPsSxRItgRf41MTJGxRR20EhL4e99g2S8x0v1+odA==", "dependencies": { "@babel/core": "^7.15.5", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", "@babel/plugin-proposal-numeric-separator": "^7.14.5", "@babel/plugin-proposal-optional-chaining": "^7.14.5", "@babel/preset-typescript": "^7.15.0", "@babel/runtime": "^7.15.4", "babel-plugin-remove-graphql-queries": "^4.25.0" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next" } }, "node_modules/gatsby-plugin-utils": { "version": "3.19.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-utils/-/gatsby-plugin-utils-3.19.0.tgz", "integrity": "sha512-EZtvgHSU5NPbEn6a4cfSpEGCQ09SfwbhoybHTJKj1clop86HSwOCV2iH8RbCc+X6jbdgHaSZsfsl7zG1h7DBUw==", "dependencies": { "@babel/runtime": "^7.15.4", "fastq": "^1.13.0", "fs-extra": "^10.1.0", "gatsby-core-utils": "^3.25.0", "gatsby-sharp": "^0.19.0", "graphql-compose": "^9.0.7", "import-from": "^4.0.0", "joi": "^17.4.2", "mime": "^3.0.0" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next", "graphql": "^15.0.0" } }, "node_modules/gatsby-plugin-utils/node_modules/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "bin": { "mime": "cli.js" }, "engines": { "node": ">=10.0.0" } }, "node_modules/gatsby-react-router-scroll": { "version": "5.25.0", "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-5.25.0.tgz", "integrity": "sha512-SFSdezIa5lahCE8ieCLrtLA5tztemGco/rN8si9rI9KHu1h1jPvDhsNqs2g+Z50JrUb1RPfsmxJTmLa5i6MIgQ==", "dependencies": { "@babel/runtime": "^7.15.4", "prop-types": "^15.8.1" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "@gatsbyjs/reach-router": "^1.3.5", "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0", "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0" } }, "node_modules/gatsby-remark-copy-linked-files": { "version": "5.25.0", "resolved": "https://registry.npmjs.org/gatsby-remark-copy-linked-files/-/gatsby-remark-copy-linked-files-5.25.0.tgz", "integrity": "sha512-kF068dZ0U920xNrlKM5BIR1MvgFdVvgR281AJfvn1xOvv/ES3elPj2bqlokbcs1f72dYcNnaJhv3UhYoIdV6Fg==", "dependencies": { "@babel/runtime": "^7.15.4", "cheerio": "^1.0.0-rc.10", "fs-extra": "^10.1.0", "is-relative-url": "^3.0.0", "lodash": "^4.17.21", "path-is-inside": "^1.0.2", "probe-image-size": "^7.2.3", "unist-util-visit": "^2.0.3" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next" } }, "node_modules/gatsby-remark-copy-linked-files/node_modules/unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/gatsby-remark-images": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/gatsby-remark-images/-/gatsby-remark-images-6.25.0.tgz", "integrity": "sha512-NNJ17OxA8xPFtTHBfWCxAGqU9ciOielWALUlzY1YdCvYl2rcDmw498tjx77wC995yCBkcwe7yfL1tgky9bxdqQ==", "dependencies": { "@babel/runtime": "^7.15.4", "chalk": "^4.1.2", "cheerio": "^1.0.0-rc.10", "gatsby-core-utils": "^3.25.0", "is-relative-url": "^3.0.0", "lodash": "^4.17.21", "mdast-util-definitions": "^4.0.0", "query-string": "^6.14.1", "unist-util-select": "^3.0.4", "unist-util-visit-parents": "^3.1.1" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next", "gatsby-plugin-sharp": "^4.0.0-next" } }, "node_modules/gatsby-remark-images/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/gatsby-remark-images/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/gatsby-remark-images/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/gatsby-remark-prismjs": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/gatsby-remark-prismjs/-/gatsby-remark-prismjs-6.25.0.tgz", "integrity": "sha512-O33q0aQjl3X8nVEFboQ0RKtnHLhhb0BU+ErK0D9MA6w4qSDRmDjFIWDY7nrsBP5QR80V1sjbjr4zBAAdOre/dA==", "dependencies": { "@babel/runtime": "^7.15.4", "parse-numeric-range": "^1.2.0", "unist-util-visit": "^2.0.3" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next", "prismjs": "^1.15.0" } }, "node_modules/gatsby-remark-prismjs/node_modules/parse-numeric-range": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "node_modules/gatsby-remark-prismjs/node_modules/unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/gatsby-remark-smartypants": { "version": "5.25.0", "resolved": "https://registry.npmjs.org/gatsby-remark-smartypants/-/gatsby-remark-smartypants-5.25.0.tgz", "integrity": "sha512-HTcDlQkYQ3regRvQYBuGSCTWE6d4l277yGNYOq89yxkn0CSra/FfplLWUakvFrPLQQaQwpXewhUPXSWkp/PTZg==", "dependencies": { "@babel/runtime": "^7.15.4", "retext": "^7.0.1", "retext-smartypants": "^4.0.0", "unist-util-visit": "^2.0.3" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next" } }, "node_modules/gatsby-remark-smartypants/node_modules/unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/gatsby-remark-unwrap-images": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/gatsby-remark-unwrap-images/-/gatsby-remark-unwrap-images-1.0.2.tgz", "integrity": "sha512-kOatDaz6EcYJn6oEx97pim0JkzuN1epacmHuKP9kL7r3+y1dzvNQjrJMtmDZTqC6Q8LhXD2rrFhsYS3SerTHhw==", "dependencies": { "unist-util-remove": "^1.0.1", "unist-util-visit": "^1.4.0" }, "peerDependencies": { "gatsby": ">2.0.0-alpha" } }, "node_modules/gatsby-script": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/gatsby-script/-/gatsby-script-1.10.0.tgz", "integrity": "sha512-8jAtQR0mw3G8sCy6i2D1jfGvUF5d9AIboEQuo9ZEChT4Ep5f+PSRxiWZqSjhKvintAOIeS4QXCJP5Rtp3xZKLg==", "engines": { "node": ">=14.15.0" }, "peerDependencies": { "@gatsbyjs/reach-router": "^1.3.5", "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0", "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^0.0.0" } }, "node_modules/gatsby-sharp": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/gatsby-sharp/-/gatsby-sharp-0.19.0.tgz", "integrity": "sha512-EbI3RNBu2+aaxuMUP/INmoj8vcNAG6BgpFvi1tLeU7/gVTNVQ+7pC/ZYtlVCzSw+faaw7r1ZBMi6F66mNIIz5A==", "dependencies": { "@types/sharp": "^0.30.5", "sharp": "^0.30.7" }, "engines": { "node": ">=14.15.0" } }, "node_modules/gatsby-source-filesystem": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-4.25.0.tgz", "integrity": "sha512-gja4++bPkYpnum4/TxFicr3zRHBArnM2HjT77EE4EuDhdl6qlJYr/heD09LIPN2jdR5gmPwMDjIZnuYZ/6j/aQ==", "dependencies": { "@babel/runtime": "^7.15.4", "chokidar": "^3.5.3", "file-type": "^16.5.4", "fs-extra": "^10.1.0", "gatsby-core-utils": "^3.25.0", "md5-file": "^5.0.0", "mime": "^2.5.2", "pretty-bytes": "^5.4.1", "valid-url": "^1.0.9", "xstate": "4.32.1" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next" } }, "node_modules/gatsby-source-filesystem/node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/gatsby-source-filesystem/node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" } }, "node_modules/gatsby-source-filesystem/node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/gatsby-source-filesystem/node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/gatsby-source-filesystem/node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/gatsby-source-filesystem/node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/gatsby-source-filesystem/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/gatsby-source-filesystem/node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/gatsby-source-filesystem/node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/gatsby-source-filesystem/node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/gatsby-source-filesystem/node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { "node": ">=0.10.0" } }, "node_modules/gatsby-source-filesystem/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, "engines": { "node": ">=8.10.0" } }, "node_modules/gatsby-telemetry": { "version": "3.25.0", "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-3.25.0.tgz", "integrity": "sha512-FGC1yS2evJxTN/Ku9XonCBiqhH6uO6aPjjps65BbL+Xbpct/qfirIFxYG6DhHPrksR0fKOhstJGnQqay74hWdQ==", "hasInstallScript": true, "dependencies": { "@babel/code-frame": "^7.14.0", "@babel/runtime": "^7.15.4", "@turist/fetch": "^7.2.0", "@turist/time": "^0.0.2", "boxen": "^4.2.0", "configstore": "^5.0.1", "fs-extra": "^10.1.0", "gatsby-core-utils": "^3.25.0", "git-up": "^7.0.0", "is-docker": "^2.2.1", "lodash": "^4.17.21", "node-fetch": "^2.6.7" }, "engines": { "node": ">=14.15.0" } }, "node_modules/gatsby-telemetry/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/gatsby-telemetry/node_modules/boxen": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", "dependencies": { "ansi-align": "^3.0.0", "camelcase": "^5.3.1", "chalk": "^3.0.0", "cli-boxes": "^2.2.0", "string-width": "^4.1.0", "term-size": "^2.1.0", "type-fest": "^0.8.1", "widest-line": "^3.1.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/gatsby-telemetry/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { "node": ">=6" } }, "node_modules/gatsby-telemetry/node_modules/chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=8" } }, "node_modules/gatsby-telemetry/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/gatsby-telemetry/node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "engines": { "node": ">=8" } }, "node_modules/gatsby-transformer-remark": { "version": "5.25.1", "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-5.25.1.tgz", "integrity": "sha512-6k3uOnZYsJSgmZIWq9Y+Cqb6pysusCUBYpQY1+V9ofpSRbrZGGfuoCeFKd27x/c0jI5jneuL3NXnxwn/JJK1Ig==", "dependencies": { "@babel/runtime": "^7.15.4", "gatsby-core-utils": "^3.25.0", "gray-matter": "^4.0.3", "hast-util-raw": "^6.0.2", "hast-util-to-html": "^7.1.3", "lodash": "^4.17.21", "mdast-util-to-hast": "^10.2.0", "mdast-util-to-string": "^2.0.0", "mdast-util-toc": "^5.1.0", "remark": "^13.0.0", "remark-footnotes": "^3.0.0", "remark-gfm": "^1.0.0", "remark-parse": "^9.0.0", "remark-retext": "^4.0.0", "remark-stringify": "^9.0.1", "retext-english": "^3.0.4", "sanitize-html": "^1.27.5", "underscore.string": "^3.3.6", "unified": "^9.2.2", "unist-util-remove-position": "^3.0.0", "unist-util-select": "^3.0.4", "unist-util-visit": "^2.0.3" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next" } }, "node_modules/gatsby-transformer-remark/node_modules/unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/gatsby-transformer-sharp": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-transformer-sharp/-/gatsby-transformer-sharp-4.25.0.tgz", "integrity": "sha512-7aqecTvOUFiNB96ij77UnAGJs7Un0TlkpamG//dSl6Nru9EylGz/NW/Eg0vioQyHLCYdMvd5xO8V3BOHJADsnw==", "dependencies": { "@babel/runtime": "^7.15.4", "bluebird": "^3.7.2", "common-tags": "^1.8.2", "fs-extra": "^10.1.0", "gatsby-plugin-utils": "^3.19.0", "probe-image-size": "^7.2.3", "semver": "^7.3.7", "sharp": "^0.30.7" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "gatsby": "^4.0.0-next", "gatsby-plugin-sharp": "^4.0.0-next" } }, "node_modules/gatsby-transformer-sharp/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/gatsby-transformer-sharp/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/gatsby-transformer-sharp/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/gatsby-worker": { "version": "1.25.0", "resolved": "https://registry.npmjs.org/gatsby-worker/-/gatsby-worker-1.25.0.tgz", "integrity": "sha512-gjp28irgHASihwvMyF5aZMALWGax9mEmcD8VYGo2osRe7p6BZuWi4cSuP9XM9EvytDvIugpnSadmTP01B7LtWg==", "dependencies": { "@babel/core": "^7.15.5", "@babel/runtime": "^7.15.4" }, "engines": { "node": ">=14.15.0" } }, "node_modules/gatsby/node_modules/acorn": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/gatsby/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/gatsby/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/gatsby/node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/gatsby/node_modules/babel-preset-gatsby": { "version": "2.25.0", "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-2.25.0.tgz", "integrity": "sha512-KFfSTDAkY87/Myq1KIUk9cVphWZem/08U7ps9Hiotbo6Mge/lL6ggh3xKP9SdR5Le4DLLyIUI7a4ILrAVacYDg==", "dependencies": { "@babel/plugin-proposal-class-properties": "^7.14.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", "@babel/plugin-proposal-optional-chaining": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-transform-classes": "^7.15.4", "@babel/plugin-transform-runtime": "^7.15.0", "@babel/plugin-transform-spread": "^7.14.6", "@babel/preset-env": "^7.15.4", "@babel/preset-react": "^7.14.0", "@babel/runtime": "^7.15.4", "babel-plugin-dynamic-import-node": "^2.3.3", "babel-plugin-macros": "^3.1.0", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", "gatsby-core-utils": "^3.25.0", "gatsby-legacy-polyfills": "^2.25.0" }, "engines": { "node": ">=14.15.0" }, "peerDependencies": { "@babel/core": "^7.11.6", "core-js": "^3.0.0" } }, "node_modules/gatsby/node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" } }, "node_modules/gatsby/node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/gatsby/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/gatsby/node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/gatsby/node_modules/core-js": { "version": "3.27.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz", "integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==", "hasInstallScript": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/gatsby/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { "ms": "^2.1.1" } }, "node_modules/gatsby/node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/gatsby/node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/gatsby/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/gatsby/node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/gatsby/node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/gatsby/node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/gatsby/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/gatsby/node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, "node_modules/gatsby/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/gatsby/node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { "node": ">=0.10.0" } }, "node_modules/gatsby/node_modules/react-server-dom-webpack": { "version": "0.0.0-experimental-c8b778b7f-20220825", "resolved": "https://registry.npmjs.org/react-server-dom-webpack/-/react-server-dom-webpack-0.0.0-experimental-c8b778b7f-20220825.tgz", "integrity": "sha512-JyCjbp6ZvkH/T0EuVPdceYlC8u5WqWDSJr2KxDvc81H2eJ+7zYUN++IcEycnR2F+HmER8QVgxfotnIx352zi+w==", "dependencies": { "acorn": "^6.2.1", "loose-envify": "^1.1.0", "neo-async": "^2.6.1" }, "engines": { "node": ">=0.10.0" }, "peerDependencies": { "react": "0.0.0-experimental-c8b778b7f-20220825", "webpack": "^5.59.0" } }, "node_modules/gatsby/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, "engines": { "node": ">=8.10.0" } }, "node_modules/gatsby/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/gatsby/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/gatsby/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/gatsby/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, "node_modules/get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", "engines": { "node": ">=4" } }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/git-up": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "dependencies": { "is-ssh": "^1.4.0", "parse-url": "^8.1.0" } }, "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" }, "node_modules/github-slugger": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-base": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==", "dev": true, "optional": true, "dependencies": { "glob-parent": "^2.0.0", "is-glob": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/glob-parent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==", "dev": true, "optional": true, "dependencies": { "is-glob": "^2.0.0" } }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/global-dirs": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "dependencies": { "ini": "2.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/global-dirs/node_modules/ini": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "engines": { "node": ">=10" } }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dependencies": { "global-prefix": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/global-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", "which": "^1.3.1" }, "engines": { "node": ">=6" } }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "bin/which" } }, "node_modules/globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dependencies": { "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globby/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "engines": { "node": ">=8" } }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dependencies": { "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/got": { "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" }, "engines": { "node": ">=10.19.0" }, "funding": { "url": "https://github.com/sindresorhus/got?sponsor=1" } }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/graphql": { "version": "15.8.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", "engines": { "node": ">= 10.x" } }, "node_modules/graphql-compose": { "version": "9.0.10", "resolved": "https://registry.npmjs.org/graphql-compose/-/graphql-compose-9.0.10.tgz", "integrity": "sha512-UsVoxfi2+c8WbHl2pEB+teoRRZoY4mbWBoijeLDGpAZBSPChnqtSRjp+T9UcouLCwGr5ooNyOQLoI3OVzU1bPQ==", "dependencies": { "graphql-type-json": "0.3.2" } }, "node_modules/graphql-playground-html": { "version": "1.6.30", "resolved": "https://registry.npmjs.org/graphql-playground-html/-/graphql-playground-html-1.6.30.tgz", "integrity": "sha512-tpCujhsJMva4aqE8ULnF7/l3xw4sNRZcSHu+R00VV+W0mfp+Q20Plvcrp+5UXD+2yS6oyCXncA+zoQJQqhGCEw==", "dependencies": { "xss": "^1.0.6" } }, "node_modules/graphql-playground-middleware-express": { "version": "1.7.23", "resolved": "https://registry.npmjs.org/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.23.tgz", "integrity": "sha512-M/zbTyC1rkgiQjFSgmzAv6umMHOphYLNWZp6Ye5QrD77WfGOOoSqDsVmGUczc2pDkEPEzzGB/bvBO5rdzaTRgw==", "dependencies": { "graphql-playground-html": "^1.6.30" }, "peerDependencies": { "express": "^4.16.2" } }, "node_modules/graphql-tag": { "version": "2.12.6", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", "dependencies": { "tslib": "^2.1.0" }, "engines": { "node": ">=10" }, "peerDependencies": { "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/graphql-type-json": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.3.2.tgz", "integrity": "sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg==", "peerDependencies": { "graphql": ">=0.8.0" } }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" }, "engines": { "node": ">=6.0" } }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dependencies": { "duplexer": "^0.1.2" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dependencies": { "function-bind": "^1.1.1" }, "engines": { "node": ">= 0.4.0" } }, "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dependencies": { "ansi-regex": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-cors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==" }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dependencies": { "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dependencies": { "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", "dev": true, "optional": true, "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/has-value/node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", "dev": true, "optional": true, "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/has-values/node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "node_modules/has-values/node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/has-values/node_modules/kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "engines": { "node": ">=8" } }, "node_modules/hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/hasha/node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "engines": { "node": ">=8" } }, "node_modules/hast-to-hyperscript": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", "dependencies": { "@types/unist": "^2.0.3", "comma-separated-tokens": "^1.0.0", "property-information": "^5.3.0", "space-separated-tokens": "^1.0.0", "style-to-object": "^0.3.0", "unist-util-is": "^4.0.0", "web-namespaces": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-from-parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", "dependencies": { "@types/parse5": "^5.0.0", "hastscript": "^6.0.0", "property-information": "^5.0.0", "vfile": "^4.0.0", "vfile-location": "^3.2.0", "web-namespaces": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-is-element": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-parse-selector": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-raw": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.1.0.tgz", "integrity": "sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==", "dependencies": { "@types/hast": "^2.0.0", "hast-util-from-parse5": "^6.0.0", "hast-util-to-parse5": "^6.0.0", "html-void-elements": "^1.0.0", "parse5": "^6.0.0", "unist-util-position": "^3.0.0", "unist-util-visit": "^2.0.0", "vfile": "^4.0.0", "web-namespaces": "^1.0.0", "xtend": "^4.0.0", "zwitch": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-raw/node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, "node_modules/hast-util-raw/node_modules/unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-sanitize": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-1.3.1.tgz", "integrity": "sha512-AIeKHuHx0Wk45nSkGVa2/ujQYTksnDl8gmmKo/mwQi7ag7IBZ8cM3nJ2G86SajbjGP/HRpud6kMkPtcM2i0Tlw==", "dependencies": { "xtend": "^4.0.1" } }, "node_modules/hast-util-to-html": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz", "integrity": "sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw==", "dependencies": { "ccount": "^1.0.0", "comma-separated-tokens": "^1.0.0", "hast-util-is-element": "^1.0.0", "hast-util-whitespace": "^1.0.0", "html-void-elements": "^1.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0", "stringify-entities": "^3.0.1", "unist-util-is": "^4.0.0", "xtend": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-to-parse5": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", "dependencies": { "hast-to-hyperscript": "^9.0.0", "property-information": "^5.0.0", "web-namespaces": "^1.0.0", "xtend": "^4.0.0", "zwitch": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-whitespace": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hastscript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", "hast-util-parse-selector": "^2.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "bin": { "he": "bin/he" } }, "node_modules/header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", "dependencies": { "capital-case": "^1.0.4", "tslib": "^2.0.3" } }, "node_modules/hoist-non-react-statics": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" }, "node_modules/home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==", "dev": true, "dependencies": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/hosted-git-info": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", "dependencies": { "lru-cache": "^6.0.0" }, "engines": { "node": ">=10" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/hosted-git-info/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/html-entities": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" }, "node_modules/html-to-react": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.5.0.tgz", "integrity": "sha512-tjihXBgaJZRRYzmkrJZ/Qf9jFayilFYcb+sJxXXE2BVLk2XsNrGeuNCVvhXmvREULZb9dz6NFTBC96DTR/lQCQ==", "dependencies": { "domhandler": "^5.0", "htmlparser2": "^8.0", "lodash.camelcase": "^4.3.0" } }, "node_modules/html-void-elements": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/htmlparser2": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { "type": "github", "url": "https://github.com/sponsors/fb55" } ], "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "entities": "^4.3.0" } }, "node_modules/http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.8" } }, "node_modules/http2-wrapper": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" }, "engines": { "node": ">=10.19.0" } }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "engines": { "node": ">=10.17.0" } }, "node_modules/hyphenate-style-name": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" } }, "node_modules/icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "engines": { "node": "^10 || ^12 || >= 14" }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/idb-keyval": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-3.2.0.tgz", "integrity": "sha512-slx8Q6oywCCSfKgPgL0sEsXtPVnSbTLWpyiDcu6msHOyKOLari1TD1qocXVCft80umnkk3/Qqh3lwoFt8T/BPQ==" }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "engines": { "node": ">= 4" } }, "node_modules/immer": { "version": "9.0.17", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.17.tgz", "integrity": "sha512-+hBruaLSQvkPfxRiTLK/mi4vLH+/VQS6z2KJahdoxlleFOI8ARqzOF17uy12eFDlqWmPoygwc5evgwcp+dlHhg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" } }, "node_modules/immutable": { "version": "3.7.6", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==", "engines": { "node": ">=0.8.0" } }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "engines": { "node": ">=4" } }, "node_modules/import-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", "engines": { "node": ">=12.2" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", "engines": { "node": ">=4" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "engines": { "node": ">=0.8.19" } }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/inline-style-parser": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, "node_modules/inquirer": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.19", "mute-stream": "0.0.8", "run-async": "^2.4.0", "rxjs": "^6.6.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" }, "engines": { "node": ">=8.0.0" } }, "node_modules/inquirer/node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dependencies": { "type-fest": "^0.21.3" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/inquirer/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/inquirer/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/inquirer/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/inquirer/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/inquirer/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/inquirer/node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/internal-slot": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dependencies": { "loose-envify": "^1.0.0" } }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "engines": { "node": ">= 0.10" } }, "node_modules/is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dependencies": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", "engines": { "node": ">=8" } }, "node_modules/is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "optional": true, "dependencies": { "kind-of": "^6.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-alphabetical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-alphanumerical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", "dependencies": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-array-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-typed-array": "^1.1.10" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dependencies": { "has-bigints": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", "dev": true, "optional": true, "dependencies": { "binary-extensions": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "engines": { "node": ">=4" } }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dependencies": { "ci-info": "^2.0.0" }, "bin": { "is-ci": "bin.js" } }, "node_modules/is-core-module": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dependencies": { "has": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "optional": true, "dependencies": { "kind-of": "^6.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-decimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "optional": true, "dependencies": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "bin": { "is-docker": "cli.js" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", "integrity": "sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==", "dev": true, "optional": true, "dependencies": { "is-primitive": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-finite": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", "dev": true, "engines": { "node": ">=0.10.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { "node": ">=8" } }, "node_modules/is-function": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, "node_modules/is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", "dependencies": { "is-extglob": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-hexadecimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-in-browser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" }, "node_modules/is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-invalid-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", "dependencies": { "is-glob": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-npm": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-number/node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "engines": { "node": ">=8" } }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "engines": { "node": ">=8" } }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dependencies": { "isobject": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-plain-object/node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", "integrity": "sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", "integrity": "sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dependencies": { "is-unc-path": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-relative-url": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-3.0.0.tgz", "integrity": "sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA==", "dependencies": { "is-absolute-url": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/is-root": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", "engines": { "node": ">=6" } }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dependencies": { "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-ssh": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", "dependencies": { "protocols": "^2.0.1" } }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dependencies": { "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-typed-array": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dependencies": { "unc-path-regex": "^0.1.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-upper-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/is-valid-domain": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-valid-domain/-/is-valid-domain-0.1.6.tgz", "integrity": "sha512-ZKtq737eFkZr71At8NxOFcP9O1K89gW3DkdrGMpp1upr/ueWjj+Weh4l9AI4rN0Gt8W2M1w7jrG2b/Yv83Ljpg==", "dependencies": { "punycode": "^2.1.1" } }, "node_modules/is-valid-path": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", "dependencies": { "is-invalid-path": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dependencies": { "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dependencies": { "is-docker": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/is-yarn-global": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", "dev": true, "optional": true, "dependencies": { "isarray": "1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/javascript-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==" }, "node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" }, "engines": { "node": ">= 10.13.0" } }, "node_modules/jest-worker/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/joi": { "version": "17.7.0", "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", "dependencies": { "@hapi/hoek": "^9.0.0", "@hapi/topo": "^5.0.0", "@sideway/address": "^4.1.3", "@sideway/formula": "^3.0.0", "@sideway/pinpoint": "^2.0.0" } }, "node_modules/js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==" }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==", "dev": true, "bin": { "jsesc": "bin/jsesc" } }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, "engines": { "node": ">=6" } }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/jss": { "version": "9.8.7", "resolved": "https://registry.npmjs.org/jss/-/jss-9.8.7.tgz", "integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==", "hasInstallScript": true, "dependencies": { "is-in-browser": "^1.1.3", "symbol-observable": "^1.1.0", "warning": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/jss-camel-case": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.1.0.tgz", "integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==", "dependencies": { "hyphenate-style-name": "^1.0.2" }, "peerDependencies": { "jss": "^9.7.0" } }, "node_modules/jss-compose": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/jss-compose/-/jss-compose-5.0.0.tgz", "integrity": "sha512-YofRYuiA0+VbeOw0VjgkyO380sA4+TWDrW52nSluD9n+1FWOlDzNbgpZ/Sb3Y46+DcAbOS21W5jo6SAqUEiuwA==", "dependencies": { "warning": "^3.0.0" }, "peerDependencies": { "jss": "^9.0.0" } }, "node_modules/jss-default-unit": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/jss-default-unit/-/jss-default-unit-8.0.2.tgz", "integrity": "sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg==", "peerDependencies": { "jss": "^9.4.0" } }, "node_modules/jss-expand": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/jss-expand/-/jss-expand-5.3.0.tgz", "integrity": "sha512-NiM4TbDVE0ykXSAw6dfFmB1LIqXP/jdd0ZMnlvlGgEMkMt+weJIl8Ynq1DsuBY9WwkNyzWktdqcEW2VN0RAtQg==", "peerDependencies": { "jss": "^9.4.0" } }, "node_modules/jss-extend": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/jss-extend/-/jss-extend-6.2.0.tgz", "integrity": "sha512-YszrmcB6o9HOsKPszK7NeDBNNjVyiW864jfoiHoMlgMIg2qlxKw70axZHqgczXHDcoyi/0/ikP1XaHDPRvYtEA==", "dependencies": { "warning": "^3.0.0" }, "peerDependencies": { "jss": "^9.7.0" } }, "node_modules/jss-global": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/jss-global/-/jss-global-3.0.0.tgz", "integrity": "sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q==", "peerDependencies": { "jss": "^9.0.0" } }, "node_modules/jss-nested": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz", "integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==", "dependencies": { "warning": "^3.0.0" }, "peerDependencies": { "jss": "^9.0.0" } }, "node_modules/jss-preset-default": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/jss-preset-default/-/jss-preset-default-4.5.0.tgz", "integrity": "sha512-qZbpRVtHT7hBPpZEBPFfafZKWmq3tA/An5RNqywDsZQGrlinIF/mGD9lmj6jGqu8GrED2SMHZ3pPKLmjCZoiaQ==", "dependencies": { "jss-camel-case": "^6.1.0", "jss-compose": "^5.0.0", "jss-default-unit": "^8.0.2", "jss-expand": "^5.3.0", "jss-extend": "^6.2.0", "jss-global": "^3.0.0", "jss-nested": "^6.0.1", "jss-props-sort": "^6.0.0", "jss-template": "^1.0.1", "jss-vendor-prefixer": "^7.0.0" }, "peerDependencies": { "jss": "^9.7.0" } }, "node_modules/jss-props-sort": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/jss-props-sort/-/jss-props-sort-6.0.0.tgz", "integrity": "sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g==", "peerDependencies": { "jss": "^9.0.0" } }, "node_modules/jss-template": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/jss-template/-/jss-template-1.0.1.tgz", "integrity": "sha512-m5BqEWha17fmIVXm1z8xbJhY6GFJxNB9H68GVnCWPyGYfxiAgY9WTQyvDAVj+pYRgrXSOfN5V1T4+SzN1sJTeg==", "dependencies": { "warning": "^3.0.0" }, "peerDependencies": { "jss": "^9.0.0" } }, "node_modules/jss-vendor-prefixer": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz", "integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==", "dependencies": { "css-vendor": "^0.3.8" }, "peerDependencies": { "jss": "^9.0.0" } }, "node_modules/jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", "dependencies": { "array-includes": "^3.1.5", "object.assign": "^4.1.3" }, "engines": { "node": ">=4.0" } }, "node_modules/keyv": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "engines": { "node": ">=0.10.0" } }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "engines": { "node": ">=6" } }, "node_modules/klona": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", "engines": { "node": ">= 8" } }, "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" }, "node_modules/language-tags": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.7.tgz", "integrity": "sha512-bSytju1/657hFjgUzPAPqszxH62ouE8nQFoFaVlIQfne4wO/wXC9A4+m8jYve7YBBvi59eq0SUpcshvG8h5Usw==", "dependencies": { "language-subtag-registry": "^0.3.20" } }, "node_modules/latest-version": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", "dependencies": { "package-json": "^6.3.0" }, "engines": { "node": ">=8" } }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/lilconfig": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", "engines": { "node": ">=10" } }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/lmdb": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.3.tgz", "integrity": "sha512-iBA0cb13CobBSoGJLfZgnrykLlfJipDAnvtf+YwIqqzBEsTeQYsXrHaSBkaHd5wCWeabwrNvhjZoFMUrlo+eLw==", "hasInstallScript": true, "dependencies": { "msgpackr": "^1.5.4", "node-addon-api": "^4.3.0", "node-gyp-build-optional-packages": "5.0.3", "ordered-binary": "^1.2.4", "weak-lru-cache": "^1.2.2" }, "optionalDependencies": { "@lmdb/lmdb-darwin-arm64": "2.5.3", "@lmdb/lmdb-darwin-x64": "2.5.3", "@lmdb/lmdb-linux-arm": "2.5.3", "@lmdb/lmdb-linux-arm64": "2.5.3", "@lmdb/lmdb-linux-x64": "2.5.3", "@lmdb/lmdb-win32-x64": "2.5.3" } }, "node_modules/lmdb/node_modules/node-addon-api": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "engines": { "node": ">=6.11.5" } }, "node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^2.1.2" }, "engines": { "node": ">=8.9.0" } }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { "p-locate": "^5.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lock": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/lock/-/lock-1.1.0.tgz", "integrity": "sha512-NZQIJJL5Rb9lMJ0Yl1JoVr9GSdo4HTPsUEWsSFzB8dE8DSoiLCVavWZPi7Rnlv/o73u6I24S/XYc/NmG4l8EKA==" }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "node_modules/lodash.deburr": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", "integrity": "sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==" }, "node_modules/lodash.every": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz", "integrity": "sha512-isF82d+65/sNvQ3aaQAW7LLHnnTxSN/2fm4rhYyuufLzA4VtHz6y6S5vFwe6PQVr2xdqUOyxBbTNKDpnmeu50w==" }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==" }, "node_modules/lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" }, "node_modules/lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==" }, "node_modules/lodash.maxby": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.maxby/-/lodash.maxby-4.6.0.tgz", "integrity": "sha512-QfTqQTwzmKxLy7VZlbx2M/ipWv8DCQ2F5BI/MRxLharOQ5V78yMSuB+JE+EuUM22txYfj09R2Q7hUlEYj7KdNg==" }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "dependencies": { "lodash._reinterpolate": "^3.0.0", "lodash.templatesettings": "^4.0.0" } }, "node_modules/lodash.templatesettings": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "dependencies": { "lodash._reinterpolate": "^3.0.0" } }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, "node_modules/longest-streak": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/lower-case-first": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz", "integrity": "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { "node": ">=8" } }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/lru-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", "dependencies": { "es5-ext": "~0.10.2" } }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dependencies": { "semver": "^6.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-dir/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dependencies": { "p-defer": "^1.0.0" }, "engines": { "node": ">=6" } }, "node_modules/map-age-cleaner/node_modules/p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", "engines": { "node": ">=4" } }, "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "engines": { "node": ">=0.10.0" } }, "node_modules/map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", "dev": true, "optional": true, "dependencies": { "object-visit": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/markdown-table": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", "dependencies": { "repeat-string": "^1.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/math-random": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true, "optional": true }, "node_modules/md-attr-parser": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/md-attr-parser/-/md-attr-parser-1.3.0.tgz", "integrity": "sha512-KTVlfU5Oxo/6kd0YZ2mLP3eWJj+5vzh5mBCxLo3yGl1fzHIgxmtadbE9tHb7TbUBi3XZbl+P0xKeGmakat135w==", "dev": true }, "node_modules/md5-file": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", "integrity": "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw==", "bin": { "md5-file": "cli.js" }, "engines": { "node": ">=10.13.0" } }, "node_modules/mdast-util-definitions": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", "dependencies": { "unist-util-visit": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-definitions/node_modules/unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-find-and-replace": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz", "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==", "dependencies": { "escape-string-regexp": "^4.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mdast-util-footnote": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/mdast-util-footnote/-/mdast-util-footnote-0.1.7.tgz", "integrity": "sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==", "dependencies": { "mdast-util-to-markdown": "^0.6.0", "micromark": "~2.11.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-from-markdown": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-string": "^2.0.0", "micromark": "~2.11.0", "parse-entities": "^2.0.0", "unist-util-stringify-position": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz", "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==", "dependencies": { "mdast-util-gfm-autolink-literal": "^0.1.0", "mdast-util-gfm-strikethrough": "^0.2.0", "mdast-util-gfm-table": "^0.1.0", "mdast-util-gfm-task-list-item": "^0.1.0", "mdast-util-to-markdown": "^0.6.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm-autolink-literal": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz", "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==", "dependencies": { "ccount": "^1.0.0", "mdast-util-find-and-replace": "^1.1.0", "micromark": "^2.11.3" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm-strikethrough": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz", "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==", "dependencies": { "mdast-util-to-markdown": "^0.6.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm-table": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz", "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==", "dependencies": { "markdown-table": "^2.0.0", "mdast-util-to-markdown": "~0.6.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm-task-list-item": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz", "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==", "dependencies": { "mdast-util-to-markdown": "~0.6.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-to-hast": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz", "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==", "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "mdast-util-definitions": "^4.0.0", "mdurl": "^1.0.0", "unist-builder": "^2.0.0", "unist-util-generated": "^1.0.0", "unist-util-position": "^3.0.0", "unist-util-visit": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-to-hast/node_modules/unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-to-markdown": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", "dependencies": { "@types/unist": "^2.0.0", "longest-streak": "^2.0.0", "mdast-util-to-string": "^2.0.0", "parse-entities": "^2.0.0", "repeat-string": "^1.0.0", "zwitch": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-to-nlcst": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-4.0.1.tgz", "integrity": "sha512-Y4ffygj85MTt70STKnEquw6k73jYWJBaYcb4ITAKgSNokZF7fH8rEHZ1GsRY/JaxqUevMaEnsDmkVv5Z9uVRdg==", "dependencies": { "nlcst-to-string": "^2.0.0", "repeat-string": "^1.0.0", "unist-util-position": "^3.0.0", "vfile-location": "^3.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-to-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-toc": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-5.1.0.tgz", "integrity": "sha512-csimbRIVkiqc+PpFeKDGQ/Ck2N4f9FYH3zzBMMJzcxoKL8m+cM0n94xXm0I9eaxHnKdY9n145SGTdyJC7i273g==", "dependencies": { "@types/mdast": "^3.0.3", "@types/unist": "^2.0.3", "extend": "^3.0.2", "github-slugger": "^1.2.1", "mdast-util-to-string": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-toc/node_modules/unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, "node_modules/meant": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/meant/-/meant-1.0.3.tgz", "integrity": "sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw==" }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { "node": ">= 0.6" } }, "node_modules/mem": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", "dependencies": { "map-age-cleaner": "^0.1.3", "mimic-fn": "^3.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/mem?sponsor=1" } }, "node_modules/mem/node_modules/mimic-fn": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", "engines": { "node": ">=8" } }, "node_modules/memfs": { "version": "3.4.13", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", "dependencies": { "fs-monkey": "^1.0.3" }, "engines": { "node": ">= 4.0.0" } }, "node_modules/memoizee": { "version": "0.4.15", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", "dependencies": { "d": "^1.0.1", "es5-ext": "^0.10.53", "es6-weak-map": "^2.0.3", "event-emitter": "^0.3.5", "is-promise": "^2.2.2", "lru-queue": "^0.1.0", "next-tick": "^1.1.0", "timers-ext": "^0.1.7" } }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "engines": { "node": ">= 8" } }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "engines": { "node": ">= 0.6" } }, "node_modules/micromark": { "version": "2.11.4", "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "debug": "^4.0.0", "parse-entities": "^2.0.0" } }, "node_modules/micromark-extension-footnote": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/micromark-extension-footnote/-/micromark-extension-footnote-0.3.2.tgz", "integrity": "sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==", "dependencies": { "micromark": "~2.11.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz", "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==", "dependencies": { "micromark": "~2.11.0", "micromark-extension-gfm-autolink-literal": "~0.5.0", "micromark-extension-gfm-strikethrough": "~0.6.5", "micromark-extension-gfm-table": "~0.4.0", "micromark-extension-gfm-tagfilter": "~0.3.0", "micromark-extension-gfm-task-list-item": "~0.3.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm-autolink-literal": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz", "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==", "dependencies": { "micromark": "~2.11.3" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm-strikethrough": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz", "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==", "dependencies": { "micromark": "~2.11.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm-table": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz", "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==", "dependencies": { "micromark": "~2.11.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm-tagfilter": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz", "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm-task-list-item": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz", "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==", "dependencies": { "micromark": "~2.11.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/micromark/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==", "dev": true, "optional": true, "dependencies": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", "braces": "^1.8.2", "expand-brackets": "^0.1.4", "extglob": "^0.3.1", "filename-regex": "^2.0.0", "is-extglob": "^1.0.0", "is-glob": "^2.0.1", "kind-of": "^3.0.2", "normalize-path": "^2.0.1", "object.omit": "^2.0.0", "parse-glob": "^3.0.4", "regex-cache": "^0.4.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/micromatch/node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "node_modules/micromatch/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "bin": { "mime": "cli.js" }, "engines": { "node": ">=4.0.0" } }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "engines": { "node": ">=6" } }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "engines": { "node": ">=4" } }, "node_modules/mini-css-extract-plugin": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0", "webpack-sources": "^1.1.0" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^4.4.0 || ^5.0.0" } }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/minimist": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/mitt": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==" }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "optional": true, "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/mixin-deep/node_modules/is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "optional": true, "dependencies": { "is-plain-object": "^2.0.4" }, "engines": { "node": ">=0.10.0" } }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "engines": { "node": "*" } }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/msgpackr": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.8.1.tgz", "integrity": "sha512-05fT4J8ZqjYlR4QcRDIhLCYKUOHXk7C/xa62GzMKj74l3up9k2QZ3LgFc6qWdsPHl91QA2WLWqWc8b8t7GLNNw==", "optionalDependencies": { "msgpackr-extract": "^2.2.0" } }, "node_modules/msgpackr-extract": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-2.2.0.tgz", "integrity": "sha512-0YcvWSv7ZOGl9Od6Y5iJ3XnPww8O7WLcpYMDwX+PAA/uXLDtyw94PJv9GLQV/nnp3cWlDhMoyKZIQLrx33sWog==", "hasInstallScript": true, "optional": true, "dependencies": { "node-gyp-build-optional-packages": "5.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "2.2.0", "@msgpackr-extract/msgpackr-extract-darwin-x64": "2.2.0", "@msgpackr-extract/msgpackr-extract-linux-arm": "2.2.0", "@msgpackr-extract/msgpackr-extract-linux-arm64": "2.2.0", "@msgpackr-extract/msgpackr-extract-linux-x64": "2.2.0", "@msgpackr-extract/msgpackr-extract-win32-x64": "2.2.0" } }, "node_modules/multer": { "version": "1.4.5-lts.1", "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", "dependencies": { "append-field": "^1.0.0", "busboy": "^1.0.0", "concat-stream": "^1.5.2", "mkdirp": "^0.5.4", "object-assign": "^4.1.1", "type-is": "^1.6.4", "xtend": "^4.0.0" }, "engines": { "node": ">= 6.0.0" } }, "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "node_modules/nan": { "version": "2.17.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", "dev": true, "optional": true }, "node_modules/nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "bin": { "nanoid": "bin/nanoid.cjs" }, "engines": { "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "optional": true, "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "fragment-cache": "^0.2.1", "is-windows": "^1.0.2", "kind-of": "^6.0.2", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/nanomatch/node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/nanomatch/node_modules/array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/nanomatch/node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "optional": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/nanomatch/node_modules/is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "optional": true, "dependencies": { "is-plain-object": "^2.0.4" }, "engines": { "node": ">=0.10.0" } }, "node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/needle": { "version": "2.9.1", "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", "dependencies": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" }, "bin": { "needle": "bin/needle" }, "engines": { "node": ">= 4.4.x" } }, "node_modules/needle/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { "ms": "^2.1.1" } }, "node_modules/needle/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node_modules/nlcst-to-string": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz", "integrity": "sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "node_modules/node-abi": { "version": "3.30.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.30.0.tgz", "integrity": "sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw==", "dependencies": { "semver": "^7.3.5" }, "engines": { "node": ">=10" } }, "node_modules/node-abi/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/node-abi/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/node-abi/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dependencies": { "whatwg-url": "^5.0.0" }, "engines": { "node": "4.x || >=6.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "peerDependenciesMeta": { "encoding": { "optional": true } } }, "node_modules/node-gyp-build": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "node_modules/node-gyp-build-optional-packages": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==", "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "node_modules/node-html-parser": { "version": "5.4.2", "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", "dependencies": { "css-select": "^4.2.1", "he": "1.2.0" } }, "node_modules/node-html-parser/node_modules/css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/fb55" } }, "node_modules/node-html-parser/node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, "node_modules/node-html-parser/node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dependencies": { "domelementtype": "^2.2.0" }, "engines": { "node": ">= 4" }, "funding": { "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/node-html-parser/node_modules/domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/node-html-parser/node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-object-hash": { "version": "2.3.10", "resolved": "https://registry.npmjs.org/node-object-hash/-/node-object-hash-2.3.10.tgz", "integrity": "sha512-jY5dPJzw6NHd/KPSfPKJ+IHoFS81/tJ43r34ZeNMXGzCOM8jwQDCD12HYayKIB6MuznrnqIYy2e891NA2g0ibA==", "engines": { "node": ">=0.10.0" } }, "node_modules/node-releases": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==" }, "node_modules/normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "dependencies": { "remove-trailing-separator": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/not": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/not/-/not-0.1.0.tgz", "integrity": "sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==" }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dependencies": { "path-key": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dependencies": { "boolbase": "^1.0.0" }, "funding": { "url": "https://github.com/fb55/nth-check?sponsor=1" } }, "node_modules/null-loader": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, "node_modules/object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", "dev": true, "optional": true, "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object-copy/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "optional": true, "dependencies": { "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object-copy/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object-copy/node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "node_modules/object-copy/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object-copy/node_modules/is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "optional": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/object-copy/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object-fit-images": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/object-fit-images/-/object-fit-images-3.2.4.tgz", "integrity": "sha512-G+7LzpYfTfqUyrZlfrou/PLLLAPNC52FTy5y1CBywX+1/FkxIloOyQXBmZ3Zxa2AWO+lMF0JTuvqbr7G5e5CWg==" }, "node_modules/object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "engines": { "node": ">= 0.4" } }, "node_modules/object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", "dev": true, "optional": true, "dependencies": { "isobject": "^3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object-visit/node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.entries": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.hasown": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dependencies": { "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==", "dev": true, "optional": true, "dependencies": { "for-own": "^0.1.4", "is-extendable": "^0.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, "optional": true, "dependencies": { "isobject": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/object.pick/node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/object.values": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, "engines": { "node": ">= 0.8" } }, "node_modules/on-headers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "engines": { "node": ">= 0.8" } }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { "mimic-fn": "^2.1.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/opentracing": { "version": "0.14.7", "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz", "integrity": "sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==", "engines": { "node": ">=0.10" } }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.3" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/ordered-binary": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.4.0.tgz", "integrity": "sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==" }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "engines": { "node": ">=0.10.0" } }, "node_modules/output-file-sync": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", "integrity": "sha512-uQLlclru4xpCi+tfs80l3QF24KL81X57ELNMy7W/dox+JTtxUf1bLyQ8968fFCmSqqbokjW0kn+WBIlO+rSkNg==", "dev": true, "dependencies": { "graceful-fs": "^4.1.4", "mkdirp": "^0.5.1", "object-assign": "^4.1.0" } }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "engines": { "node": ">=8" } }, "node_modules/p-defer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", "engines": { "node": ">=8" } }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "engines": { "node": ">=4" } }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dependencies": { "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { "p-limit": "^3.0.2" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { "node": ">=6" } }, "node_modules/package-json": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", "dependencies": { "got": "^9.6.0", "registry-auth-token": "^4.0.0", "registry-url": "^5.0.0", "semver": "^6.2.0" }, "engines": { "node": ">=8" } }, "node_modules/package-json/node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "engines": { "node": ">=6" } }, "node_modules/package-json/node_modules/@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "dependencies": { "defer-to-connect": "^1.0.1" }, "engines": { "node": ">=6" } }, "node_modules/package-json/node_modules/cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^3.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^4.1.0", "responselike": "^1.0.2" }, "engines": { "node": ">=8" } }, "node_modules/package-json/node_modules/cacheable-request/node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { "pump": "^3.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/package-json/node_modules/decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dependencies": { "mimic-response": "^1.0.0" }, "engines": { "node": ">=4" } }, "node_modules/package-json/node_modules/defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, "node_modules/package-json/node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dependencies": { "pump": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/package-json/node_modules/got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "dependencies": { "@sindresorhus/is": "^0.14.0", "@szmarczak/http-timer": "^1.1.2", "cacheable-request": "^6.0.0", "decompress-response": "^3.3.0", "duplexer3": "^0.1.4", "get-stream": "^4.1.0", "lowercase-keys": "^1.0.1", "mimic-response": "^1.0.1", "p-cancelable": "^1.0.0", "to-readable-stream": "^1.0.0", "url-parse-lax": "^3.0.0" }, "engines": { "node": ">=8.6" } }, "node_modules/package-json/node_modules/got/node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "engines": { "node": ">=0.10.0" } }, "node_modules/package-json/node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" }, "node_modules/package-json/node_modules/keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "dependencies": { "json-buffer": "3.0.0" } }, "node_modules/package-json/node_modules/normalize-url": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "engines": { "node": ">=8" } }, "node_modules/package-json/node_modules/p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "engines": { "node": ">=6" } }, "node_modules/package-json/node_modules/responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "dependencies": { "lowercase-keys": "^1.0.0" } }, "node_modules/package-json/node_modules/responselike/node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "engines": { "node": ">=0.10.0" } }, "node_modules/package-json/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dependencies": { "callsites": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/parse-english": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/parse-english/-/parse-english-4.2.0.tgz", "integrity": "sha512-jw5N6wZUZViIw3VLG/FUSeL3vDhfw5Q2g4E3nYC69Mm5ANbh9ZWd+eligQbeUoyObZM8neynTn3l14e09pjEWg==", "dependencies": { "nlcst-to-string": "^2.0.0", "parse-latin": "^4.0.0", "unist-util-modify-children": "^2.0.0", "unist-util-visit-children": "^1.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/parse-entities": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", "dependencies": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", "character-reference-invalid": "^1.0.0", "is-alphanumerical": "^1.0.0", "is-decimal": "^1.0.0", "is-hexadecimal": "^1.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "dependencies": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", "path-root": "^0.1.1" }, "engines": { "node": ">=0.8" } }, "node_modules/parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==", "dev": true, "optional": true, "dependencies": { "glob-base": "^0.3.0", "is-dotfile": "^1.0.0", "is-extglob": "^1.0.0", "is-glob": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse-latin": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-4.3.0.tgz", "integrity": "sha512-TYKL+K98dcAWoCw/Ac1yrPviU8Trk+/gmjQVaoWEFDZmVD4KRg6c/80xKqNNFQObo2mTONgF8trzAf2UTwKafw==", "dependencies": { "nlcst-to-string": "^2.0.0", "unist-util-modify-children": "^2.0.0", "unist-util-visit-children": "^1.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/parse-numeric-range": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz", "integrity": "sha512-m6xRZuda9v6EGdnPMIkcyB3/NpdgbMJG8yPAQ0Mwm1nGlm2OE/o6YS0EAxAqv6u4/PKQPp6BNoylZnRb2U2/OA==" }, "node_modules/parse-path": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "dependencies": { "protocols": "^2.0.0" } }, "node_modules/parse-srcset": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" }, "node_modules/parse-url": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "dependencies": { "parse-path": "^7.0.0" } }, "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { "entities": "^4.4.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", "dependencies": { "domhandler": "^5.0.2", "parse5": "^7.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parseqs": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" }, "node_modules/parseuri": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "engines": { "node": ">= 0.8" } }, "node_modules/pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/password-prompt": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz", "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==", "dependencies": { "ansi-escapes": "^3.1.0", "cross-spawn": "^6.0.5" } }, "node_modules/password-prompt/node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" }, "engines": { "node": ">=4.8" } }, "node_modules/password-prompt/node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "engines": { "node": ">=4" } }, "node_modules/password-prompt/node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dependencies": { "shebang-regex": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/password-prompt/node_modules/shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/password-prompt/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "bin/which" } }, "node_modules/path-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } }, "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-root": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", "dependencies": { "path-root-regex": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/path-root-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "engines": { "node": ">=8" } }, "node_modules/peek-readable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", "engines": { "node": ">=8" }, "funding": { "type": "github", "url": "https://github.com/sponsors/Borewit" } }, "node_modules/physical-cpu-count": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz", "integrity": "sha512-rxJOljMuWtYlvREBmd6TZYanfcPhNUKtGDZBjBBS8WG1dpN2iwPsRJZgQqN/OtJuiQckdRFOfzogqJClTrsi7g==" }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dependencies": { "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-up": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "dependencies": { "find-up": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-up/node_modules/find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dependencies": { "locate-path": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/pkg-up/node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/pkg-up/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dependencies": { "p-limit": "^2.0.0" }, "engines": { "node": ">=6" } }, "node_modules/pkg-up/node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "engines": { "node": ">=4" } }, "node_modules/platform": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, "node_modules/popper.js": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/postcss": { "version": "8.4.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", "funding": [ { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" } ], "dependencies": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-calc": { "version": "8.2.4", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", "dependencies": { "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.2" } }, "node_modules/postcss-colormin": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", "dependencies": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-convert-values": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-discard-comments": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-flexbugs-fixes": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", "peerDependencies": { "postcss": "^8.1.4" } }, "node_modules/postcss-loader": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-5.3.0.tgz", "integrity": "sha512-/+Z1RAmssdiSLgIZwnJHwBMnlABPgF7giYzTN2NOfr9D21IJZ4mQC1R2miwp80zno9M4zMD/umGI8cR+2EL5zw==", "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.4", "semver": "^7.3.4" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" } }, "node_modules/postcss-loader/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/postcss-loader/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/postcss-loader/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/postcss-merge-longhand": { "version": "5.1.7", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.1" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-merge-rules": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-font-values": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-gradients": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", "dependencies": { "colord": "^2.9.1", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-params": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dependencies": { "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-selectors": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", "dependencies": { "postcss-selector-parser": "^6.0.5" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "engines": { "node": "^10 || ^12 || >= 14" }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/postcss-modules-local-by-default": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" }, "engines": { "node": "^10 || ^12 || >= 14" }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/postcss-modules-scope": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dependencies": { "postcss-selector-parser": "^6.0.4" }, "engines": { "node": "^10 || ^12 || >= 14" }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/postcss-modules-values": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dependencies": { "icss-utils": "^5.0.0" }, "engines": { "node": "^10 || ^12 || >= 14" }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/postcss-normalize-charset": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-display-values": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-positions": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-repeat-style": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-string": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-timing-functions": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-unicode": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-url": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", "dependencies": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-whitespace": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-ordered-values": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", "dependencies": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-reduce-initial": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-reduce-transforms": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-selector-parser": { "version": "6.0.11", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" }, "engines": { "node": ">=4" } }, "node_modules/postcss-svgo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^2.7.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-unique-selectors": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", "dependencies": { "postcss-selector-parser": "^6.0.5" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^1.0.1", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" }, "engines": { "node": ">=10" } }, "node_modules/prebuild-install/node_modules/detect-libc": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", "engines": { "node": ">=8" } }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "engines": { "node": ">= 0.8.0" } }, "node_modules/prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", "engines": { "node": ">=4" } }, "node_modules/preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=4" } }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pretty-error": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "dependencies": { "lodash": "^4.17.20", "renderkid": "^2.0.4" } }, "node_modules/prismjs": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", "engines": { "node": ">=6" } }, "node_modules/private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/probe-image-size": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", "dependencies": { "lodash.merge": "^4.6.2", "needle": "^2.5.2", "stream-parser": "~0.3.1" } }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "engines": { "node": ">=0.4.0" } }, "node_modules/promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dependencies": { "asap": "~2.0.3" } }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" }, "engines": { "node": ">= 6" } }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "node_modules/proper-lockfile": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "node_modules/property-information": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", "dependencies": { "xtend": "^4.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/protocols": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" }, "engines": { "node": ">= 0.10" } }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "engines": { "node": ">=6" } }, "node_modules/pupa": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", "dependencies": { "escape-goat": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, "engines": { "node": ">=0.6" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/query-string": { "version": "6.14.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", "dependencies": { "decode-uri-component": "^0.2.0", "filter-obj": "^1.1.0", "split-on-first": "^1.0.0", "strict-uri-encode": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ramda": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz", "integrity": "sha512-HGd5aczYKQXGILB+abY290V7Xz62eFajpa6AtMdwEmQSakJmgSO7ks4eI3HdR34j+X2Vz4Thp9VAJbrCAMbO2w==" }, "node_modules/randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, "optional": true, "dependencies": { "is-number": "^4.0.0", "kind-of": "^6.0.0", "math-random": "^1.0.1" }, "engines": { "node": ">= 0.10.0" } }, "node_modules/randomatic/node_modules/is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "engines": { "node": ">= 0.8" } }, "node_modules/raw-body/node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } }, "node_modules/raw-loader": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "cli.js" } }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/react": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", "dependencies": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", "browserslist": "^4.18.1", "chalk": "^4.1.2", "cross-spawn": "^7.0.3", "detect-port-alt": "^1.1.6", "escape-string-regexp": "^4.0.0", "filesize": "^8.0.6", "find-up": "^5.0.0", "fork-ts-checker-webpack-plugin": "^6.5.0", "global-modules": "^2.0.0", "globby": "^11.0.4", "gzip-size": "^6.0.0", "immer": "^9.0.7", "is-root": "^2.1.0", "loader-utils": "^3.2.0", "open": "^8.4.0", "pkg-up": "^3.1.0", "prompts": "^2.4.2", "react-error-overlay": "^6.0.11", "recursive-readdir": "^2.2.2", "shell-quote": "^1.7.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "engines": { "node": ">=14" } }, "node_modules/react-dev-utils/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/react-dev-utils/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/react-dev-utils/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/react-dev-utils/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/react-dev-utils/node_modules/loader-utils": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "engines": { "node": ">= 12.13.0" } }, "node_modules/react-dev-utils/node_modules/open": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/react-dev-utils/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/react-dev-utils/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/react-dom": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", "scheduler": "^0.19.1" }, "peerDependencies": { "react": "^16.14.0" } }, "node_modules/react-error-overlay": { "version": "6.0.11", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, "node_modules/react-fast-compare": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" }, "node_modules/react-helmet": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-5.2.1.tgz", "integrity": "sha512-CnwD822LU8NDBnjCpZ4ySh8L6HYyngViTZLfBBb3NjtrpN8m49clH8hidHouq20I51Y6TpCTISCBbqiY5GamwA==", "dependencies": { "object-assign": "^4.1.1", "prop-types": "^15.5.4", "react-fast-compare": "^2.0.2", "react-side-effect": "^1.1.0" }, "peerDependencies": { "react": ">=15.0.0" } }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-jss": { "version": "8.6.1", "resolved": "https://registry.npmjs.org/react-jss/-/react-jss-8.6.1.tgz", "integrity": "sha512-SH6XrJDJkAphp602J14JTy3puB2Zxz1FkM3bKVE8wON+va99jnUTKWnzGECb3NfIn9JPR5vHykge7K3/A747xQ==", "dependencies": { "hoist-non-react-statics": "^2.5.0", "jss": "^9.7.0", "jss-preset-default": "^4.3.0", "prop-types": "^15.6.0", "theming": "^1.3.0" }, "engines": { "node": ">=4" }, "peerDependencies": { "react": ">=0.13" } }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "node_modules/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/react-side-effect": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.2.0.tgz", "integrity": "sha512-v1ht1aHg5k/thv56DRcjw+WtojuuDHFUgGfc+bFHOWsF4ZK6C2V57DO0Or0GPsg6+LSTE0M6Ry/gfzhzSwbc5w==", "dependencies": { "shallowequal": "^1.0.1" }, "peerDependencies": { "react": "^0.13.0 || ^0.14.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", "dependencies": { "mute-stream": "~0.0.4" }, "engines": { "node": ">=0.8" } }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/readable-web-to-node-stream": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", "dependencies": { "readable-stream": "^3.6.0" }, "engines": { "node": ">=8" }, "funding": { "type": "github", "url": "https://github.com/sponsors/Borewit" } }, "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "optional": true, "dependencies": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" }, "engines": { "node": ">=0.10" } }, "node_modules/readdirp/node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "optional": true, "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", "extend-shallow": "^2.0.1", "fill-range": "^4.0.0", "isobject": "^3.0.1", "repeat-element": "^1.1.2", "snapdragon": "^0.8.1", "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", "dev": true, "optional": true, "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "posix-character-classes": "^0.1.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/expand-brackets/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "optional": true, "dependencies": { "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "optional": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/expand-brackets/node_modules/kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "optional": true, "dependencies": { "array-unique": "^0.3.2", "define-property": "^1.0.0", "expand-brackets": "^2.1.4", "extend-shallow": "^2.0.1", "fragment-cache": "^0.2.1", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/extglob/node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "optional": true, "dependencies": { "is-descriptor": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "dev": true, "optional": true, "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "node_modules/readdirp/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/is-data-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "optional": true, "dependencies": { "is-plain-object": "^2.0.4" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "optional": true, "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "extglob": "^2.0.4", "fragment-cache": "^0.2.1", "kind-of": "^6.0.2", "nanomatch": "^1.2.9", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/micromatch/node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "optional": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/readdirp/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "optional": true, "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/recursive-readdir": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dependencies": { "minimatch": "^3.0.5" }, "engines": { "node": ">=6.0.0" } }, "node_modules/redux": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz", "integrity": "sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==", "dependencies": { "@babel/runtime": "^7.9.2" } }, "node_modules/redux-thunk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", "peerDependencies": { "redux": "^4" } }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dependencies": { "regenerate": "^1.4.2" }, "engines": { "node": ">=4" } }, "node_modules/regenerator-runtime": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==", "dev": true }, "node_modules/regenerator-transform": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "dependencies": { "babel-runtime": "^6.18.0", "babel-types": "^6.19.0", "private": "^0.1.6" } }, "node_modules/regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "optional": true, "dependencies": { "is-equal-shallow": "^0.1.3" }, "engines": { "node": ">=0.10.0" } }, "node_modules/regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "optional": true, "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/regex-not/node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "optional": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/regex-not/node_modules/is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "optional": true, "dependencies": { "is-plain-object": "^2.0.4" }, "engines": { "node": ">=0.10.0" } }, "node_modules/regex-parser": { "version": "2.2.11", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", "integrity": "sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ==", "dev": true, "dependencies": { "regenerate": "^1.2.1", "regjsgen": "^0.2.0", "regjsparser": "^0.1.4" } }, "node_modules/registry-auth-token": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", "dependencies": { "rc": "1.2.8" }, "engines": { "node": ">=6.0.0" } }, "node_modules/registry-url": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", "dependencies": { "rc": "^1.2.8" }, "engines": { "node": ">=8" } }, "node_modules/regjsgen": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", "integrity": "sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==", "dev": true }, "node_modules/regjsparser": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "integrity": "sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==", "dev": true, "dependencies": { "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" } }, "node_modules/rehype-react": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-3.1.0.tgz", "integrity": "sha512-7SiLiqNudSGkvhrePkdKqdUvngZqzG+PJhdR5EeIFELz2j2ek4aO5DHbxUXYvaZfqUiBDO2Aeq1OROUmxmu+Vg==", "dependencies": { "@mapbox/hast-util-table-cell-style": "^0.1.3", "has": "^1.0.1", "hast-to-hyperscript": "^5.0.0" } }, "node_modules/rehype-react/node_modules/hast-to-hyperscript": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-5.0.0.tgz", "integrity": "sha512-DLl3eYTz8uwwzEubDUdCChsR5t5b2ne+yvHrA2h58Suq/JnN3+Gsb9Tc4iZoCCsykmFUc6UUpwxTmQXs0akSeg==", "dependencies": { "comma-separated-tokens": "^1.0.0", "property-information": "^4.0.0", "space-separated-tokens": "^1.0.0", "style-to-object": "^0.2.1", "unist-util-is": "^2.0.0", "web-namespaces": "^1.1.2" } }, "node_modules/rehype-react/node_modules/property-information": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-4.2.0.tgz", "integrity": "sha512-TlgDPagHh+eBKOnH2VYvk8qbwsCG/TAJdmTL7f1PROUcSO8qt/KSmShEQ/OKvock8X9tFjtqjCScyOkkkvIKVQ==", "dependencies": { "xtend": "^4.0.1" } }, "node_modules/rehype-react/node_modules/style-to-object": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz", "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==", "dependencies": { "inline-style-parser": "0.1.1" } }, "node_modules/rehype-react/node_modules/unist-util-is": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" }, "node_modules/relay-runtime": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz", "integrity": "sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==", "dependencies": { "@babel/runtime": "^7.0.0", "fbjs": "^3.0.0", "invariant": "^2.2.4" } }, "node_modules/remark": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", "dependencies": { "remark-parse": "^9.0.0", "remark-stringify": "^9.0.0", "unified": "^9.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-footnotes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-3.0.0.tgz", "integrity": "sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==", "dependencies": { "mdast-util-footnote": "^0.1.0", "micromark-extension-footnote": "^0.3.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-gfm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz", "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==", "dependencies": { "mdast-util-gfm": "^0.1.0", "micromark-extension-gfm": "^0.3.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-parse": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", "dependencies": { "mdast-util-from-markdown": "^0.8.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-react": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/remark-react/-/remark-react-5.0.1.tgz", "integrity": "sha512-yHv5WIh47srKfdm794UMIHjNLr6EY2YCzsqvdJ/qvN1Tq1jgyg3q8Zo9pJc4L7BwZOMTia6O2JgrJeOsJfowzA==", "dependencies": { "@mapbox/hast-util-table-cell-style": "^0.1.3", "hast-to-hyperscript": "^6.0.0", "hast-util-sanitize": "^1.0.0", "mdast-util-to-hast": "^4.0.0" } }, "node_modules/remark-react/node_modules/hast-to-hyperscript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-6.0.0.tgz", "integrity": "sha512-QnJbXddVGNJ5v3KegK1MY6luTkNDBcJnCQZcekt7AkES2z4tYy85pbFUXx7Mb0iXZBKfwoVdgfxU12GbmlwbbQ==", "dependencies": { "comma-separated-tokens": "^1.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0", "style-to-object": "^0.2.1", "unist-util-is": "^2.0.0", "web-namespaces": "^1.1.2" } }, "node_modules/remark-react/node_modules/mdast-util-definitions": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz", "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==", "dependencies": { "unist-util-visit": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-react/node_modules/mdast-util-to-hast": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-4.0.0.tgz", "integrity": "sha512-yOTZSxR1aPvWRUxVeLaLZ1sCYrK87x2Wusp1bDM/Ao2jETBhYUKITI3nHvgy+HkZW54HuCAhHnS0mTcbECD5Ig==", "dependencies": { "collapse-white-space": "^1.0.0", "detab": "^2.0.0", "mdast-util-definitions": "^1.2.0", "mdurl": "^1.0.1", "trim": "0.0.1", "trim-lines": "^1.0.0", "unist-builder": "^1.0.1", "unist-util-generated": "^1.1.0", "unist-util-position": "^3.0.0", "unist-util-visit": "^1.1.0", "xtend": "^4.0.1" } }, "node_modules/remark-react/node_modules/style-to-object": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz", "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==", "dependencies": { "inline-style-parser": "0.1.1" } }, "node_modules/remark-react/node_modules/unist-builder": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.4.tgz", "integrity": "sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg==", "dependencies": { "object-assign": "^4.1.0" } }, "node_modules/remark-react/node_modules/unist-util-is": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" }, "node_modules/remark-retext": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-4.0.0.tgz", "integrity": "sha512-cYCchalpf25bTtfXF24ribYvqytPKq0TiEhqQDBHvVEEsApebwruPWP1cTcvTFBidmpXyqzycm+y8ng7Kmvc8Q==", "dependencies": { "mdast-util-to-nlcst": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-stringify": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", "dependencies": { "mdast-util-to-markdown": "^0.6.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" }, "node_modules/renderkid": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", "strip-ansi": "^3.0.1" } }, "node_modules/renderkid/node_modules/css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/fb55" } }, "node_modules/renderkid/node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, "node_modules/renderkid/node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dependencies": { "domelementtype": "^2.2.0" }, "engines": { "node": ">= 4" }, "funding": { "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/renderkid/node_modules/domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/renderkid/node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/renderkid/node_modules/htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { "type": "github", "url": "https://github.com/sponsors/fb55" } ], "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", "domutils": "^2.5.2", "entities": "^2.0.0" } }, "node_modules/repeat-element": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "engines": { "node": ">=0.10" } }, "node_modules/repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", "dev": true, "dependencies": { "is-finite": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "engines": { "node": ">=0.10.0" } }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "node_modules/require-package-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz", "integrity": "sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==" }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dependencies": { "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "engines": { "node": ">=8" } }, "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", "deprecated": "https://github.com/lydell/resolve-url#deprecated" }, "node_modules/resolve-url-loader": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.5.tgz", "integrity": "sha512-mgFMCmrV/tA4738EsFmPFE5/MaqSgUMe8LK971kVEKA/RrNVb7+VqFsg/qmKyythf34eyq476qIobP/gfFBGSQ==", "dependencies": { "adjust-sourcemap-loader": "3.0.0", "camelcase": "5.3.1", "compose-function": "3.0.3", "convert-source-map": "1.7.0", "es6-iterator": "2.0.3", "loader-utils": "^1.2.3", "postcss": "7.0.36", "rework": "1.0.1", "rework-visit": "1.0.0", "source-map": "0.6.1" }, "engines": { "node": ">=6.0.0" } }, "node_modules/resolve-url-loader/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, "node_modules/resolve-url-loader/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { "node": ">=6" } }, "node_modules/resolve-url-loader/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, "node_modules/resolve-url-loader/node_modules/chalk/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/resolve-url-loader/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { "color-name": "1.1.3" } }, "node_modules/resolve-url-loader/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/resolve-url-loader/node_modules/convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dependencies": { "safe-buffer": "~5.1.1" } }, "node_modules/resolve-url-loader/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { "node": ">=4" } }, "node_modules/resolve-url-loader/node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "node_modules/resolve-url-loader/node_modules/loader-utils": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^1.0.1" }, "engines": { "node": ">=4.0.0" } }, "node_modules/resolve-url-loader/node_modules/postcss": { "version": "7.0.36", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dependencies": { "chalk": "^2.4.2", "source-map": "^0.6.1", "supports-color": "^6.1.0" }, "engines": { "node": ">=6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/postcss/" } }, "node_modules/resolve-url-loader/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve-url-loader/node_modules/supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dependencies": { "lowercase-keys": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { "node": ">=8" } }, "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true, "optional": true, "engines": { "node": ">=0.12" } }, "node_modules/retext": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/retext/-/retext-7.0.1.tgz", "integrity": "sha512-N0IaEDkvUjqyfn3/gwxVfI51IxfGzOiVXqPLWnKeCDbiQdxSg0zebzHPxXWnL7TeplAJ+RE4uqrXyYN//s9HjQ==", "dependencies": { "retext-latin": "^2.0.0", "retext-stringify": "^2.0.0", "unified": "^8.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/retext-english": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/retext-english/-/retext-english-3.0.4.tgz", "integrity": "sha512-yr1PgaBDde+25aJXrnt3p1jvT8FVLVat2Bx8XeAWX13KXo8OT+3nWGU3HWxM4YFJvmfqvJYJZG2d7xxaO774gw==", "dependencies": { "parse-english": "^4.0.0", "unherit": "^1.0.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/retext-latin": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-2.0.4.tgz", "integrity": "sha512-fOoSSoQgDZ+l/uS81oxI3alBghDUPja0JEl0TpQxI6MN+dhM6fLFumPJwMZ4PJTyL5FFAgjlsdv8IX+6IRuwMw==", "dependencies": { "parse-latin": "^4.0.0", "unherit": "^1.0.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/retext-smartypants": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-4.0.0.tgz", "integrity": "sha512-Mknd05zuIycr4Z/hNDxA8ktqv7pG7wYdTZc68a2MJF+Ibg/WloR5bbyrEjijwNwHRR+xWsovkLH4OQIz/mghdw==", "dependencies": { "nlcst-to-string": "^2.0.0", "unist-util-visit": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/retext-smartypants/node_modules/unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/retext-stringify": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-2.0.4.tgz", "integrity": "sha512-xOtx5mFJBoT3j7PBtiY2I+mEGERNniofWktI1cKXvjMEJPOuqve0dghLHO1+gz/gScLn4zqspDGv4kk2wS5kSA==", "dependencies": { "nlcst-to-string": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/retext/node_modules/unified": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", "dependencies": { "bail": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^2.0.0", "trough": "^1.0.0", "vfile": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "engines": { "node": ">= 4" } }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rework": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", "integrity": "sha512-eEjL8FdkdsxApd0yWVZgBGzfCQiT8yqSc2H1p4jpZpQdtz7ohETiDMoje5PlM8I9WgkqkreVxFUKYOiJdVWDXw==", "dependencies": { "convert-source-map": "^0.3.3", "css": "^2.0.0" } }, "node_modules/rework-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", "integrity": "sha512-W6V2fix7nCLUYX1v6eGPrBOZlc03/faqzP4sUxMAJMBMOPYhfV/RyLegTufn5gJKaOITyi+gvf0LXDZ9NzkHnQ==" }, "node_modules/rework/node_modules/convert-source-map": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", "integrity": "sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg==" }, "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "engines": { "node": ">=0.12.0" } }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rx": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==" }, "node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dependencies": { "tslib": "^1.9.0" }, "engines": { "npm": ">=2.0.0" } }, "node_modules/rxjs/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", "dev": true, "optional": true, "dependencies": { "ret": "~0.1.10" } }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sanitize-html": { "version": "1.27.5", "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.27.5.tgz", "integrity": "sha512-M4M5iXDAUEcZKLXkmk90zSYWEtk5NH3JmojQxKxV371fnMh+x9t1rqdmXaGoyEHw3z/X/8vnFhKjGL5xFGOJ3A==", "dependencies": { "htmlparser2": "^4.1.0", "lodash": "^4.17.15", "parse-srcset": "^1.0.2", "postcss": "^7.0.27" } }, "node_modules/sanitize-html/node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, "node_modules/sanitize-html/node_modules/dom-serializer/node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dependencies": { "domelementtype": "^2.2.0" }, "engines": { "node": ">= 4" }, "funding": { "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/sanitize-html/node_modules/domhandler": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", "dependencies": { "domelementtype": "^2.0.1" }, "engines": { "node": ">= 4" }, "funding": { "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/sanitize-html/node_modules/domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/sanitize-html/node_modules/domutils/node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dependencies": { "domelementtype": "^2.2.0" }, "engines": { "node": ">= 4" }, "funding": { "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/sanitize-html/node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/sanitize-html/node_modules/htmlparser2": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^3.0.0", "domutils": "^2.0.0", "entities": "^2.0.0" } }, "node_modules/sanitize-html/node_modules/picocolors": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" }, "node_modules/sanitize-html/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" }, "engines": { "node": ">=6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/postcss/" } }, "node_modules/sanitize-html/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, "node_modules/sass": { "version": "1.57.1", "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz", "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==", "peer": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { "sass": "sass.js" }, "engines": { "node": ">=12.0.0" } }, "node_modules/sass-loader": { "version": "10.4.1", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.4.1.tgz", "integrity": "sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==", "dependencies": { "klona": "^2.0.4", "loader-utils": "^2.0.0", "neo-async": "^2.6.2", "schema-utils": "^3.0.0", "semver": "^7.3.2" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "fibers": ">= 3.1.0", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "sass": "^1.3.0", "webpack": "^4.36.0 || ^5.0.0" }, "peerDependenciesMeta": { "fibers": { "optional": true }, "node-sass": { "optional": true }, "sass": { "optional": true } } }, "node_modules/sass-loader/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/sass-loader/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/sass-loader/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/sass-resources-loader": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-1.3.5.tgz", "integrity": "sha512-pCxaoRZxbKxDWhu5ZcsV7/apPYrL/z0F+25C29L4e8pajWM/4jM4hRXSRP4jEWTXo/kYIU9bEXKZZdGfjN90+Q==", "dependencies": { "async": "^2.1.4", "chalk": "^1.1.3", "glob": "^7.1.1", "loader-utils": "^1.0.4" } }, "node_modules/sass-resources-loader/node_modules/async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dependencies": { "lodash": "^4.17.14" } }, "node_modules/sass-resources-loader/node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "node_modules/sass-resources-loader/node_modules/loader-utils": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^1.0.1" }, "engines": { "node": ">=4.0.0" } }, "node_modules/sass/node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "peer": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/sass/node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "peer": true, "engines": { "node": ">=8" } }, "node_modules/sass/node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "peer": true, "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/sass/node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/sass/node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "peer": true, "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/sass/node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/sass/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "peer": true, "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/sass/node_modules/immutable": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz", "integrity": "sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og==", "peer": true }, "node_modules/sass/node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "peer": true, "dependencies": { "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/sass/node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/sass/node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "peer": true, "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/sass/node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/sass/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "peer": true, "dependencies": { "picomatch": "^2.2.1" }, "engines": { "node": ">=8.10.0" } }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/scheduler": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" }, "engines": { "node": ">=4" } }, "node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "bin": { "semver": "bin/semver" } }, "node_modules/semver-diff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", "dependencies": { "semver": "^6.3.0" }, "engines": { "node": ">=8" } }, "node_modules/semver-diff/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/send/node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "bin": { "mime": "cli.js" }, "engines": { "node": ">=4" } }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/sentence-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, "node_modules/serialize-javascript": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "optional": true, "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dependencies": { "kind-of": "^6.0.2" }, "engines": { "node": ">=8" } }, "node_modules/shallow-compare": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/shallow-compare/-/shallow-compare-1.2.2.tgz", "integrity": "sha512-LUMFi+RppPlrHzbqmFnINTrazo0lPNwhcgzuAXVVcfy/mqPDrQmHAyz5bvV0gDAuRFrk804V0HpQ6u9sZ0tBeg==" }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" }, "node_modules/sharp": { "version": "0.30.7", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.7.tgz", "integrity": "sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==", "hasInstallScript": true, "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.1", "node-addon-api": "^5.0.0", "prebuild-install": "^7.1.1", "semver": "^7.3.7", "simple-get": "^4.0.1", "tar-fs": "^2.1.1", "tunnel-agent": "^0.6.0" }, "engines": { "node": ">=12.13.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/sharp/node_modules/detect-libc": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", "engines": { "node": ">=8" } }, "node_modules/sharp/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/sharp/node_modules/node-addon-api": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" }, "node_modules/sharp/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/sharp/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": { "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/signedsource": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==" }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/simple-get": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "dependencies": { "is-arrayish": "^0.3.1" } }, "node_modules/simple-swizzle/node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/sitemap": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.2.4" }, "bin": { "sitemap": "dist/cli.js" }, "engines": { "node": ">=12.0.0", "npm": ">=5.6.0" } }, "node_modules/sitemap/node_modules/@types/node": { "version": "17.0.45", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" }, "node_modules/slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/slugify": { "version": "1.6.5", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz", "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==", "engines": { "node": ">=8.0.0" } }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "optional": true, "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "map-cache": "^0.2.2", "source-map": "^0.5.6", "source-map-resolve": "^0.5.0", "use": "^3.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "optional": true, "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon-node/node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "optional": true, "dependencies": { "is-descriptor": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon-node/node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.2.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon-util/node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "node_modules/snapdragon-util/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "optional": true, "dependencies": { "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "node_modules/snapdragon/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "optional": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/snapdragon/node_modules/kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/socket.io": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", "integrity": "sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw==", "dependencies": { "@types/cookie": "^0.4.0", "@types/cors": "^2.8.8", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.1", "engine.io": "~4.1.0", "socket.io-adapter": "~2.1.0", "socket.io-parser": "~4.0.3" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socket.io-adapter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz", "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==" }, "node_modules/socket.io-client": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-3.1.3.tgz", "integrity": "sha512-4sIGOGOmCg3AOgGi7EEr6ZkTZRkrXwub70bBB/F0JSkMOUFpA77WsL87o34DffQQ31PkbMUIadGOk+3tx1KGbw==", "dependencies": { "@types/component-emitter": "^1.2.10", "backo2": "~1.0.2", "component-emitter": "~1.3.0", "debug": "~4.3.1", "engine.io-client": "~4.1.0", "parseuri": "0.0.6", "socket.io-parser": "~4.0.4" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socket.io-client/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/socket.io-client/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/socket.io-parser": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz", "integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==", "dependencies": { "@types/component-emitter": "^1.2.10", "component-emitter": "~1.3.0", "debug": "~4.3.1" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socket.io-parser/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/socket.io-parser/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/socket.io/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/socket.io/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", "urix": "^0.1.0" } }, "node_modules/source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "dependencies": { "source-map": "^0.5.6" } }, "node_modules/source-map-url": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "deprecated": "See https://github.com/lydell/source-map-url#deprecated" }, "node_modules/space-separated-tokens": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/split-on-first": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", "engines": { "node": ">=6" } }, "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "optional": true, "dependencies": { "extend-shallow": "^3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/split-string/node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "optional": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/split-string/node_modules/is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "optional": true, "dependencies": { "is-plain-object": "^2.0.4" }, "engines": { "node": ">=0.10.0" } }, "node_modules/sponge-case": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz", "integrity": "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/st": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/st/-/st-2.0.0.tgz", "integrity": "sha512-drN+aGYnrZPNYIymmNwIY7LXYJ8MqsqXj4fMRue3FOgGMdGjSX10fhJ3qx0sVQPhcWxhEaN4U/eWM4O4dbYNAw==", "dependencies": { "async-cache": "^1.1.0", "bl": "^4.0.0", "fd": "~0.0.2", "mime": "^2.4.4", "negotiator": "~0.6.2" }, "bin": { "st": "bin/server.js" }, "optionalDependencies": { "graceful-fs": "^4.2.3" } }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "engines": { "node": "*" } }, "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" }, "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", "dev": true, "optional": true, "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/static-extend/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "optional": true, "dependencies": { "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/static-extend/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/static-extend/node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "node_modules/static-extend/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/static-extend/node_modules/is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "optional": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/static-extend/node_modules/kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { "node": ">= 0.8" } }, "node_modules/stream-parser": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", "dependencies": { "debug": "2" } }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { "node": ">=10.0.0" } }, "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", "engines": { "node": ">=4" } }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/string-natural-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" }, "node_modules/string-similarity": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-1.2.2.tgz", "integrity": "sha512-IoHUjcw3Srl8nsPlW04U3qwWPk3oG2ffLM0tN853d/E/JlIvcmZmDY2Kz5HzKp4lEi2T7QD7Zuvjq/1rDw+XcQ==", "dependencies": { "lodash.every": "^4.6.0", "lodash.flattendeep": "^4.4.0", "lodash.foreach": "^4.5.0", "lodash.map": "^4.6.0", "lodash.maxby": "^4.6.0" } }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/string-width/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string-width/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/string.prototype.matchall": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/stringify-entities": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", "dependencies": { "character-entities-html4": "^1.0.0", "character-entities-legacy": "^1.0.0", "xtend": "^4.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" }, "engines": { "node": ">=4" } }, "node_modules/stringify-object/node_modules/is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "engines": { "node": ">=0.10.0" } }, "node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dependencies": { "ansi-regex": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "engines": { "node": ">=4" } }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", "engines": { "node": ">=0.10.0" } }, "node_modules/strip-comments": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", "dependencies": { "babel-extract-comments": "^1.0.0", "babel-plugin-transform-object-rest-spread": "^6.26.0" }, "engines": { "node": ">=4" } }, "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "engines": { "node": ">=0.10.0" } }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "engines": { "node": ">=6" } }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", "dependencies": { "escape-string-regexp": "^1.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/strtok3": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^4.1.0" }, "engines": { "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/Borewit" } }, "node_modules/style-loader": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/style-to-object": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", "dependencies": { "inline-style-parser": "0.1.1" } }, "node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "dependencies": { "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/sudo-prompt": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz", "integrity": "sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==" }, "node_modules/supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "engines": { "node": ">=0.8.0" } }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/svg-react-loader": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/svg-react-loader/-/svg-react-loader-0.4.6.tgz", "integrity": "sha512-HVEypjWQsQuJdBIPzXGxpmQsQts7QwfQuYgK1rah6BVCMoLNSCh/ESKVNd7/tHq8DkWYHHTyaUMDA1FjqZYrgA==", "dependencies": { "css": "2.2.4", "loader-utils": "1.1.0", "ramda": "0.21.0", "rx": "4.1.0", "traverse": "0.6.6", "xml2js": "0.4.17" } }, "node_modules/svg-react-loader/node_modules/big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", "engines": { "node": "*" } }, "node_modules/svg-react-loader/node_modules/emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", "engines": { "node": ">= 0.10" } }, "node_modules/svg-react-loader/node_modules/json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", "bin": { "json5": "lib/cli.js" } }, "node_modules/svg-react-loader/node_modules/loader-utils": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha512-gkD9aSEG9UGglyPcDJqY9YBTUtCLKaBK6ihD2VP1d1X60lTfFspNZNulGBBbUZLkPygy4LySYHyxBpq+VhjObQ==", "dependencies": { "big.js": "^3.1.3", "emojis-list": "^2.0.0", "json5": "^0.5.0" }, "engines": { "node": ">=4.0.0" } }, "node_modules/svgo": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^4.1.3", "css-tree": "^1.1.3", "csso": "^4.2.0", "picocolors": "^1.0.0", "stable": "^0.1.8" }, "bin": { "svgo": "bin/svgo" }, "engines": { "node": ">=10.13.0" } }, "node_modules/svgo/node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "engines": { "node": ">= 10" } }, "node_modules/svgo/node_modules/css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/fb55" } }, "node_modules/svgo/node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, "node_modules/svgo/node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dependencies": { "domelementtype": "^2.2.0" }, "engines": { "node": ">= 4" }, "funding": { "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/svgo/node_modules/domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/svgo/node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/swap-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz", "integrity": "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/table": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=10.0.0" } }, "node_modules/table/node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/table/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/table/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "engines": { "node": ">=6" } }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" }, "engines": { "node": ">=6" } }, "node_modules/tar-stream/node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/term-size": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/terser": { "version": "5.16.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { "node": ">=10" } }, "node_modules/terser-webpack-plugin": { "version": "5.3.6", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dependencies": { "@jridgewell/trace-mapping": "^0.3.14", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "terser": "^5.14.1" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^5.1.0" }, "peerDependenciesMeta": { "@swc/core": { "optional": true }, "esbuild": { "optional": true }, "uglify-js": { "optional": true } } }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": ">= 10.13.0" } }, "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/terser/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/theming": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/theming/-/theming-1.3.0.tgz", "integrity": "sha512-ya5Ef7XDGbTPBv5ENTwrwkPUexrlPeiAg/EI9kdlUAZhNlRbCdhMKRgjNX1IcmsmiPcqDQZE6BpSaH+cr31FKw==", "dependencies": { "brcast": "^3.0.1", "is-function": "^1.0.1", "is-plain-object": "^2.0.1", "prop-types": "^15.5.8" }, "peerDependencies": { "react": ">=0.15" } }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", "dependencies": { "es5-ext": "~0.10.46", "next-tick": "1" } }, "node_modules/tippy.js": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-4.3.5.tgz", "integrity": "sha512-NDq3efte8nGK6BOJ1dDN1/WelAwfmh3UtIYXXck6+SxLzbIQNZE/cmRSnwScZ/FyiKdIcvFHvYUgqmoGx8CcyA==", "dependencies": { "popper.js": "^1.14.7" } }, "node_modules/title-case": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dependencies": { "rimraf": "^3.0.0" }, "engines": { "node": ">=8.17.0" } }, "node_modules/tmp/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/to-object-path/node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "node_modules/to-object-path/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "engines": { "node": ">=6" } }, "node_modules/to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "optional": true, "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { "is-number": "^7.0.0" }, "engines": { "node": ">=8.0" } }, "node_modules/to-regex-range/node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { "node": ">=0.12.0" } }, "node_modules/to-regex/node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "optional": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/to-regex/node_modules/is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "optional": true, "dependencies": { "is-plain-object": "^2.0.4" }, "engines": { "node": ">=0.10.0" } }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } }, "node_modules/token-types": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" }, "engines": { "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/Borewit" } }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/traverse": { "version": "0.6.6", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", "integrity": "sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==" }, "node_modules/trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" }, "node_modules/trim-lines": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-1.1.3.tgz", "integrity": "sha512-E0ZosSWYK2mkSu+KEtQ9/KqarVjA9HztOSX+9FDdNacRAq29RRV6ZQNgob3iuW8Htar9vAfEa6yyt5qBAHZDBA==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", "dependencies": { "escape-string-regexp": "^1.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/trough": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/true-case-path": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==" }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.1", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "node_modules/tslib": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dependencies": { "tslib": "^1.8.1" }, "engines": { "node": ">= 6" }, "peerDependencies": { "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dependencies": { "safe-buffer": "^5.0.1" }, "engines": { "node": "*" } }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dependencies": { "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" }, "engines": { "node": ">= 0.6" } }, "node_modules/type-of": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-of/-/type-of-2.0.1.tgz", "integrity": "sha512-39wxbwHdQ2sTiBB8wAzKfQ9GN+om8w+sjNWzr+vZJR5AMD5J+J7Yc8AtXnU9r/r2c8XiDZ/smxutDmZehX/qpQ==" }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", "is-typed-array": "^1.1.9" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typescript": { "version": "4.9.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=4.2.0" } }, "node_modules/ua-parser-js": { "version": "0.7.32", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==", "funding": [ { "type": "opencollective", "url": "https://opencollective.com/ua-parser-js" }, { "type": "paypal", "url": "https://paypal.me/faisalman" } ], "engines": { "node": "*" } }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", "engines": { "node": ">=0.10.0" } }, "node_modules/underscore.string": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", "dependencies": { "sprintf-js": "^1.1.1", "util-deprecate": "^1.0.2" }, "engines": { "node": "*" } }, "node_modules/underscore.string/node_modules/sprintf-js": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" }, "node_modules/unherit": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", "dependencies": { "inherits": "^2.0.0", "xtend": "^4.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "engines": { "node": ">=4" } }, "node_modules/unified": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", "dependencies": { "bail": "^1.0.0", "extend": "^3.0.0", "is-buffer": "^2.0.0", "is-plain-obj": "^2.0.0", "trough": "^1.0.0", "vfile": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "optional": true, "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dependencies": { "crypto-random-string": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/unist-builder": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-generated": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-is": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-modify-children": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-2.0.0.tgz", "integrity": "sha512-HGrj7JQo9DwZt8XFsX8UD4gGqOsIlCih9opG6Y+N11XqkBGKzHo8cvDi+MfQQgiZ7zXRUiQREYHhjOBHERTMdg==", "dependencies": { "array-iterate": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-position": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-remove": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-1.0.3.tgz", "integrity": "sha512-mB6nCHCQK0pQffUAcCVmKgIWzG/AXs/V8qpS8K72tMPtOSCMSjDeMc5yN+Ye8rB0FhcE+JvW++o1xRNc0R+++g==", "dependencies": { "unist-util-is": "^3.0.0" } }, "node_modules/unist-util-remove-position": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-3.0.0.tgz", "integrity": "sha512-17kIOuolVuK16LMb9KyMJlqdfCtlfQY5FjY3Sdo9iC7F5wqdXhNjMq0PBvMpkVNNnAmHxXssUW+rZ9T2zbP0Rg==", "dependencies": { "unist-util-visit": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-remove-position/node_modules/unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-remove/node_modules/unist-util-is": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" }, "node_modules/unist-util-select": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-3.0.4.tgz", "integrity": "sha512-xf1zCu4okgPqGLdhCDpRnjwBNyv3EqjiXRUbz2SdK1+qnLMB7uXXajfzuBvvbHoQ+JLyp4AEbFCGndmc6S72sw==", "dependencies": { "css-selector-parser": "^1.0.0", "not": "^0.1.0", "nth-check": "^2.0.0", "unist-util-is": "^4.0.0", "zwitch": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-stringify-position": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", "dependencies": { "@types/unist": "^2.0.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-visit": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", "dependencies": { "unist-util-visit-parents": "^2.0.0" } }, "node_modules/unist-util-visit-children": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz", "integrity": "sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-visit-parents": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-visit/node_modules/unist-util-is": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" }, "node_modules/unist-util-visit/node_modules/unist-util-visit-parents": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", "dependencies": { "unist-util-is": "^3.0.0" } }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "engines": { "node": ">= 10.0.0" } }, "node_modules/unixify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", "dependencies": { "normalize-path": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } }, "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", "dev": true, "optional": true, "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/unset-value/node_modules/has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", "dev": true, "optional": true, "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", "isobject": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", "dev": true, "optional": true, "dependencies": { "isarray": "1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/unset-value/node_modules/has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/unset-value/node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" } ], "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "bin": { "browserslist-lint": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" } }, "node_modules/update-notifier": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "dependencies": { "boxen": "^5.0.0", "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", "is-installed-globally": "^0.4.0", "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", "latest-version": "^5.1.0", "pupa": "^2.1.1", "semver": "^7.3.4", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, "node_modules/update-notifier/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/update-notifier/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/update-notifier/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/update-notifier/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/update-notifier/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/update-notifier/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/upper-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/upper-case-first": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", "deprecated": "Please see https://github.com/lydell/urix#deprecated" }, "node_modules/url-loader": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", "dependencies": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", "schema-utils": "^3.0.0" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "file-loader": "*", "webpack": "^4.0.0 || ^5.0.0" }, "peerDependenciesMeta": { "file-loader": { "optional": true } } }, "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "dependencies": { "prepend-http": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/user-home": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", "integrity": "sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==", "dev": true, "bin": { "user-home": "cli.js" }, "engines": { "node": ">=0.10.0" } }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "node_modules/utility-types": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", "engines": { "node": ">= 4" } }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, "node_modules/v8flags": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", "integrity": "sha512-SKfhk/LlaXzvtowJabLZwD4K6SGRYeoxA7KJeISlUMAB/NT4CBkZjMq3WceX2Ckm4llwqYVo8TICgsDYCBU2tA==", "dev": true, "dependencies": { "user-home": "^1.1.1" }, "engines": { "node": ">= 0.10.0" } }, "node_modules/valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" }, "node_modules/value-or-promise": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz", "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==", "engines": { "node": ">=12" } }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "engines": { "node": ">= 0.8" } }, "node_modules/vfile": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", "dependencies": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", "unist-util-stringify-position": "^2.0.0", "vfile-message": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/vfile-location": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/vfile-message": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", "dependencies": { "loose-envify": "^1.0.0" } }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" }, "engines": { "node": ">=10.13.0" } }, "node_modules/weak-lru-cache": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==" }, "node_modules/web-namespaces": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/web-vitals": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { "version": "5.75.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" }, "engines": { "node": ">=10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependenciesMeta": { "webpack-cli": { "optional": true } } }, "node_modules/webpack-dev-middleware": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.3.0.tgz", "integrity": "sha512-PjwyVY95/bhBh6VUqt6z4THplYcsvQ8YNNBTBM873xLVmw8FLeALn0qurHbs9EmcfhzQis/eoqypSnZeuUz26w==", "dependencies": { "colorette": "^1.2.2", "mem": "^8.1.1", "memfs": "^3.2.2", "mime-types": "^2.1.30", "range-parser": "^1.2.1", "schema-utils": "^3.0.0" }, "engines": { "node": ">= v10.23.3" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/webpack-merge": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dependencies": { "clone-deep": "^4.0.1", "wildcard": "^2.0.0" }, "engines": { "node": ">=10.0.0" } }, "node_modules/webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" } }, "node_modules/webpack-sources/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, "node_modules/webpack-stats-plugin": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/webpack-stats-plugin/-/webpack-stats-plugin-1.1.1.tgz", "integrity": "sha512-aWwE/YuO2W7VCOyWwyDJ7BRSYRYjeXat+X31YiasMM3FS6/4X9W4Mb9Q0g+jIdVgArr1Mb08sHBJKMT5M9+gVA==" }, "node_modules/webpack-virtual-modules": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.3.2.tgz", "integrity": "sha512-RXQXioY6MhzM4CNQwmBwKXYgBs6ulaiQ8bkNQEl2J6Z+V+s7lgl/wGvaI/I0dLnYKB8cKsxQc17QOAVIphPLDw==", "dependencies": { "debug": "^3.0.0" } }, "node_modules/webpack-virtual-modules/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { "ms": "^2.1.1" } }, "node_modules/webpack-virtual-modules/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/webpack/node_modules/@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, "node_modules/webpack/node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "engines": { "node": ">=10.13.0" } }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" }, "engines": { "node": ">= 8" } }, "node_modules/which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" }, "node_modules/which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dependencies": { "string-width": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/workbox-background-sync": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", "dependencies": { "workbox-core": "^4.3.1" } }, "node_modules/workbox-broadcast-update": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", "dependencies": { "workbox-core": "^4.3.1" } }, "node_modules/workbox-build": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", "dependencies": { "@babel/runtime": "^7.3.4", "@hapi/joi": "^15.0.0", "common-tags": "^1.8.0", "fs-extra": "^4.0.2", "glob": "^7.1.3", "lodash.template": "^4.4.0", "pretty-bytes": "^5.1.0", "stringify-object": "^3.3.0", "strip-comments": "^1.0.2", "workbox-background-sync": "^4.3.1", "workbox-broadcast-update": "^4.3.1", "workbox-cacheable-response": "^4.3.1", "workbox-core": "^4.3.1", "workbox-expiration": "^4.3.1", "workbox-google-analytics": "^4.3.1", "workbox-navigation-preload": "^4.3.1", "workbox-precaching": "^4.3.1", "workbox-range-requests": "^4.3.1", "workbox-routing": "^4.3.1", "workbox-strategies": "^4.3.1", "workbox-streams": "^4.3.1", "workbox-sw": "^4.3.1", "workbox-window": "^4.3.1" }, "engines": { "node": ">=4.0.0" } }, "node_modules/workbox-build/node_modules/fs-extra": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "node_modules/workbox-build/node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/workbox-build/node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { "node": ">= 4.0.0" } }, "node_modules/workbox-cacheable-response": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", "dependencies": { "workbox-core": "^4.3.1" } }, "node_modules/workbox-core": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" }, "node_modules/workbox-expiration": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", "dependencies": { "workbox-core": "^4.3.1" } }, "node_modules/workbox-google-analytics": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", "dependencies": { "workbox-background-sync": "^4.3.1", "workbox-core": "^4.3.1", "workbox-routing": "^4.3.1", "workbox-strategies": "^4.3.1" } }, "node_modules/workbox-navigation-preload": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", "dependencies": { "workbox-core": "^4.3.1" } }, "node_modules/workbox-precaching": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", "dependencies": { "workbox-core": "^4.3.1" } }, "node_modules/workbox-range-requests": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", "dependencies": { "workbox-core": "^4.3.1" } }, "node_modules/workbox-routing": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", "dependencies": { "workbox-core": "^4.3.1" } }, "node_modules/workbox-strategies": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", "dependencies": { "workbox-core": "^4.3.1" } }, "node_modules/workbox-streams": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", "dependencies": { "workbox-core": "^4.3.1" } }, "node_modules/workbox-sw": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==" }, "node_modules/workbox-window": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", "dependencies": { "workbox-core": "^4.3.1" } }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "node_modules/ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "engines": { "node": ">=8.3.0" }, "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { "optional": true }, "utf-8-validate": { "optional": true } } }, "node_modules/xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "engines": { "node": ">=8" } }, "node_modules/xml2js": { "version": "0.4.17", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", "integrity": "sha512-1O7wk/NTQN0UEOItIYTxK4qP4sMUVU60MbF4Nj0a8jd6eebMXOicVI/KFOEsYKKH4uBpx6XG9ZGZctXK5rtO5Q==", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "^4.1.0" } }, "node_modules/xmlbuilder": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", "integrity": "sha512-oEePiEefhQhAeUnwRnIBLBWmk/fsWWbQ53EEWsRuzECbQ3m5o/Esmq6H47CYYwSLW+Ynt0rS9hd0pd2ogMAWjg==", "dependencies": { "lodash": "^4.0.0" }, "engines": { "node": ">=0.8.0" } }, "node_modules/xmlhttprequest-ssl": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", "engines": { "node": ">=0.4.0" } }, "node_modules/xss": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", "dependencies": { "commander": "^2.20.3", "cssfilter": "0.0.10" }, "bin": { "xss": "bin/xss" }, "engines": { "node": ">= 0.10.0" } }, "node_modules/xstate": { "version": "4.32.1", "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.32.1.tgz", "integrity": "sha512-QYUd+3GkXZ8i6qdixnOn28bL3EvA++LONYL/EMWwKlFSh/hiLndJ8YTnz77FDs+JUXcwU7NZJg7qoezoRHc4GQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/xstate" } }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "engines": { "node": ">=0.4" } }, "node_modules/xxhash-wasm": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==" }, "node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "engines": { "node": ">= 6" } }, "node_modules/yaml-loader": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.8.0.tgz", "integrity": "sha512-LjeKnTzVBKWiQBeE2L9ssl6WprqaUIxCSNs5tle8PaDydgu3wVFXTbMfsvF2MSErpy9TDVa092n4q6adYwJaWg==", "dependencies": { "javascript-stringify": "^2.0.1", "loader-utils": "^2.0.0", "yaml": "^2.0.0" }, "engines": { "node": ">= 12.13" } }, "node_modules/yaml-loader/node_modules/yaml": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", "engines": { "node": ">= 14" } }, "node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" }, "engines": { "node": ">=8" } }, "node_modules/yargs-parser": { "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" }, "engines": { "node": ">=6" } }, "node_modules/yargs-parser/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { "node": ">=6" } }, "node_modules/yargs/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/yargs/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/yoga-layout-prebuilt": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz", "integrity": "sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==", "dependencies": { "@types/yoga-layout": "1.9.2" }, "engines": { "node": ">=8" } }, "node_modules/yurnalist": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/yurnalist/-/yurnalist-2.1.0.tgz", "integrity": "sha512-PgrBqosQLM3gN2xBFIMDLACRTV9c365VqityKKpSTWpwR+U4LAFR3rSVyEoscWlu3EzX9+Y0I86GXUKxpHFl6w==", "dependencies": { "chalk": "^2.4.2", "inquirer": "^7.0.0", "is-ci": "^2.0.0", "read": "^1.0.7", "strip-ansi": "^5.2.0" }, "engines": { "node": ">=4.0.0" } }, "node_modules/yurnalist/node_modules/ansi-regex": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "engines": { "node": ">=6" } }, "node_modules/yurnalist/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, "node_modules/yurnalist/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, "node_modules/yurnalist/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { "color-name": "1.1.3" } }, "node_modules/yurnalist/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/yurnalist/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { "node": ">=4" } }, "node_modules/yurnalist/node_modules/strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dependencies": { "ansi-regex": "^4.1.0" }, "engines": { "node": ">=6" } }, "node_modules/yurnalist/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } } }, "dependencies": { "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "requires": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "@ardatan/relay-compiler": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz", "integrity": "sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==", "requires": { "@babel/core": "^7.14.0", "@babel/generator": "^7.14.0", "@babel/parser": "^7.14.0", "@babel/runtime": "^7.0.0", "@babel/traverse": "^7.14.0", "@babel/types": "^7.0.0", "babel-preset-fbjs": "^3.4.0", "chalk": "^4.0.0", "fb-watchman": "^2.0.0", "fbjs": "^3.0.0", "glob": "^7.1.1", "immutable": "~3.7.6", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "relay-runtime": "12.0.0", "signedsource": "^1.0.0", "yargs": "^15.3.1" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } } } }, "@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "requires": { "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { "version": "7.20.10", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==" }, "@babel/core": { "version": "7.20.12", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.20.7", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-module-transforms": "^7.20.11", "@babel/helpers": "^7.20.7", "@babel/parser": "^7.20.7", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.12", "@babel/types": "^7.20.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", "semver": "^6.3.0" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/eslint-parser": { "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", "requires": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", "semver": "^6.3.0" }, "dependencies": { "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/generator": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", "requires": { "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, "dependencies": { "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" } } }, "@babel/helper-annotate-as-pure": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "requires": { "@babel/helper-explode-assignable-expression": "^7.18.6", "@babel/types": "^7.18.9" } }, "@babel/helper-compilation-targets": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "requires": { "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "dependencies": { "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/helper-create-class-features-plugin": { "version": "7.20.12", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6" } }, "@babel/helper-create-regexp-features-plugin": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "regexpu-core": "^5.2.1" }, "dependencies": { "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" }, "regexpu-core": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", "requires": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", "regjsgen": "^0.7.1", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } }, "regjsgen": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==" }, "regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "requires": { "jsesc": "~0.5.0" } } } }, "@babel/helper-define-polyfill-provider": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "requires": { "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, "@babel/helper-explode-assignable-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-function-name": { "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "requires": { "@babel/template": "^7.18.10", "@babel/types": "^7.19.0" } }, "@babel/helper-hoist-variables": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-member-expression-to-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", "requires": { "@babel/types": "^7.20.7" } }, "@babel/helper-module-imports": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.10", "@babel/types": "^7.20.7" } }, "@babel/helper-optimise-call-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-plugin-utils": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" }, "@babel/helper-remap-async-to-generator": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-wrap-function": "^7.18.9", "@babel/types": "^7.18.9" } }, "@babel/helper-replace-supers": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.7", "@babel/types": "^7.20.7" } }, "@babel/helper-simple-access": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "requires": { "@babel/types": "^7.20.2" } }, "@babel/helper-skip-transparent-expression-wrappers": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "requires": { "@babel/types": "^7.20.0" } }, "@babel/helper-split-export-declaration": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-string-parser": { "version": "7.19.4", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" }, "@babel/helper-validator-identifier": { "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" }, "@babel/helper-validator-option": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" }, "@babel/helper-wrap-function": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "requires": { "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", "@babel/traverse": "^7.20.5", "@babel/types": "^7.20.5" } }, "@babel/helpers": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", "requires": { "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.7", "@babel/types": "^7.20.7" } }, "@babel/highlight": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, "dependencies": { "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } } } }, "@babel/parser": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-proposal-optional-chaining": "^7.20.7" } }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-class-static-block": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", "requires": { "@babel/helper-create-class-features-plugin": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "requires": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "requires": { "@babel/compat-data": "^7.20.5", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.20.7" } }, "@babel/plugin-proposal-optional-catch-binding": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-private-property-in-object": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.20.5", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-class-static-block": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-flow": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-import-assertions": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "requires": { "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-jsx": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-typescript": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", "requires": { "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-arrow-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-async-to-generator": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", "requires": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9" } }, "@babel/plugin-transform-block-scoped-functions": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-block-scoping": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz", "integrity": "sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==", "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-classes": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, "dependencies": { "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" } } }, "@babel/plugin-transform-computed-properties": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/template": "^7.20.7" } }, "@babel/plugin-transform-destructuring": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-dotall-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-duplicate-keys": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-exponentiation-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-flow-strip-types": { "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz", "integrity": "sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg==", "requires": { "@babel/helper-plugin-utils": "^7.19.0", "@babel/plugin-syntax-flow": "^7.18.6" } }, "@babel/plugin-transform-for-of": { "version": "7.18.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-function-name": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "requires": { "@babel/helper-compilation-targets": "^7.18.9", "@babel/helper-function-name": "^7.18.9", "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-literals": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-member-expression-literals": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-modules-amd": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", "requires": { "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-modules-commonjs": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", "requires": { "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-simple-access": "^7.20.2" } }, "@babel/plugin-transform-modules-systemjs": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", "requires": { "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-identifier": "^7.19.1" } }, "@babel/plugin-transform-modules-umd": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "requires": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.20.5", "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-new-target": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-object-super": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-replace-supers": "^7.18.6" } }, "@babel/plugin-transform-parameters": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-property-literals": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-react-display-name": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-react-jsx": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz", "integrity": "sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7" } }, "@babel/plugin-transform-react-jsx-development": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", "requires": { "@babel/plugin-transform-react-jsx": "^7.18.6" } }, "@babel/plugin-transform-react-pure-annotations": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-regenerator": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", "requires": { "@babel/helper-plugin-utils": "^7.20.2", "regenerator-transform": "^0.15.1" }, "dependencies": { "regenerator-transform": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "requires": { "@babel/runtime": "^7.8.4" } } } }, "@babel/plugin-transform-reserved-words": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-runtime": { "version": "7.19.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", "requires": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.19.0", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", "semver": "^6.3.0" }, "dependencies": { "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/plugin-transform-shorthand-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" } }, "@babel/plugin-transform-sticky-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-template-literals": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typeof-symbol": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typescript": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.7.tgz", "integrity": "sha512-m3wVKEvf6SoszD8pu4NZz3PvfKRCMgk6D6d0Qi9hNnlM5M6CFS92EgF4EiHVLKbU0r/r7ty1hg7NPZwE7WRbYw==", "requires": { "@babel/helper-create-class-features-plugin": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-typescript": "^7.20.0" } }, "@babel/plugin-transform-unicode-escapes": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/preset-env": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", "requires": { "@babel/compat-data": "^7.20.1", "@babel/helper-compilation-targets": "^7.20.0", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", "@babel/plugin-proposal-async-generator-functions": "^7.20.1", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-json-strings": "^7.18.6", "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", "@babel/plugin-proposal-object-rest-spread": "^7.20.2", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.18.6", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.20.0", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.20.2", "@babel/plugin-transform-classes": "^7.20.2", "@babel/plugin-transform-computed-properties": "^7.18.9", "@babel/plugin-transform-destructuring": "^7.20.2", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", "@babel/plugin-transform-for-of": "^7.18.8", "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.19.6", "@babel/plugin-transform-modules-commonjs": "^7.19.6", "@babel/plugin-transform-modules-systemjs": "^7.19.6", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.20.1", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", "@babel/plugin-transform-spread": "^7.19.0", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.20.2", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", "core-js-compat": "^3.25.1", "semver": "^6.3.0" }, "dependencies": { "core-js-compat": { "version": "3.27.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.1.tgz", "integrity": "sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==", "requires": { "browserslist": "^4.21.4" } }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/preset-modules": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" } }, "@babel/preset-react": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-transform-react-display-name": "^7.18.6", "@babel/plugin-transform-react-jsx": "^7.18.6", "@babel/plugin-transform-react-jsx-development": "^7.18.6", "@babel/plugin-transform-react-pure-annotations": "^7.18.6" } }, "@babel/preset-typescript": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-transform-typescript": "^7.18.6" } }, "@babel/runtime": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", "requires": { "regenerator-runtime": "^0.13.11" }, "dependencies": { "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" } } }, "@babel/runtime-corejs3": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.7.tgz", "integrity": "sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg==", "requires": { "core-js-pure": "^3.25.1", "regenerator-runtime": "^0.13.11" }, "dependencies": { "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" } } }, "@babel/template": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "requires": { "@babel/code-frame": "^7.18.6", "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7" } }, "@babel/traverse": { "version": "7.20.12", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", "requires": { "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "@babel/types": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "requires": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "dependencies": { "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" } } }, "@builder.io/partytown": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/@builder.io/partytown/-/partytown-0.5.4.tgz", "integrity": "sha512-qnikpQgi30AS01aFlNQV6l8/qdZIcP76mp90ti+u4rucXHsn4afSKivQXApqxvrQG9+Ibv45STyvHizvxef/7A==" }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "requires": { "ajv": "^6.12.4", "debug": "^4.1.1", "espree": "^7.3.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "globals": { "version": "13.19.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "requires": { "type-fest": "^0.20.2" } }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "@gatsbyjs/parcel-namer-relative-to-cwd": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@gatsbyjs/parcel-namer-relative-to-cwd/-/parcel-namer-relative-to-cwd-1.10.0.tgz", "integrity": "sha512-JSiOxG2SD64joKfcCOdujIpqmhs+k5Ic1sO/hQ83EVF6G9DJJTf8n12rGb2rzPb00TFT4ldb/nWxQRV+kQTlPA==", "requires": { "@babel/runtime": "^7.18.0", "@parcel/namer-default": "2.6.2", "@parcel/plugin": "2.6.2", "gatsby-core-utils": "^3.25.0" } }, "@gatsbyjs/reach-router": { "version": "1.3.9", "resolved": "https://registry.npmjs.org/@gatsbyjs/reach-router/-/reach-router-1.3.9.tgz", "integrity": "sha512-/354IaUSM54xb7K/TxpLBJB94iEAJ3P82JD38T8bLnIDWF+uw8+W/82DKnQ7y24FJcKxtVmG43aiDLG88KSuYQ==", "requires": { "invariant": "^2.2.3", "prop-types": "^15.6.1", "react-lifecycles-compat": "^3.0.4" } }, "@gatsbyjs/webpack-hot-middleware": { "version": "2.25.3", "resolved": "https://registry.npmjs.org/@gatsbyjs/webpack-hot-middleware/-/webpack-hot-middleware-2.25.3.tgz", "integrity": "sha512-ul17OZ8Dlw+ATRbnuU+kwxuAlq9lKbYz/2uBS1FLCdgoPTF1H2heP7HbUbgfMZbfRQNcCG2rMscMnr32ritCDw==", "requires": { "ansi-html-community": "0.0.8", "html-entities": "^2.3.3", "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } } } }, "@graphql-codegen/add": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-3.2.3.tgz", "integrity": "sha512-sQOnWpMko4JLeykwyjFTxnhqjd/3NOG2OyMuvK76Wnnwh8DRrNf2VEs2kmSvLl7MndMlOj7Kh5U154dVcvhmKQ==", "requires": { "@graphql-codegen/plugin-helpers": "^3.1.1", "tslib": "~2.4.0" }, "dependencies": { "@graphql-codegen/plugin-helpers": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", "requires": { "@graphql-tools/utils": "^9.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.4.0" } }, "change-case-all": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", "requires": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } } } }, "@graphql-codegen/core": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-2.6.8.tgz", "integrity": "sha512-JKllNIipPrheRgl+/Hm/xuWMw9++xNQ12XJR/OHHgFopOg4zmN3TdlRSyYcv/K90hCFkkIwhlHFUQTfKrm8rxQ==", "requires": { "@graphql-codegen/plugin-helpers": "^3.1.1", "@graphql-tools/schema": "^9.0.0", "@graphql-tools/utils": "^9.1.1", "tslib": "~2.4.0" }, "dependencies": { "@graphql-codegen/plugin-helpers": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", "requires": { "@graphql-tools/utils": "^9.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.4.0" } }, "change-case-all": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", "requires": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } } } }, "@graphql-codegen/plugin-helpers": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.7.2.tgz", "integrity": "sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg==", "requires": { "@graphql-tools/utils": "^8.8.0", "change-case-all": "1.0.14", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.4.0" }, "dependencies": { "@graphql-tools/utils": { "version": "8.13.1", "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz", "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==", "requires": { "tslib": "^2.4.0" } } } }, "@graphql-codegen/schema-ast": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-2.6.1.tgz", "integrity": "sha512-5TNW3b1IHJjCh07D2yQNGDQzUpUl2AD+GVe1Dzjqyx/d2Fn0TPMxLsHsKPS4Plg4saO8FK/QO70wLsP7fdbQ1w==", "requires": { "@graphql-codegen/plugin-helpers": "^3.1.2", "@graphql-tools/utils": "^9.0.0", "tslib": "~2.4.0" }, "dependencies": { "@graphql-codegen/plugin-helpers": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", "requires": { "@graphql-tools/utils": "^9.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.4.0" } }, "change-case-all": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", "requires": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } } } }, "@graphql-codegen/typescript": { "version": "2.8.7", "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-2.8.7.tgz", "integrity": "sha512-Nm5keWqIgg/VL7fivGmglF548tJRP2ttSmfTMuAdY5GNGTJTVZOzNbIOfnbVEDMMWF4V+quUuSyeUQ6zRxtX1w==", "requires": { "@graphql-codegen/plugin-helpers": "^3.1.2", "@graphql-codegen/schema-ast": "^2.6.1", "@graphql-codegen/visitor-plugin-common": "2.13.7", "auto-bind": "~4.0.0", "tslib": "~2.4.0" }, "dependencies": { "@graphql-codegen/plugin-helpers": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", "requires": { "@graphql-tools/utils": "^9.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.4.0" } }, "change-case-all": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", "requires": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } } } }, "@graphql-codegen/typescript-operations": { "version": "2.5.12", "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-2.5.12.tgz", "integrity": "sha512-/w8IgRIQwmebixf514FOQp2jXOe7vxZbMiSFoQqJgEgzrr42joPsgu4YGU+owv2QPPmu4736OcX8FSavb7SLiA==", "requires": { "@graphql-codegen/plugin-helpers": "^3.1.2", "@graphql-codegen/typescript": "^2.8.7", "@graphql-codegen/visitor-plugin-common": "2.13.7", "auto-bind": "~4.0.0", "tslib": "~2.4.0" }, "dependencies": { "@graphql-codegen/plugin-helpers": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", "requires": { "@graphql-tools/utils": "^9.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.4.0" } }, "change-case-all": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", "requires": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } } } }, "@graphql-codegen/visitor-plugin-common": { "version": "2.13.7", "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.7.tgz", "integrity": "sha512-xE6iLDhr9sFM1qwCGJcCXRu5MyA0moapG2HVejwyAXXLubYKYwWnoiEigLH2b5iauh6xsl6XP8hh9D1T1dn5Cw==", "requires": { "@graphql-codegen/plugin-helpers": "^3.1.2", "@graphql-tools/optimize": "^1.3.0", "@graphql-tools/relay-operation-optimizer": "^6.5.0", "@graphql-tools/utils": "^9.0.0", "auto-bind": "~4.0.0", "change-case-all": "1.0.15", "dependency-graph": "^0.11.0", "graphql-tag": "^2.11.0", "parse-filepath": "^1.0.2", "tslib": "~2.4.0" }, "dependencies": { "@graphql-codegen/plugin-helpers": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", "requires": { "@graphql-tools/utils": "^9.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.4.0" } }, "change-case-all": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", "requires": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } } } }, "@graphql-tools/code-file-loader": { "version": "7.3.15", "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-7.3.15.tgz", "integrity": "sha512-cF8VNc/NANTyVSIK8BkD/KSXRF64DvvomuJ0evia7tJu4uGTXgDjimTMWsTjKRGOOBSTEbL6TA8e4DdIYq6Udw==", "requires": { "@graphql-tools/graphql-tag-pluck": "7.4.2", "@graphql-tools/utils": "9.1.3", "globby": "^11.0.3", "tslib": "^2.4.0", "unixify": "^1.0.0" } }, "@graphql-tools/graphql-tag-pluck": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.4.2.tgz", "integrity": "sha512-SXM1wR5TExrxocQTxZK5r74jTbg8GxSYLY3mOPCREGz6Fu7PNxMxfguUzGUAB43Mf44Dn8oVztzd2eitv2Qgww==", "requires": { "@babel/parser": "^7.16.8", "@babel/plugin-syntax-import-assertions": "7.20.0", "@babel/traverse": "^7.16.8", "@babel/types": "^7.16.8", "@graphql-tools/utils": "9.1.3", "tslib": "^2.4.0" } }, "@graphql-tools/load": { "version": "7.8.8", "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-7.8.8.tgz", "integrity": "sha512-gMuQdO2jXmI0BNUc1MafxRQTWVMUtuH500pZAQtOdDdNJppV7lJdY6mMhITQ2qnhYDuMrcZPHhIkcftyQfkgUg==", "requires": { "@graphql-tools/schema": "9.0.12", "@graphql-tools/utils": "9.1.3", "p-limit": "3.1.0", "tslib": "^2.4.0" } }, "@graphql-tools/merge": { "version": "8.3.14", "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.14.tgz", "integrity": "sha512-zV0MU1DnxJLIB0wpL4N3u21agEiYFsjm6DI130jqHpwF0pR9HkF+Ni65BNfts4zQelP0GjkHltG+opaozAJ1NA==", "requires": { "@graphql-tools/utils": "9.1.3", "tslib": "^2.4.0" } }, "@graphql-tools/optimize": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-1.3.1.tgz", "integrity": "sha512-5j5CZSRGWVobt4bgRRg7zhjPiSimk+/zIuColih8E8DxuFOaJ+t0qu7eZS5KXWBkjcd4BPNuhUPpNlEmHPqVRQ==", "requires": { "tslib": "^2.4.0" } }, "@graphql-tools/relay-operation-optimizer": { "version": "6.5.14", "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.14.tgz", "integrity": "sha512-RAy1fMfXig9X3gIkYnfEmv0mh20vZuAgWDq+zf1MrrsCAP364B+DKrBjLwn3D+4e0PMTlqwmqR0JB5t1VtZn2w==", "requires": { "@ardatan/relay-compiler": "12.0.0", "@graphql-tools/utils": "9.1.3", "tslib": "^2.4.0" } }, "@graphql-tools/schema": { "version": "9.0.12", "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.12.tgz", "integrity": "sha512-DmezcEltQai0V1y96nwm0Kg11FDS/INEFekD4nnVgzBqawvznWqK6D6bujn+cw6kivoIr3Uq//QmU/hBlBzUlQ==", "requires": { "@graphql-tools/merge": "8.3.14", "@graphql-tools/utils": "9.1.3", "tslib": "^2.4.0", "value-or-promise": "1.0.11" } }, "@graphql-tools/utils": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.1.3.tgz", "integrity": "sha512-bbJyKhs6awp1/OmP+WKA1GOyu9UbgZGkhIj5srmiMGLHohEOKMjW784Sk0BZil1w2x95UPu0WHw6/d/HVCACCg==", "requires": { "tslib": "^2.4.0" } }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" }, "@hapi/bourne": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" }, "@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, "@hapi/joi": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", "requires": { "@hapi/address": "2.x.x", "@hapi/bourne": "1.x.x", "@hapi/hoek": "8.x.x", "@hapi/topo": "3.x.x" }, "dependencies": { "@hapi/hoek": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" }, "@hapi/topo": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", "requires": { "@hapi/hoek": "^8.3.0" } } } }, "@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "requires": { "@hapi/hoek": "^9.0.0" } }, "@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "requires": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", "minimatch": "^3.0.4" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, "@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "requires": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, "@jridgewell/source-map": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "dependencies": { "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } } } }, "@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { "version": "0.3.17", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "requires": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, "@lezer/common": { "version": "0.15.12", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz", "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==" }, "@lezer/lr": { "version": "0.15.8", "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz", "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==", "requires": { "@lezer/common": "^0.15.0" } }, "@lmdb/lmdb-darwin-arm64": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.3.tgz", "integrity": "sha512-RXwGZ/0eCqtCY8FLTM/koR60w+MXyvBUpToXiIyjOcBnC81tAlTUHrRUavCEWPI9zc9VgvpK3+cbumPyR8BSuA==", "optional": true }, "@lmdb/lmdb-darwin-x64": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.3.tgz", "integrity": "sha512-337dNzh5yCdNCTk8kPfoU7jR3otibSlPDGW0vKZT97rKnQMb9tNdto3RtWoGPsQ8hKmlRZpojOJtmwjncq1MoA==", "optional": true }, "@lmdb/lmdb-linux-arm": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.3.tgz", "integrity": "sha512-mU2HFJDGwECkoD9dHQEfeTG5mp8hNS2BCfwoiOpVPMeapjYpQz9Uw3FkUjRZ4dGHWKbin40oWHuL0bk2bCx+Sg==", "optional": true }, "@lmdb/lmdb-linux-arm64": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.3.tgz", "integrity": "sha512-VJw60Mdgb4n+L0fO1PqfB0C7TyEQolJAC8qpqvG3JoQwvyOv6LH7Ib/WE3wxEW9nuHmVz9jkK7lk5HfWWgoO1Q==", "optional": true }, "@lmdb/lmdb-linux-x64": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.3.tgz", "integrity": "sha512-qaReO5aV8griBDsBr8uBF/faO3ieGjY1RY4p8JvTL6Mu1ylLrTVvOONqKFlNaCwrmUjWw5jnf7VafxDAeQHTow==", "optional": true }, "@lmdb/lmdb-win32-x64": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.3.tgz", "integrity": "sha512-cK+Elf3RjEzrm3SerAhrFWL5oQAsZSJ/LmjL1joIpTfEP1etJJ9CTRvdaV6XLYAxaEkfdhk/9hOvHLbR9yIhCA==", "optional": true }, "@mapbox/hast-util-table-cell-style": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.1.3.tgz", "integrity": "sha512-QsEsh5YaDvHoMQ2YHdvZy2iDnU3GgKVBTcHf6cILyoWDZtPSdlG444pL/ioPYO/GpXSfODBb9sefEetfC4v9oA==", "requires": { "unist-util-visit": "^1.3.0" } }, "@mischnic/json-sourcemap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz", "integrity": "sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==", "requires": { "@lezer/common": "^0.15.7", "@lezer/lr": "^0.15.4", "json5": "^2.2.1" } }, "@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.2.0.tgz", "integrity": "sha512-Z9LFPzfoJi4mflGWV+rv7o7ZbMU5oAU9VmzCgL240KnqDW65Y2HFCT3MW06/ITJSnbVLacmcEJA8phywK7JinQ==", "optional": true }, "@msgpackr-extract/msgpackr-extract-darwin-x64": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.2.0.tgz", "integrity": "sha512-vq0tT8sjZsy4JdSqmadWVw6f66UXqUCabLmUVHZwUFzMgtgoIIQjT4VVRHKvlof3P/dMCkbMJ5hB1oJ9OWHaaw==", "optional": true }, "@msgpackr-extract/msgpackr-extract-linux-arm": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.2.0.tgz", "integrity": "sha512-SaJ3Qq4lX9Syd2xEo9u3qPxi/OB+5JO/ngJKK97XDpa1C587H9EWYO6KD8995DAjSinWvdHKRrCOXVUC5fvGOg==", "optional": true }, "@msgpackr-extract/msgpackr-extract-linux-arm64": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.2.0.tgz", "integrity": "sha512-hlxxLdRmPyq16QCutUtP8Tm6RDWcyaLsRssaHROatgnkOxdleMTgetf9JsdncL8vLh7FVy/RN9i3XR5dnb9cRA==", "optional": true }, "@msgpackr-extract/msgpackr-extract-linux-x64": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.2.0.tgz", "integrity": "sha512-94y5PJrSOqUNcFKmOl7z319FelCLAE0rz/jPCWS+UtdMZvpa4jrQd+cJPQCLp2Fes1yAW/YUQj/Di6YVT3c3Iw==", "optional": true }, "@msgpackr-extract/msgpackr-extract-win32-x64": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.2.0.tgz", "integrity": "sha512-XrC0JzsqQSvOyM3t04FMLO6z5gCuhPE6k4FXuLK5xf52ZbdvcFe1yBmo7meCew9B8G2f0T9iu9t3kfTYRYROgA==", "optional": true }, "@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", "requires": { "eslint-scope": "5.1.1" } }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "@parcel/bundler-default": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.6.2.tgz", "integrity": "sha512-XIa3had/MIaTGgRFkHApXwytYs77k4geaNcmlb6nzmAABcYjW1CLYh83Zt0AbzLFsDT9ZcRY3u2UjhNf6efSaw==", "requires": { "@parcel/diagnostic": "2.6.2", "@parcel/hash": "2.6.2", "@parcel/plugin": "2.6.2", "@parcel/utils": "2.6.2", "nullthrows": "^1.1.1" } }, "@parcel/cache": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.6.2.tgz", "integrity": "sha512-hhJ6AsEGybeQZd9c/GYqfcKTgZKQXu3Xih6TlnP3gdR3KZoJOnb40ovHD1yYg4COvfcXThKP1cVJ18J6rcv3IA==", "requires": { "@parcel/fs": "2.6.2", "@parcel/logger": "2.6.2", "@parcel/utils": "2.6.2", "lmdb": "2.5.2" }, "dependencies": { "@lmdb/lmdb-darwin-arm64": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", "optional": true }, "@lmdb/lmdb-darwin-x64": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", "optional": true }, "@lmdb/lmdb-linux-arm": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", "optional": true }, "@lmdb/lmdb-linux-arm64": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", "optional": true }, "@lmdb/lmdb-linux-x64": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", "optional": true }, "@lmdb/lmdb-win32-x64": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", "optional": true }, "lmdb": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", "requires": { "@lmdb/lmdb-darwin-arm64": "2.5.2", "@lmdb/lmdb-darwin-x64": "2.5.2", "@lmdb/lmdb-linux-arm": "2.5.2", "@lmdb/lmdb-linux-arm64": "2.5.2", "@lmdb/lmdb-linux-x64": "2.5.2", "@lmdb/lmdb-win32-x64": "2.5.2", "msgpackr": "^1.5.4", "node-addon-api": "^4.3.0", "node-gyp-build-optional-packages": "5.0.3", "ordered-binary": "^1.2.4", "weak-lru-cache": "^1.2.2" } }, "node-addon-api": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" } } }, "@parcel/codeframe": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.6.2.tgz", "integrity": "sha512-oFlHr6HCaYYsB4SHkU+gn9DKtbzvv3/4NdwMX0/6NAKyYVI7inEsXyPGw2Bbd2ZCFatW9QJZUETF0etvh5AEfQ==", "requires": { "chalk": "^4.1.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } } } }, "@parcel/compressor-raw": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.6.2.tgz", "integrity": "sha512-P3c8jjV5HVs+fNDjhvq7PtHXNm687nit1iwTS5VAt+ScXKhKBhoIJ56q+9opcw0jnXVjAAgZqcRZ50oAJBGdKw==", "requires": { "@parcel/plugin": "2.6.2" } }, "@parcel/core": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.6.2.tgz", "integrity": "sha512-JlKS3Ux0ngmdooSBbzQLShHJdsapF9E7TGMo1hFaHRquZip/DaqzvysYrgMJlDuCoLArciq5ei7ZKzGeK9zexA==", "requires": { "@mischnic/json-sourcemap": "^0.1.0", "@parcel/cache": "2.6.2", "@parcel/diagnostic": "2.6.2", "@parcel/events": "2.6.2", "@parcel/fs": "2.6.2", "@parcel/graph": "2.6.2", "@parcel/hash": "2.6.2", "@parcel/logger": "2.6.2", "@parcel/package-manager": "2.6.2", "@parcel/plugin": "2.6.2", "@parcel/source-map": "^2.0.0", "@parcel/types": "2.6.2", "@parcel/utils": "2.6.2", "@parcel/workers": "2.6.2", "abortcontroller-polyfill": "^1.1.9", "base-x": "^3.0.8", "browserslist": "^4.6.6", "clone": "^2.1.1", "dotenv": "^7.0.0", "dotenv-expand": "^5.1.0", "json5": "^2.2.0", "msgpackr": "^1.5.4", "nullthrows": "^1.1.1", "semver": "^5.7.1" }, "dependencies": { "dotenv": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==" } } }, "@parcel/diagnostic": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.6.2.tgz", "integrity": "sha512-3ODSBkKVihENU763z1/1DhGAWFhYWRxOCOShC72KXp+GFnSgGiBsxclu8NBa/N948Rzp8lqQI8U1nLcKkh0O/w==", "requires": { "@mischnic/json-sourcemap": "^0.1.0", "nullthrows": "^1.1.1" } }, "@parcel/events": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.6.2.tgz", "integrity": "sha512-IaCjOeA5ercdFVi1EZOmUHhGfIysmCUgc2Th9hMugSFO0I3GzRsBcAdP6XPfWm+TV6sQ/qZRfdk/drUxoAupnw==" }, "@parcel/fs": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.6.2.tgz", "integrity": "sha512-mIhqdF3tjgeoIGqW7Nc/xfM2ClID7o8livwUe5lpQEP+ZaIBiMigXs6ckv3WToCACK+3uylrSD2A/HmlhrxMqQ==", "requires": { "@parcel/fs-search": "2.6.2", "@parcel/types": "2.6.2", "@parcel/utils": "2.6.2", "@parcel/watcher": "^2.0.0", "@parcel/workers": "2.6.2" } }, "@parcel/fs-search": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.6.2.tgz", "integrity": "sha512-4STid1zqtGnmGjHD/2TG2g/zPDiCTtE3IAS24QYH3eiUAz2uoKGgEqd2tZbZ2yI96jtCuIhC1bzVu8Hbykls7w==", "requires": { "detect-libc": "^1.0.3" } }, "@parcel/graph": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-2.6.2.tgz", "integrity": "sha512-DPH4G/RBFJWayIN2fnhDXqhUw75n7k15YsGzdDKiXuwwz4wMOjoL4cyrI6zOf1SIyh3guRmeTYJ4jjPzwrLYww==", "requires": { "@parcel/utils": "2.6.2", "nullthrows": "^1.1.1" } }, "@parcel/hash": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.6.2.tgz", "integrity": "sha512-tFB+cJU1Wqag6WyJgsmx3nx+xhmjcNZqtWh/MtK1lHNnZdDRk6bjr7SapnygBwruz+SmSt5bbdVThcpk2dRCcA==", "requires": { "detect-libc": "^1.0.3", "xxhash-wasm": "^0.4.2" } }, "@parcel/logger": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.6.2.tgz", "integrity": "sha512-Sz5YGCj1DbEiX0/G8Uw97LLZ0uEK+qtWcRAkHNpJpeMiSqDiRNevxXltz42EcLo+oCh4d4wyiVzwi9mNwzhS/Q==", "requires": { "@parcel/diagnostic": "2.6.2", "@parcel/events": "2.6.2" } }, "@parcel/markdown-ansi": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.6.2.tgz", "integrity": "sha512-N/h9J4eibhc+B+krzvPMzFUWL37GudBIZBa7XSLkcuH6MnYYfh6rrMvhIyyESwk6VkcZNVzAeZrGQqxEs0dHDQ==", "requires": { "chalk": "^4.1.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } } } }, "@parcel/namer-default": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.6.2.tgz", "integrity": "sha512-mp7bx/BQaIuohmZP0uE+gAmDBzzH0Yu8F4yCtE611lc6i0mou+nWRhzyKLNC/ieuI8DB3BFh2QQKeTxJn4W0qg==", "requires": { "@parcel/diagnostic": "2.6.2", "@parcel/plugin": "2.6.2", "nullthrows": "^1.1.1" } }, "@parcel/node-resolver-core": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-2.6.2.tgz", "integrity": "sha512-4b2L5QRYlTybvv3+TIRtwg4PPJXy+cRShCBa8eu1K0Fj297Afe8MOZrcVV+RIr2KPMIRXcIJoqDmOhyci/DynA==", "requires": { "@parcel/diagnostic": "2.6.2", "@parcel/utils": "2.6.2", "nullthrows": "^1.1.1", "semver": "^5.7.1" } }, "@parcel/optimizer-terser": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/optimizer-terser/-/optimizer-terser-2.6.2.tgz", "integrity": "sha512-ZSEVQ3G3zOiVPeHvH+BrHegZybrQj9kWQAaAA92leSqbvf6UaX4xqXbGRg2OttNFtbGYBzIl28Zm4t2SLeUIuA==", "requires": { "@parcel/diagnostic": "2.6.2", "@parcel/plugin": "2.6.2", "@parcel/source-map": "^2.0.0", "@parcel/utils": "2.6.2", "nullthrows": "^1.1.1", "terser": "^5.2.0" } }, "@parcel/package-manager": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.6.2.tgz", "integrity": "sha512-xGMqTgnwTE3rgzYwUZMKxR8fzmP5iSYz/gj2H8FR3pEmwh/8xCMtNjTSth+hPVGuqgRZ6JxwpfdY/fXdZ61ViQ==", "requires": { "@parcel/diagnostic": "2.6.2", "@parcel/fs": "2.6.2", "@parcel/logger": "2.6.2", "@parcel/types": "2.6.2", "@parcel/utils": "2.6.2", "@parcel/workers": "2.6.2", "semver": "^5.7.1" } }, "@parcel/packager-js": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.6.2.tgz", "integrity": "sha512-fm5rKWtaExR0W+UEKWivXNPysRFxuBCdskdxDByb1J1JeGMvp7dJElbi8oXDAQM4MnM5EyG7cg47SlMZNTLm4A==", "requires": { "@parcel/diagnostic": "2.6.2", "@parcel/hash": "2.6.2", "@parcel/plugin": "2.6.2", "@parcel/source-map": "^2.0.0", "@parcel/utils": "2.6.2", "globals": "^13.2.0", "nullthrows": "^1.1.1" }, "dependencies": { "globals": { "version": "13.19.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "requires": { "type-fest": "^0.20.2" } } } }, "@parcel/packager-raw": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.6.2.tgz", "integrity": "sha512-Rl3ZkMtMjb+LEvRowijDD8fibUAS6rWK0/vZQMk9cDNYCP2gCpZayLk0HZIGxneeTbosf/0sbngHq4VeRQOnQA==", "requires": { "@parcel/plugin": "2.6.2" } }, "@parcel/plugin": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.6.2.tgz", "integrity": "sha512-wbbWsM23Pr+8xtLSvf+UopXdVYlpKCCx6PuuZaZcKo+9IcDCWoGXD4M8Kkz14qBmkFn5uM00mULUqmVdSibB2w==", "requires": { "@parcel/types": "2.6.2" } }, "@parcel/reporter-dev-server": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.6.2.tgz", "integrity": "sha512-5QtL3ETMFL161jehlIK6rjBM+Pqk5cMhr60s9yLYqE1GY4M4gMj+Act+FXViyM6gmMA38cPxDvUsxTKBYXpFCw==", "requires": { "@parcel/plugin": "2.6.2", "@parcel/utils": "2.6.2" } }, "@parcel/resolver-default": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.6.2.tgz", "integrity": "sha512-Lo5sWb5QkjWvdBr+TdmAF6Mszb/sMldBBatc1osQTkHXCy679VMH+lfyiWxHbwK+F1pmdMeBJpYcMxvrgT8EsA==", "requires": { "@parcel/node-resolver-core": "2.6.2", "@parcel/plugin": "2.6.2" } }, "@parcel/runtime-js": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.6.2.tgz", "integrity": "sha512-0S3JFwgvs6FmEx2dHta9R0Sfu8vCnFAm4i7Y4efGHtAcTrF2CHjyiz4/hG+RQGJ70eoWW463Q+8qt6EKbkaOBQ==", "requires": { "@parcel/plugin": "2.6.2", "@parcel/utils": "2.6.2", "nullthrows": "^1.1.1" } }, "@parcel/source-map": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", "requires": { "detect-libc": "^1.0.3" } }, "@parcel/transformer-js": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.6.2.tgz", "integrity": "sha512-uhXAMTjE/Q61amflV8qVpb73mj+mIdXIMH0cSks1/gDIAxcgIvWvrE14P4TvY6zJ1q1iRJRIRUN6cFSXqjjLSA==", "requires": { "@parcel/diagnostic": "2.6.2", "@parcel/plugin": "2.6.2", "@parcel/source-map": "^2.0.0", "@parcel/utils": "2.6.2", "@parcel/workers": "2.6.2", "@swc/helpers": "^0.4.2", "browserslist": "^4.6.6", "detect-libc": "^1.0.3", "nullthrows": "^1.1.1", "regenerator-runtime": "^0.13.7", "semver": "^5.7.1" }, "dependencies": { "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" } } }, "@parcel/transformer-json": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.6.2.tgz", "integrity": "sha512-QGcIIvbPF/u10ihYvQhxXqb2QMXWSzcBxJrOSIXIl74TUGrWX05D5LmjDA/rzm/n/kvRnBkFNP60R/smYb8x+Q==", "requires": { "@parcel/plugin": "2.6.2", "json5": "^2.2.0" } }, "@parcel/types": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.6.2.tgz", "integrity": "sha512-MV8BFpCIs2jMUvK2RHqzkoiuOQ//JIbrD1zocA2YRW3zuPL/iABvbAABJoXpoPCKikVWOoCWASgBfWQo26VvJQ==", "requires": { "@parcel/cache": "2.6.2", "@parcel/diagnostic": "2.6.2", "@parcel/fs": "2.6.2", "@parcel/package-manager": "2.6.2", "@parcel/source-map": "^2.0.0", "@parcel/workers": "2.6.2", "utility-types": "^3.10.0" } }, "@parcel/utils": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.6.2.tgz", "integrity": "sha512-Ug7hpRxjgbY5AopW55nY7MmGMVmwmN+ihfCmxJkBUoESTG/3iq8uME7GjyOgW5DkQc2K7q62i8y8N0wCJT1u4Q==", "requires": { "@parcel/codeframe": "2.6.2", "@parcel/diagnostic": "2.6.2", "@parcel/hash": "2.6.2", "@parcel/logger": "2.6.2", "@parcel/markdown-ansi": "2.6.2", "@parcel/source-map": "^2.0.0", "chalk": "^4.1.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } } } }, "@parcel/watcher": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.1.0.tgz", "integrity": "sha512-8s8yYjd19pDSsBpbkOHnT6Z2+UJSuLQx61pCFM0s5wSRvKCEMDjd/cHY3/GI1szHIWbpXpsJdg3V6ISGGx9xDw==", "requires": { "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^3.2.1", "node-gyp-build": "^4.3.0" }, "dependencies": { "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" } }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" } } } }, "@parcel/workers": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.6.2.tgz", "integrity": "sha512-wBgUjJQm+lDd12fPRUmk09+ujTA9DgwPdqylSFK0OtI/yT6A+2kArUqjp8IwWo2tCJXoMzXBne2XQIWKqMiN4Q==", "requires": { "@parcel/diagnostic": "2.6.2", "@parcel/logger": "2.6.2", "@parcel/types": "2.6.2", "@parcel/utils": "2.6.2", "chrome-trace-event": "^1.0.2", "nullthrows": "^1.1.1" } }, "@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", "requires": { "ansi-html-community": "^0.0.8", "common-path-prefix": "^3.0.0", "core-js-pure": "^3.23.3", "error-stack-parser": "^2.0.6", "find-up": "^5.0.0", "html-entities": "^2.1.0", "loader-utils": "^2.0.4", "schema-utils": "^3.0.0", "source-map": "^0.7.3" }, "dependencies": { "source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" } } }, "@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", "requires": { "@hapi/hoek": "^9.0.0" } }, "@sideway/formula": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "@sideway/pinpoint": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" }, "@sindresorhus/slugify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.2.tgz", "integrity": "sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA==", "requires": { "@sindresorhus/transliterate": "^0.1.1", "escape-string-regexp": "^4.0.0" }, "dependencies": { "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" } } }, "@sindresorhus/transliterate": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz", "integrity": "sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w==", "requires": { "escape-string-regexp": "^2.0.0", "lodash.deburr": "^4.1.0" }, "dependencies": { "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" } } }, "@swc/helpers": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", "requires": { "tslib": "^2.4.0" } }, "@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "requires": { "defer-to-connect": "^2.0.0" } }, "@tippy.js/react": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@tippy.js/react/-/react-2.2.3.tgz", "integrity": "sha512-5XYvbQujzDj9r00JYEz/cBtm6DutjOdv2azdco53B+eWF7FDBCQfkLVn87wimfEpmGK0vqRQv/cwFxFcoOP98Q==", "requires": { "prop-types": "^15.6.2", "tippy.js": "^4.3.4" } }, "@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" }, "@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, "@turist/fetch": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@turist/fetch/-/fetch-7.2.0.tgz", "integrity": "sha512-2x7EGw+6OJ29phunsbGvtxlNmSfcuPcyYudkMbi8gARCP9eJ1CtuMvnVUHL//O9Ixi9SJiug8wNt6lj86pN8XQ==", "requires": { "@types/node-fetch": "2" } }, "@turist/time": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/@turist/time/-/time-0.0.2.tgz", "integrity": "sha512-qLOvfmlG2vCVw5fo/oz8WAZYlpe5a5OurgTj3diIxJCdjRHpapC+vQCz3er9LV79Vcat+DifBjeAhOAdmndtDQ==" }, "@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "requires": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "@types/common-tags": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.1.tgz", "integrity": "sha512-20R/mDpKSPWdJs5TOpz3e7zqbeCNuMCPhV7Yndk9KU2Rbij2r5W4RzwDPkzC+2lzUqXYu9rFzTktCBnDjHuNQg==" }, "@types/component-emitter": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==" }, "@types/configstore": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-2.1.1.tgz", "integrity": "sha512-YY+hm3afkDHeSM2rsFXxeZtu0garnusBWNG1+7MknmDWQHqcH2w21/xOU9arJUi8ch4qyFklidANLCu3ihhVwQ==" }, "@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" }, "@types/cors": { "version": "2.8.13", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", "requires": { "@types/node": "*" } }, "@types/debug": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" }, "@types/eslint": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", "requires": { "@types/estree": "*", "@types/json-schema": "*" } }, "@types/eslint-scope": { "version": "3.7.4", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "requires": { "@types/eslint": "*", "@types/estree": "*" } }, "@types/estree": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" }, "@types/get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-3.2.0.tgz", "integrity": "sha512-TiNg8R1kjDde5Pub9F9vCwZA/BNW9HeXP5b9j7Qucqncy/McfPZ6xze/EyBdXS5FhMIGN6Fx3vg75l5KHy3V1Q==" }, "@types/glob": { "version": "5.0.37", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.37.tgz", "integrity": "sha512-ATA/xrS7CZ3A2WCPVY4eKdNpybq56zqlTirnHhhyOztZM/lPxJzusOBI3BsaXbu6FrUluqzvMlI4sZ6BDYMlMg==", "requires": { "@types/minimatch": "*", "@types/node": "*" } }, "@types/hast": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", "requires": { "@types/unist": "*" } }, "@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, "@types/http-proxy": { "version": "1.17.9", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "requires": { "@types/node": "*" } }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, "@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "requires": { "@types/node": "*" } }, "@types/lodash": { "version": "4.14.191", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" }, "@types/mdast": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", "requires": { "@types/unist": "*" } }, "@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" }, "@types/mkdirp": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", "requires": { "@types/node": "*" } }, "@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" }, "@types/node-fetch": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", "requires": { "@types/node": "*", "form-data": "^3.0.0" } }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/parse5": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" }, "@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "@types/reach__router": { "version": "1.3.11", "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.3.11.tgz", "integrity": "sha512-j23ChnIEiW8aAP4KT8OVyTXOFr+Ri65BDnwzmfHFO9WHypXYevHFjeil1Cj7YH3emfCE924BwAmgW4hOv7Wg3g==", "requires": { "@types/react": "*" } }, "@types/react": { "version": "18.0.26", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, "@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", "requires": { "@types/node": "*" } }, "@types/rimraf": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.5.tgz", "integrity": "sha512-YyP+VfeaqAyFmXoTh3HChxOQMyjByRMsHU7kc5KOJkSlXudhMhQIALbYV7rHh/l8d2lX3VUQzprrcAgWdRuU8g==", "requires": { "@types/glob": "*", "@types/node": "*" } }, "@types/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", "requires": { "@types/node": "*" } }, "@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "@types/sharp": { "version": "0.30.5", "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.30.5.tgz", "integrity": "sha512-EhO29617AIBqxoVtpd1qdBanWpspk/kD2B6qTFRJ31Q23Rdf+DNU1xlHSwtqvwq1vgOqBwq1i38SX+HGCymIQg==", "requires": { "@types/node": "*" } }, "@types/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-gVC1InwyVrO326wbBZw+AO3u2vRXz/iRWq9jYhpG4W8LXyIgDv3ZmcLQ5Q4Gs+gFMyqx+viFoFT+l3p61QFCmQ==" }, "@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, "@types/yoga-layout": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" }, "@typescript-eslint/eslint-plugin": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", "requires": { "@typescript-eslint/experimental-utils": "4.33.0", "@typescript-eslint/scope-manager": "4.33.0", "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", "regexpp": "^3.1.0", "semver": "^7.3.5", "tsutils": "^3.21.0" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "@typescript-eslint/experimental-utils": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", "requires": { "@types/json-schema": "^7.0.7", "@typescript-eslint/scope-manager": "4.33.0", "@typescript-eslint/types": "4.33.0", "@typescript-eslint/typescript-estree": "4.33.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", "requires": { "@typescript-eslint/scope-manager": "4.33.0", "@typescript-eslint/types": "4.33.0", "@typescript-eslint/typescript-estree": "4.33.0", "debug": "^4.3.1" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "@typescript-eslint/scope-manager": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", "requires": { "@typescript-eslint/types": "4.33.0", "@typescript-eslint/visitor-keys": "4.33.0" } }, "@typescript-eslint/types": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==" }, "@typescript-eslint/typescript-estree": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", "requires": { "@typescript-eslint/types": "4.33.0", "@typescript-eslint/visitor-keys": "4.33.0", "debug": "^4.3.1", "globby": "^11.0.3", "is-glob": "^4.0.1", "semver": "^7.3.5", "tsutils": "^3.21.0" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "@typescript-eslint/visitor-keys": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", "requires": { "@typescript-eslint/types": "4.33.0", "eslint-visitor-keys": "^2.0.0" } }, "@vercel/webpack-asset-relocator-loader": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/@vercel/webpack-asset-relocator-loader/-/webpack-asset-relocator-loader-1.7.3.tgz", "integrity": "sha512-vizrI18v8Lcb1PmNNUBz7yxPxxXoOeuaVEjTG9MjvDrphjiSxFZrRJ5tIghk+qdLFRCXI5HBCshgobftbmrC5g==", "requires": { "resolve": "^1.10.0" } }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "requires": { "@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" }, "@webassemblyjs/helper-api-error": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" }, "@webassemblyjs/helper-buffer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" }, "@webassemblyjs/helper-numbers": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "requires": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" }, "@webassemblyjs/helper-wasm-section": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.1" } }, "@webassemblyjs/ieee754": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" }, "@webassemblyjs/wasm-edit": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-section": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.1", "@webassemblyjs/wasm-opt": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", "@webassemblyjs/wast-printer": "1.11.1" } }, "@webassemblyjs/wasm-gen": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/ieee754": "1.11.1", "@webassemblyjs/leb128": "1.11.1", "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wasm-opt": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1" } }, "@webassemblyjs/wasm-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/ieee754": "1.11.1", "@webassemblyjs/leb128": "1.11.1", "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wast-printer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "requires": { "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "abortcontroller-polyfill": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" }, "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "requires": {} }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "requires": {} }, "acorn-loose": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.3.0.tgz", "integrity": "sha512-75lAs9H19ldmW+fAbyqHdjgdCrz0pWGXKmnqFoh8PyVd1L2RIb4RzYrSjmopeqv3E1G3/Pimu6GgLlrGbrkF7w==", "requires": { "acorn": "^8.5.0" } }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" }, "address": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" }, "adjust-sourcemap-loader": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", "requires": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" } }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "requires": {} }, "anser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/anser/-/anser-2.1.1.tgz", "integrity": "sha512-nqLm4HxOTpeLOxcmB3QWmV5TcDFhW9y/fyQ+hivtDFcK4OQ+pQ5fzPnXHM1Mfcm0VkLtvVi1TCPr++Qy0Q/3EQ==" }, "ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "requires": { "string-width": "^4.1.0" } }, "ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" }, "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" }, "ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==" }, "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "optional": true, "requires": { "micromatch": "^2.1.5", "normalize-path": "^2.0.0" } }, "append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, "application-config-path": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz", "integrity": "sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==" }, "arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" }, "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { "sprintf-js": "~1.0.2" } }, "aria-query": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", "requires": { "@babel/runtime": "^7.10.2", "@babel/runtime-corejs3": "^7.10.2" } }, "arity-n": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", "integrity": "sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==" }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==", "dev": true, "optional": true, "requires": { "arr-flatten": "^1.0.1" } }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true, "optional": true }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", "dev": true, "optional": true }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "array-includes": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" } }, "array-iterate": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz", "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==" }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==", "dev": true, "optional": true }, "array.prototype.flat": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.tosorted": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0", "get-intrinsic": "^1.1.3" } }, "arrify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", "dev": true, "optional": true }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" }, "async-cache": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/async-cache/-/async-cache-1.1.0.tgz", "integrity": "sha512-YDQc4vBn5NFhY6g6HhVshyi3Fy9+SQ5ePnE7JLDJn1DoL+i7ER+vMwtTNOYk9leZkYMnOwpBCWqyLDPw8Aig8g==", "requires": { "lru-cache": "^4.0.0" }, "dependencies": { "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" } } }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true, "optional": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "auto-bind": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==" }, "autoprefixer": { "version": "10.4.13", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", "requires": { "browserslist": "^4.21.4", "caniuse-lite": "^1.0.30001426", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" } }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "axe-core": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.2.tgz", "integrity": "sha512-b1WlTV8+XKLj9gZy2DZXgQiyDp9xkkoe2a6U6UbYccScq2wgH/YwCeI2/Jq2mgo0HzQxqJOjWZBLeA/mqsk5Mg==" }, "axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "requires": { "follow-redirects": "^1.14.0" } }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" }, "babel-cli": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", "integrity": "sha512-wau+BDtQfuSBGQ9PzzFL3REvR9Sxnd4LKwtcHAiPjhugA7K/80vpHXafj+O5bAqJOuSefjOx5ZJnNSR2J1Qw6Q==", "dev": true, "requires": { "babel-core": "^6.26.0", "babel-polyfill": "^6.26.0", "babel-register": "^6.26.0", "babel-runtime": "^6.26.0", "chokidar": "^1.6.1", "commander": "^2.11.0", "convert-source-map": "^1.5.0", "fs-readdir-recursive": "^1.0.0", "glob": "^7.1.2", "lodash": "^4.17.4", "output-file-sync": "^1.1.2", "path-is-absolute": "^1.0.1", "slash": "^1.0.0", "source-map": "^0.5.6", "v8flags": "^2.1.1" } }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", "dev": true, "requires": { "chalk": "^1.1.3", "esutils": "^2.0.2", "js-tokens": "^3.0.2" } }, "babel-core": { "version": "6.26.3", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { "babel-code-frame": "^6.26.0", "babel-generator": "^6.26.0", "babel-helpers": "^6.24.1", "babel-messages": "^6.23.0", "babel-register": "^6.26.0", "babel-runtime": "^6.26.0", "babel-template": "^6.26.0", "babel-traverse": "^6.26.0", "babel-types": "^6.26.0", "babylon": "^6.18.0", "convert-source-map": "^1.5.1", "debug": "^2.6.9", "json5": "^0.5.1", "lodash": "^4.17.4", "minimatch": "^3.0.4", "path-is-absolute": "^1.0.1", "private": "^0.1.8", "slash": "^1.0.0", "source-map": "^0.5.7" }, "dependencies": { "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", "dev": true } } }, "babel-eslint": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", "peer": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.7.0", "@babel/traverse": "^7.7.0", "@babel/types": "^7.7.0", "eslint-visitor-keys": "^1.0.0", "resolve": "^1.12.0" }, "dependencies": { "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "peer": true } } }, "babel-extract-comments": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", "requires": { "babylon": "^6.18.0" } }, "babel-generator": { "version": "6.26.1", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { "babel-messages": "^6.23.0", "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "detect-indent": "^4.0.0", "jsesc": "^1.3.0", "lodash": "^4.17.4", "source-map": "^0.5.7", "trim-right": "^1.0.1" } }, "babel-helper-builder-binary-assignment-operator-visitor": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", "integrity": "sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==", "dev": true, "requires": { "babel-helper-explode-assignable-expression": "^6.24.1", "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "babel-helper-builder-react-jsx": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", "integrity": "sha512-02I9jDjnVEuGy2BR3LRm9nPRb/+Ja0pvZVLr1eI5TYAA/dB0Xoc+WBo50+aDfhGDLhlBY1+QURjn9uvcFd8gzg==", "dev": true, "requires": { "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "esutils": "^2.0.2" } }, "babel-helper-call-delegate": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", "integrity": "sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ==", "dev": true, "requires": { "babel-helper-hoist-variables": "^6.24.1", "babel-runtime": "^6.22.0", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "babel-helper-define-map": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", "integrity": "sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA==", "dev": true, "requires": { "babel-helper-function-name": "^6.24.1", "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "lodash": "^4.17.4" } }, "babel-helper-explode-assignable-expression": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", "integrity": "sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==", "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "babel-helper-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", "integrity": "sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==", "dev": true, "requires": { "babel-helper-get-function-arity": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", "integrity": "sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==", "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", "integrity": "sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw==", "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", "integrity": "sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA==", "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "babel-helper-regex": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", "integrity": "sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg==", "dev": true, "requires": { "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "lodash": "^4.17.4" } }, "babel-helper-remap-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", "integrity": "sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg==", "dev": true, "requires": { "babel-helper-function-name": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "babel-helper-replace-supers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", "integrity": "sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw==", "dev": true, "requires": { "babel-helper-optimise-call-expression": "^6.24.1", "babel-messages": "^6.23.0", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "babel-helpers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==", "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "babel-loader": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", "requires": { "find-cache-dir": "^3.3.1", "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "dependencies": { "schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "requires": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" } } } }, "babel-messages": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", "dev": true, "requires": { "babel-runtime": "^6.22.0" } }, "babel-plugin-add-module-exports": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==" }, "babel-plugin-check-es2015-constants": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", "integrity": "sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA==", "dev": true, "requires": { "babel-runtime": "^6.22.0" } }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "requires": { "object.assign": "^4.1.0" } }, "babel-plugin-lodash": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz", "integrity": "sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg==", "requires": { "@babel/helper-module-imports": "^7.0.0-beta.49", "@babel/types": "^7.0.0-beta.49", "glob": "^7.1.1", "lodash": "^4.17.10", "require-package-name": "^2.0.1" } }, "babel-plugin-macros": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "requires": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" } }, "babel-plugin-polyfill-corejs2": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "requires": { "@babel/compat-data": "^7.17.7", "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" }, "dependencies": { "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "babel-plugin-polyfill-corejs3": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "requires": { "@babel/helper-define-polyfill-provider": "^0.3.3", "core-js-compat": "^3.25.1" }, "dependencies": { "core-js-compat": { "version": "3.27.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.1.tgz", "integrity": "sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==", "requires": { "browserslist": "^4.21.4" } } } }, "babel-plugin-polyfill-regenerator": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "requires": { "@babel/helper-define-polyfill-provider": "^0.3.3" } }, "babel-plugin-remove-graphql-queries": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-4.25.0.tgz", "integrity": "sha512-enyqRNRrn7vTG3nwg1V+XhoAJIyUv3ZukQCs5KbHOK+WNDDiGZQzIG+FCiZFACScdZBJWyx7TYRYbOFJZ/KEGg==", "requires": { "@babel/runtime": "^7.15.4", "@babel/types": "^7.15.4", "gatsby-core-utils": "^3.25.0" } }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw==", "dev": true }, "babel-plugin-syntax-class-properties": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", "integrity": "sha512-chI3Rt9T1AbrQD1s+vxw3KcwC9yHtF621/MacuItITfZX344uhQoANjpoSJZleAmW2tjlolqB/f+h7jIqXa7pA==", "dev": true }, "babel-plugin-syntax-decorators": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", "integrity": "sha512-AWj19x2aDm8qFQ5O2JcD6pwJDW1YdcnO+1b81t7gxrGjz5VHiUqeYWAR4h7zueWMalRelrQDXprv2FrY1dbpbw==", "dev": true }, "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "integrity": "sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==", "dev": true }, "babel-plugin-syntax-flow": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", "integrity": "sha512-HbTDIoG1A1op7Tl/wIFQPULIBA61tsJ8Ntq2FAhLwuijrzosM/92kAfgU1Q3Kc7DH/cprJg5vDfuTY4QUL4rDA==", "dev": true }, "babel-plugin-syntax-jsx": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==", "dev": true }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==" }, "babel-plugin-syntax-trailing-function-commas": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", "integrity": "sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ==", "dev": true }, "babel-plugin-transform-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", "integrity": "sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw==", "dev": true, "requires": { "babel-helper-remap-async-to-generator": "^6.24.1", "babel-plugin-syntax-async-functions": "^6.8.0", "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-class-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", "integrity": "sha512-n4jtBA3OYBdvG5PRMKsMXJXHfLYw/ZOmtxCLOOwz6Ro5XlrColkStLnz1AS1L2yfPA9BKJ1ZNlmVCLjAL9DSIg==", "dev": true, "requires": { "babel-helper-function-name": "^6.24.1", "babel-plugin-syntax-class-properties": "^6.8.0", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "babel-plugin-transform-decorators-legacy": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==", "dev": true, "requires": { "babel-plugin-syntax-decorators": "^6.1.18", "babel-runtime": "^6.2.0", "babel-template": "^6.3.0" } }, "babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", "integrity": "sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg==", "dev": true, "requires": { "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", "integrity": "sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A==", "dev": true, "requires": { "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", "integrity": "sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw==", "dev": true, "requires": { "babel-runtime": "^6.26.0", "babel-template": "^6.26.0", "babel-traverse": "^6.26.0", "babel-types": "^6.26.0", "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", "integrity": "sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag==", "dev": true, "requires": { "babel-helper-define-map": "^6.24.1", "babel-helper-function-name": "^6.24.1", "babel-helper-optimise-call-expression": "^6.24.1", "babel-helper-replace-supers": "^6.24.1", "babel-messages": "^6.23.0", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-computed-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", "integrity": "sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw==", "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", "integrity": "sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA==", "dev": true, "requires": { "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", "integrity": "sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug==", "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", "integrity": "sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw==", "dev": true, "requires": { "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", "integrity": "sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg==", "dev": true, "requires": { "babel-helper-function-name": "^6.24.1", "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", "integrity": "sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ==", "dev": true, "requires": { "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", "integrity": "sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA==", "dev": true, "requires": { "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-commonjs": { "version": "6.26.2", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, "requires": { "babel-plugin-transform-strict-mode": "^6.24.1", "babel-runtime": "^6.26.0", "babel-template": "^6.26.0", "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", "integrity": "sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg==", "dev": true, "requires": { "babel-helper-hoist-variables": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", "integrity": "sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw==", "dev": true, "requires": { "babel-plugin-transform-es2015-modules-amd": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-object-super": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", "integrity": "sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA==", "dev": true, "requires": { "babel-helper-replace-supers": "^6.24.1", "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ==", "dev": true, "requires": { "babel-helper-call-delegate": "^6.24.1", "babel-helper-get-function-arity": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", "integrity": "sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw==", "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", "integrity": "sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg==", "dev": true, "requires": { "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", "integrity": "sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ==", "dev": true, "requires": { "babel-helper-regex": "^6.24.1", "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", "integrity": "sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg==", "dev": true, "requires": { "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", "integrity": "sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw==", "dev": true, "requires": { "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", "integrity": "sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ==", "dev": true, "requires": { "babel-helper-regex": "^6.24.1", "babel-runtime": "^6.22.0", "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", "integrity": "sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==", "dev": true, "requires": { "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", "babel-plugin-syntax-exponentiation-operator": "^6.8.0", "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-flow-strip-types": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", "integrity": "sha512-TxIM0ZWNw9oYsoTthL3lvAK3+eTujzktoXJg4ubGvICGbVuXVYv5hHv0XXpz8fbqlJaGYY4q5SVzaSmsg3t4Fg==", "dev": true, "requires": { "babel-plugin-syntax-flow": "^6.18.0", "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-object-rest-spread": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", "integrity": "sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA==", "requires": { "babel-plugin-syntax-object-rest-spread": "^6.8.0", "babel-runtime": "^6.26.0" } }, "babel-plugin-transform-react-display-name": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", "integrity": "sha512-QLYkLiZeeED2PKd4LuXGg5y9fCgPB5ohF8olWUuETE2ryHNRqqnXlEVP7RPuef89+HTfd3syptMGVHeoAu0Wig==", "dev": true, "requires": { "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", "integrity": "sha512-s+q/Y2u2OgDPHRuod3t6zyLoV8pUHc64i/O7ZNgIOEdYTq+ChPeybcKBi/xk9VI60VriILzFPW+dUxAEbTxh2w==", "dev": true, "requires": { "babel-helper-builder-react-jsx": "^6.24.1", "babel-plugin-syntax-jsx": "^6.8.0", "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx-self": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", "integrity": "sha512-Y3ZHP1nunv0U1+ysTNwLK39pabHj6cPVsfN4TRC7BDBfbgbyF4RifP5kd6LnbuMV9wcfedQMe7hn1fyKc7IzTQ==", "dev": true, "requires": { "babel-plugin-syntax-jsx": "^6.8.0", "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx-source": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", "integrity": "sha512-pcDNDsZ9q/6LJmujQ/OhjeoIlp5Nl546HJ2yiFIJK3mYpgNXhI5/S9mXfVxu5yqWAi7HdI7e/q6a9xtzwL69Vw==", "dev": true, "requires": { "babel-plugin-syntax-jsx": "^6.8.0", "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-remove-prop-types": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" }, "babel-plugin-transform-regenerator": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", "integrity": "sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg==", "dev": true, "requires": { "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-strict-mode": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", "integrity": "sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==", "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", "dev": true, "requires": { "babel-runtime": "^6.26.0", "core-js": "^2.5.0", "regenerator-runtime": "^0.10.5" } }, "babel-preset-env": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", "dev": true, "requires": { "babel-plugin-check-es2015-constants": "^6.22.0", "babel-plugin-syntax-trailing-function-commas": "^6.22.0", "babel-plugin-transform-async-to-generator": "^6.22.0", "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", "babel-plugin-transform-es2015-block-scoping": "^6.23.0", "babel-plugin-transform-es2015-classes": "^6.23.0", "babel-plugin-transform-es2015-computed-properties": "^6.22.0", "babel-plugin-transform-es2015-destructuring": "^6.23.0", "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", "babel-plugin-transform-es2015-for-of": "^6.23.0", "babel-plugin-transform-es2015-function-name": "^6.22.0", "babel-plugin-transform-es2015-literals": "^6.22.0", "babel-plugin-transform-es2015-modules-amd": "^6.22.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", "babel-plugin-transform-es2015-modules-umd": "^6.23.0", "babel-plugin-transform-es2015-object-super": "^6.22.0", "babel-plugin-transform-es2015-parameters": "^6.23.0", "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", "babel-plugin-transform-es2015-spread": "^6.22.0", "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", "babel-plugin-transform-es2015-template-literals": "^6.22.0", "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", "babel-plugin-transform-exponentiation-operator": "^6.22.0", "babel-plugin-transform-regenerator": "^6.22.0", "browserslist": "^3.2.6", "invariant": "^2.2.2", "semver": "^5.3.0" }, "dependencies": { "browserslist": { "version": "3.2.8", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", "dev": true, "requires": { "caniuse-lite": "^1.0.30000844", "electron-to-chromium": "^1.3.47" } } } }, "babel-preset-fbjs": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", "requires": { "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-object-rest-spread": "^7.0.0", "@babel/plugin-syntax-class-properties": "^7.0.0", "@babel/plugin-syntax-flow": "^7.0.0", "@babel/plugin-syntax-jsx": "^7.0.0", "@babel/plugin-syntax-object-rest-spread": "^7.0.0", "@babel/plugin-transform-arrow-functions": "^7.0.0", "@babel/plugin-transform-block-scoped-functions": "^7.0.0", "@babel/plugin-transform-block-scoping": "^7.0.0", "@babel/plugin-transform-classes": "^7.0.0", "@babel/plugin-transform-computed-properties": "^7.0.0", "@babel/plugin-transform-destructuring": "^7.0.0", "@babel/plugin-transform-flow-strip-types": "^7.0.0", "@babel/plugin-transform-for-of": "^7.0.0", "@babel/plugin-transform-function-name": "^7.0.0", "@babel/plugin-transform-literals": "^7.0.0", "@babel/plugin-transform-member-expression-literals": "^7.0.0", "@babel/plugin-transform-modules-commonjs": "^7.0.0", "@babel/plugin-transform-object-super": "^7.0.0", "@babel/plugin-transform-parameters": "^7.0.0", "@babel/plugin-transform-property-literals": "^7.0.0", "@babel/plugin-transform-react-display-name": "^7.0.0", "@babel/plugin-transform-react-jsx": "^7.0.0", "@babel/plugin-transform-shorthand-properties": "^7.0.0", "@babel/plugin-transform-spread": "^7.0.0", "@babel/plugin-transform-template-literals": "^7.0.0", "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" }, "dependencies": { "babel-plugin-syntax-trailing-function-commas": { "version": "7.0.0-beta.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" } } }, "babel-preset-flow": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", "integrity": "sha512-PQZFJXnM3d80Vq4O67OE6EMVKIw2Vmzy8UXovqulNogCtblWU8rzP7Sm5YgHiCg4uejUxzCkHfNXQ4Z6GI+Dhw==", "dev": true, "requires": { "babel-plugin-transform-flow-strip-types": "^6.22.0" } }, "babel-preset-react": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", "integrity": "sha512-phQe3bElbgF887UM0Dhz55d22ob8czTL1kbhZFwpCE6+R/X9kHktfwmx9JZb+bBSVRGphP5tZ9oWhVhlgjrX3Q==", "dev": true, "requires": { "babel-plugin-syntax-jsx": "^6.3.13", "babel-plugin-transform-react-display-name": "^6.23.0", "babel-plugin-transform-react-jsx": "^6.24.1", "babel-plugin-transform-react-jsx-self": "^6.22.0", "babel-plugin-transform-react-jsx-source": "^6.22.0", "babel-preset-flow": "^6.23.0" } }, "babel-register": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==", "dev": true, "requires": { "babel-core": "^6.26.0", "babel-runtime": "^6.26.0", "core-js": "^2.5.0", "home-or-tmp": "^2.0.0", "lodash": "^4.17.4", "mkdirp": "^0.5.1", "source-map-support": "^0.4.15" } }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" }, "dependencies": { "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" } } }, "babel-template": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", "dev": true, "requires": { "babel-runtime": "^6.26.0", "babel-traverse": "^6.26.0", "babel-types": "^6.26.0", "babylon": "^6.18.0", "lodash": "^4.17.4" } }, "babel-traverse": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", "dev": true, "requires": { "babel-code-frame": "^6.26.0", "babel-messages": "^6.23.0", "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "babylon": "^6.18.0", "debug": "^2.6.8", "globals": "^9.18.0", "invariant": "^2.2.2", "lodash": "^4.17.4" } }, "babel-types": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", "dev": true, "requires": { "babel-runtime": "^6.26.0", "esutils": "^2.0.2", "lodash": "^4.17.4", "to-fast-properties": "^1.0.3" } }, "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" }, "bail": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "optional": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", "component-emitter": "^1.2.1", "define-property": "^1.0.0", "isobject": "^3.0.1", "mixin-deep": "^1.2.0", "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "optional": true, "requires": { "is-descriptor": "^1.0.0" } }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true } } }, "base-x": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", "requires": { "safe-buffer": "^5.0.1" } }, "base64-arraybuffer": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==" }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" }, "better-opn": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz", "integrity": "sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==", "requires": { "open": "^7.0.3" } }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true, "optional": true }, "bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, "optional": true, "requires": { "file-uri-to-path": "1.0.0" } }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" }, "dependencies": { "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } } } }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" }, "dependencies": { "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" } } }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "boxen": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "requires": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", "chalk": "^4.1.0", "cli-boxes": "^2.2.1", "string-width": "^4.2.2", "type-fest": "^0.20.2", "widest-line": "^3.1.0", "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } } } }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==", "dev": true, "optional": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", "repeat-element": "^1.1.2" } }, "brcast": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/brcast/-/brcast-3.0.2.tgz", "integrity": "sha512-f5XwwFCCuvgqP2nMH/hJ74FqnGmb4X3D+NC//HphxJzzhsZvSZa+Hk/syB7j3ZHpPDLMoYU8oBgviRWfNvEfKA==" }, "browserslist": { "version": "4.21.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "requires": { "caniuse-lite": "^1.0.30001400", "electron-to-chromium": "^1.4.251", "node-releases": "^2.0.6", "update-browserslist-db": "^1.0.9" } }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "requires": { "node-int64": "^0.4.0" } }, "buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "requires": { "streamsearch": "^1.1.0" } }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "optional": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", "get-value": "^2.0.6", "has-value": "^1.0.0", "isobject": "^3.0.1", "set-value": "^2.0.0", "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" }, "dependencies": { "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true } } }, "cache-manager": { "version": "2.11.1", "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.11.1.tgz", "integrity": "sha512-XhUuc9eYwkzpK89iNewFwtvcDYMUsvtwzHeyEOPJna/WsVsXcrzsA1ft2M0QqPNunEzLhNCYPo05tEfG+YuNow==", "requires": { "async": "1.5.2", "lodash.clonedeep": "4.5.0", "lru-cache": "4.0.0" }, "dependencies": { "lru-cache": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", "integrity": "sha512-WKhDkjlLwzE8jAQdQlsxLUQTPXLCKX/4cJk6s5AlRtJkDBk0IKH5O51bVDH61K9N4bhbbyvLM6EiOuE8ovApPA==", "requires": { "pseudomap": "^1.0.1", "yallist": "^2.0.0" } }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" } } }, "cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" }, "cacheable-request": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" }, "dependencies": { "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { "pump": "^3.0.0" } } } }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camel-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "requires": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "requires": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "caniuse-lite": { "version": "1.0.30001442", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz", "integrity": "sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow==" }, "capital-case": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, "ccount": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" } }, "change-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", "requires": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "change-case-all": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.14.tgz", "integrity": "sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA==", "requires": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } }, "character-entities": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" }, "character-entities-html4": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==" }, "character-entities-legacy": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" }, "character-reference-invalid": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "cheerio": { "version": "1.0.0-rc.12", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "requires": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "htmlparser2": "^8.0.1", "parse5": "^7.0.0", "parse5-htmlparser2-tree-adapter": "^7.0.0" } }, "cheerio-select": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "requires": { "boolbase": "^1.0.0", "css-select": "^5.1.0", "css-what": "^6.1.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" } }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==", "dev": true, "optional": true, "requires": { "anymatch": "^1.3.0", "async-each": "^1.0.0", "fsevents": "^1.0.0", "glob-parent": "^2.0.0", "inherits": "^2.0.1", "is-binary-path": "^1.0.0", "is-glob": "^2.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.0.0" } }, "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "optional": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", "isobject": "^3.0.0", "static-extend": "^0.1.1" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "optional": true, "requires": { "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "optional": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "optional": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "optional": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true }, "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "optional": true } } }, "classnames": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, "cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "requires": { "restore-cursor": "^3.1.0" } }, "cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" }, "clipboardy": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", "requires": { "arch": "^2.1.1", "execa": "^1.0.0", "is-wsl": "^2.1.1" }, "dependencies": { "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "requires": { "pump": "^3.0.0" } }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "requires": { "path-key": "^2.0.0" } }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { "isexe": "^2.0.0" } } } }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" }, "dependencies": { "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } } } }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "requires": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", "shallow-clone": "^3.0.0" } }, "clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "requires": { "mimic-response": "^1.0.0" } }, "collapse-white-space": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", "dev": true, "optional": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" } }, "color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "requires": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "colorette": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { "delayed-stream": "~1.0.0" } }, "comma-separated-tokens": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" }, "command-exists": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" }, "common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "compose-function": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", "integrity": "sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==", "requires": { "arity-n": "^1.0.4" } }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { "mime-db": ">= 1.43.0 < 2" } }, "compression": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "requires": { "accepts": "~1.3.5", "bytes": "3.0.0", "compressible": "~2.0.16", "debug": "2.6.9", "on-headers": "~1.0.2", "safe-buffer": "5.1.2", "vary": "~1.1.2" }, "dependencies": { "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "requires": { "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", "make-dir": "^3.0.0", "unique-string": "^2.0.0", "write-file-atomic": "^3.0.0", "xdg-basedir": "^4.0.0" } }, "confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" }, "constant-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case": "^2.0.2" } }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { "safe-buffer": "5.2.1" } }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-hrtime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==" }, "convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", "dev": true, "optional": true }, "core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.0.tgz", "integrity": "sha512-YK6fwFjCOKWwGnjFUR3c544YsnA/7DoLL0ysncuOJ4pwbriAtOpvM2bygdlcXbvQCQZ7bBU9CL4t7tGl7ETRpQ==", "requires": { "browserslist": "^4.16.3", "semver": "7.0.0" }, "dependencies": { "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" } } }, "core-js-pure": { "version": "3.27.1", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.27.1.tgz", "integrity": "sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw==" }, "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "requires": { "object-assign": "^4", "vary": "^1" } }, "cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "create-gatsby": { "version": "2.25.0", "resolved": "https://registry.npmjs.org/create-gatsby/-/create-gatsby-2.25.0.tgz", "integrity": "sha512-96Kl/6Far2j65/vFv/6Mb9+T+/4oW8hlC3UmdfjgBgUIzTPFmezY1ygPu2dfCKjprWkArB8DpE7EsAaJoRKB1Q==", "requires": { "@babel/runtime": "^7.15.4" } }, "cross-fetch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "requires": { "node-fetch": "2.6.7" } }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" }, "css": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", "requires": { "inherits": "^2.0.3", "source-map": "^0.6.1", "source-map-resolve": "^0.5.2", "urix": "^0.1.0" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "css-declaration-sorter": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", "requires": {} }, "css-loader": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", "requires": { "icss-utils": "^5.1.0", "loader-utils": "^2.0.0", "postcss": "^8.2.15", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.1.0", "schema-utils": "^3.0.0", "semver": "^7.3.5" }, "dependencies": { "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "css-minimizer-webpack-plugin": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-2.0.0.tgz", "integrity": "sha512-cG/uc94727tx5pBNtb1Sd7gvUPzwmcQi1lkpfqTpdkuNq75hJCw7bIVsCNijLm4dhDcr1atvuysl2rZqOG8Txw==", "requires": { "cssnano": "^5.0.0", "jest-worker": "^26.3.0", "p-limit": "^3.0.2", "postcss": "^8.2.9", "schema-utils": "^3.0.0", "serialize-javascript": "^5.0.1", "source-map": "^0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "css-select": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "requires": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "css-selector-parser": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==" }, "css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "requires": { "mdn-data": "2.0.14", "source-map": "^0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "css-vendor": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz", "integrity": "sha512-Vx/Vl3zsHj32Z+WTNzGjd2iSbSIJTYHMmyGUT2nzCjj0Xk4qLfwpQ8nF6TQ5oo3Cf0s/An3DTc7LclH1BkAXbQ==", "requires": { "is-in-browser": "^1.0.2" } }, "css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" }, "css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssfilter": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" }, "cssnano": { "version": "5.1.14", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", "requires": { "cssnano-preset-default": "^5.2.13", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { "version": "5.2.13", "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", "requires": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", "postcss-merge-longhand": "^5.1.7", "postcss-merge-rules": "^5.1.3", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", "postcss-normalize-positions": "^5.1.1", "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", "postcss-reduce-initial": "^5.1.1", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" } }, "cssnano-utils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", "requires": {} }, "csso": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "requires": { "css-tree": "^1.1.2" } }, "csstype": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "requires": { "es5-ext": "^0.10.50", "type": "^1.0.1" } }, "damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" }, "date-fns": { "version": "2.29.3", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" }, "decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" }, "decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "requires": { "mimic-response": "^3.1.0" }, "dependencies": { "mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" } } }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" }, "defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" }, "define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "optional": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true } } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "dependency-graph": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==" }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "detab": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", "requires": { "repeat-string": "^1.5.4" } }, "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==", "dev": true, "requires": { "repeating": "^2.0.0" } }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" }, "detect-port": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "requires": { "address": "^1.0.1", "debug": "4" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "detect-port-alt": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", "requires": { "address": "^1.0.1", "debug": "^2.6.0" } }, "devcert": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.2.2.tgz", "integrity": "sha512-UsLqvtJGPiGwsIZnJINUnFYaWgK7CroreGRndWHZkRD58tPFr3pVbbSyHR8lbh41+azR4jKvuNZ+eCoBZGA5kA==", "requires": { "@types/configstore": "^2.1.1", "@types/debug": "^0.0.30", "@types/get-port": "^3.2.0", "@types/glob": "^5.0.34", "@types/lodash": "^4.14.92", "@types/mkdirp": "^0.5.2", "@types/node": "^8.5.7", "@types/rimraf": "^2.0.2", "@types/tmp": "^0.0.33", "application-config-path": "^0.1.0", "command-exists": "^1.2.4", "debug": "^3.1.0", "eol": "^0.9.1", "get-port": "^3.2.0", "glob": "^7.1.2", "is-valid-domain": "^0.1.6", "lodash": "^4.17.4", "mkdirp": "^0.5.1", "password-prompt": "^1.0.4", "rimraf": "^2.6.2", "sudo-prompt": "^8.2.0", "tmp": "^0.0.33", "tslib": "^1.10.0" }, "dependencies": { "@types/node": { "version": "8.10.66", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" }, "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "requires": { "os-tmpdir": "~1.0.2" } }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" } } }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "requires": { "path-type": "^4.0.0" } }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "requires": { "esutils": "^2.0.2" } }, "dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "requires": { "utila": "~0.4" } }, "dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "requires": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" }, "domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "requires": { "domelementtype": "^2.3.0" } }, "domutils": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "requires": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.1" } }, "dot-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "requires": { "is-obj": "^2.0.0" } }, "dotenv": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" }, "dotenv-expand": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "duplexer3": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { "once": "^1.4.0" } }, "engine.io": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.2.tgz", "integrity": "sha512-t5z6zjXuVLhXDMiFJPYsPOWEER8B0tIsD3ETgw19S1yg9zryvUfY3Vhtk3Gf4sihw/bQGIqQ//gjvVlu+Ca0bQ==", "requires": { "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~4.0.0", "ws": "~7.4.2" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "engine.io-client": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-4.1.4.tgz", "integrity": "sha512-843fqAdKeUMFqKi1sSjnR11tJ4wi8sIefu6+JC1OzkkJBmjtc/gM/rZ53tJfu5Iae/3gApm5veoS+v+gtT0+Fg==", "requires": { "base64-arraybuffer": "0.1.4", "component-emitter": "~1.3.0", "debug": "~4.3.1", "engine.io-parser": "~4.0.1", "has-cors": "1.1.0", "parseqs": "0.0.6", "parseuri": "0.0.6", "ws": "~7.4.2", "xmlhttprequest-ssl": "~1.6.2", "yeast": "0.1.2" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "engine.io-parser": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.3.tgz", "integrity": "sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==", "requires": { "base64-arraybuffer": "0.1.4" } }, "enhanced-resolve": { "version": "5.12.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "requires": { "ansi-colors": "^4.1.1" } }, "entities": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" }, "envinfo": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==" }, "eol": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "requires": { "is-arrayish": "^0.2.1" } }, "error-stack-parser": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "requires": { "stackframe": "^1.3.4" } }, "es-abstract": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.0.tgz", "integrity": "sha512-GUGtW7eXQay0c+PRq0sGIKSdaBorfVqsCMhGHo4elP7YVqZu9nCZS4UkK4gv71gOWNMra/PaSKD3ao1oWExO0g==", "requires": { "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.0", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.4", "is-array-buffer": "^3.0.0", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.9" } }, "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, "es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "requires": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", "has-tostringtag": "^1.0.0" } }, "es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", "requires": { "has": "^1.0.3" } }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "es5-ext": { "version": "0.10.62", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", "requires": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", "next-tick": "^1.1.0" } }, "es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "requires": { "d": "1", "es5-ext": "^0.10.35", "es6-symbol": "^3.1.1" } }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "requires": { "d": "^1.0.1", "ext": "^1.1.2" } }, "es6-weak-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "requires": { "d": "1", "es5-ext": "^0.10.46", "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.1" } }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-goat": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "eslint": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "requires": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", "espree": "^7.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.1.2", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "progress": "^2.0.0", "regexpp": "^3.1.0", "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { "@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "requires": { "@babel/highlight": "^7.10.4" } }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "requires": { "eslint-visitor-keys": "^1.1.0" }, "dependencies": { "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" } } }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } }, "globals": { "version": "13.19.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "requires": { "type-fest": "^0.20.2" } }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "eslint-config-react-app": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", "requires": { "confusing-browser-globals": "^1.0.10" } }, "eslint-import-resolver-node": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "requires": { "debug": "^3.2.7", "resolve": "^1.20.0" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "eslint-module-utils": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", "requires": { "debug": "^3.2.7" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "eslint-plugin-flowtype": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.10.0.tgz", "integrity": "sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw==", "requires": { "lodash": "^4.17.15", "string-natural-compare": "^3.0.1" } }, "eslint-plugin-import": { "version": "2.26.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "requires": { "array-includes": "^3.1.4", "array.prototype.flat": "^1.2.5", "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", "eslint-module-utils": "^2.7.3", "has": "^1.0.3", "is-core-module": "^2.8.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.values": "^1.1.5", "resolve": "^1.22.0", "tsconfig-paths": "^3.14.1" }, "dependencies": { "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "requires": { "esutils": "^2.0.2" } }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } } } }, "eslint-plugin-jsx-a11y": { "version": "6.6.1", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", "requires": { "@babel/runtime": "^7.18.9", "aria-query": "^4.2.2", "array-includes": "^3.1.5", "ast-types-flow": "^0.0.7", "axe-core": "^4.4.3", "axobject-query": "^2.2.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "has": "^1.0.3", "jsx-ast-utils": "^3.3.2", "language-tags": "^1.0.5", "minimatch": "^3.1.2", "semver": "^6.3.0" }, "dependencies": { "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "eslint-plugin-react": { "version": "7.31.11", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==", "requires": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.6", "object.fromentries": "^2.0.6", "object.hasown": "^1.1.2", "object.values": "^1.1.6", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.3", "semver": "^6.3.0", "string.prototype.matchall": "^4.0.8" }, "dependencies": { "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "requires": { "esutils": "^2.0.2" } }, "resolve": { "version": "2.0.0-next.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", "requires": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "eslint-plugin-react-hooks": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "requires": {} }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "dependencies": { "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" } } }, "eslint-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "requires": { "eslint-visitor-keys": "^2.0.0" } }, "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" }, "eslint-webpack-plugin": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.7.0.tgz", "integrity": "sha512-bNaVVUvU4srexGhVcayn/F4pJAz19CWBkKoMx7aSQ4wtTbZQCnG5O9LHCE42mM+JSKOUp7n6vd5CIwzj7lOVGA==", "requires": { "@types/eslint": "^7.29.0", "arrify": "^2.0.1", "jest-worker": "^27.5.1", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "schema-utils": "^3.1.1" }, "dependencies": { "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" } }, "jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "requires": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "requires": { "has-flag": "^4.0.0" } } } }, "espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "requires": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" }, "dependencies": { "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" }, "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" } } }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "requires": { "estraverse": "^5.1.0" } }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "requires": { "estraverse": "^5.2.0" } }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", "requires": { "d": "1", "es5-ext": "~0.10.14" } }, "event-source-polyfill": { "version": "1.0.25", "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.25.tgz", "integrity": "sha512-hQxu6sN1Eq4JjoI7ITdQeGGUN193A2ra83qC0Ltm9I2UJVAten3OFVN6k5RX4YWeCS0BoC8xg/5czOCIHVosQg==" }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "requires": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==", "dev": true, "optional": true, "requires": { "is-posix-bracket": "^0.1.0" } }, "expand-range": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", "dev": true, "optional": true, "requires": { "fill-range": "^2.1.0" } }, "expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" }, "express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", "serve-static": "1.15.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { "cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" } } }, "express-graphql": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/express-graphql/-/express-graphql-0.12.0.tgz", "integrity": "sha512-DwYaJQy0amdy3pgNtiTDuGGM2BLdj+YO2SgbKoLliCfuHv3VVTt7vNG/ZqK2hRYjtYHE2t2KB705EU94mE64zg==", "requires": { "accepts": "^1.3.7", "content-type": "^1.0.4", "http-errors": "1.8.0", "raw-body": "^2.4.1" }, "dependencies": { "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" }, "http-errors": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", "requires": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" } }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" } } }, "express-http-proxy": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/express-http-proxy/-/express-http-proxy-1.6.3.tgz", "integrity": "sha512-/l77JHcOUrDUX8V67E287VEUQT0lbm71gdGVoodnlWBziarYKgMcpqT7xvh/HM8Jv52phw8Bd8tY+a7QjOr7Yg==", "requires": { "debug": "^3.0.1", "es6-promise": "^4.1.1", "raw-body": "^2.3.0" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "requires": { "type": "^2.7.2" }, "dependencies": { "type": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" } } }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "requires": { "is-extendable": "^0.1.0" } }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" }, "dependencies": { "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "requires": { "os-tmpdir": "~1.0.2" } } } }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==", "dev": true, "optional": true, "requires": { "is-extglob": "^1.0.0" } }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" }, "dependencies": { "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" } }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" } } } }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==" }, "fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "requires": { "reusify": "^1.0.4" } }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "requires": { "bser": "2.1.1" } }, "fbjs": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", "requires": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", "loose-envify": "^1.0.0", "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", "ua-parser-js": "^0.7.30" } }, "fbjs-css-vars": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" }, "fd": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/fd/-/fd-0.0.3.tgz", "integrity": "sha512-iAHrIslQb3U68OcMSP0kkNWabp7sSN6d2TBSb2JO3gcLJVDd4owr/hKM4SFJovFOUeeXeItjYgouEDTMWiVAnA==" }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "requires": { "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "requires": { "flat-cache": "^3.0.4" } }, "file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" } }, "file-type": { "version": "16.5.4", "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", "requires": { "readable-web-to-node-stream": "^3.0.0", "strtok3": "^6.2.4", "token-types": "^4.1.1" } }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true, "optional": true }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==", "dev": true, "optional": true }, "filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==" }, "filenamify": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", "requires": { "filename-reserved-regex": "^2.0.0", "strip-outer": "^1.0.1", "trim-repeated": "^1.0.0" } }, "filesize": { "version": "8.0.7", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" }, "fill-range": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "optional": true, "requires": { "is-number": "^2.1.0", "isobject": "^2.0.0", "randomatic": "^3.0.0", "repeat-element": "^1.1.2", "repeat-string": "^1.5.2" } }, "filter-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==" }, "finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" }, "dependencies": { "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { "glob": "^7.1.3" } } } }, "flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "requires": { "is-callable": "^1.1.3" } }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true, "optional": true }, "for-own": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", "dev": true, "optional": true, "requires": { "for-in": "^1.0.1" } }, "fork-ts-checker-webpack-plugin": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", "requires": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", "chalk": "^4.1.0", "chokidar": "^3.4.2", "cosmiconfig": "^6.0.0", "deepmerge": "^4.2.2", "fs-extra": "^9.0.0", "glob": "^7.1.6", "memfs": "^3.1.2", "minimatch": "^3.0.4", "schema-utils": "2.7.0", "semver": "^7.3.2", "tapable": "^1.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" } }, "cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.7.2" } }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" } }, "fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "requires": { "binary-extensions": "^2.0.0" } }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" } }, "schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "requires": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", "ajv-keywords": "^3.4.1" } }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", "dev": true, "optional": true, "requires": { "map-cache": "^0.2.2" } }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "fs-exists-cached": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", "integrity": "sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==" }, "fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" }, "fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, "optional": true, "requires": { "bindings": "^1.5.0", "nan": "^2.12.1" } }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function.prototype.name": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.0", "functions-have-names": "^1.2.2" } }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, "gatsby": { "version": "4.25.2", "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-4.25.2.tgz", "integrity": "sha512-HKSWRdTOK5IBFDDgCKiPXiyszfdTTGZ+pple6My6dQ5a5U+Gn1PpjBIiYj4Me9WJAveQzC7tChsqBVVt7r6few==", "requires": { "@babel/code-frame": "^7.14.0", "@babel/core": "^7.15.5", "@babel/eslint-parser": "^7.15.4", "@babel/helper-plugin-utils": "^7.14.5", "@babel/parser": "^7.15.5", "@babel/runtime": "^7.15.4", "@babel/traverse": "^7.15.4", "@babel/types": "^7.15.4", "@builder.io/partytown": "^0.5.2", "@gatsbyjs/reach-router": "^1.3.9", "@gatsbyjs/webpack-hot-middleware": "^2.25.2", "@graphql-codegen/add": "^3.1.1", "@graphql-codegen/core": "^2.5.1", "@graphql-codegen/plugin-helpers": "^2.4.2", "@graphql-codegen/typescript": "^2.4.8", "@graphql-codegen/typescript-operations": "^2.3.5", "@graphql-tools/code-file-loader": "^7.2.14", "@graphql-tools/load": "^7.5.10", "@jridgewell/trace-mapping": "^0.3.13", "@nodelib/fs.walk": "^1.2.8", "@parcel/cache": "2.6.2", "@parcel/core": "2.6.2", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", "@types/http-proxy": "^1.17.7", "@typescript-eslint/eslint-plugin": "^4.33.0", "@typescript-eslint/parser": "^4.33.0", "@vercel/webpack-asset-relocator-loader": "^1.7.0", "acorn-loose": "^8.3.0", "acorn-walk": "^8.2.0", "address": "1.1.2", "anser": "^2.1.0", "autoprefixer": "^10.4.0", "axios": "^0.21.1", "babel-loader": "^8.2.3", "babel-plugin-add-module-exports": "^1.0.4", "babel-plugin-dynamic-import-node": "^2.3.3", "babel-plugin-lodash": "^3.3.4", "babel-plugin-remove-graphql-queries": "^4.25.0", "babel-preset-gatsby": "^2.25.0", "better-opn": "^2.1.1", "bluebird": "^3.7.2", "browserslist": "^4.17.5", "cache-manager": "^2.11.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", "common-tags": "^1.8.0", "compression": "^1.7.4", "cookie": "^0.4.1", "core-js": "^3.22.3", "cors": "^2.8.5", "css-loader": "^5.2.7", "css-minimizer-webpack-plugin": "^2.0.0", "css.escape": "^1.5.1", "date-fns": "^2.25.0", "debug": "^3.2.7", "deepmerge": "^4.2.2", "detect-port": "^1.3.0", "devcert": "^1.2.0", "dotenv": "^8.6.0", "enhanced-resolve": "^5.8.3", "error-stack-parser": "^2.1.4", "eslint": "^7.32.0", "eslint-config-react-app": "^6.0.0", "eslint-plugin-flowtype": "^5.10.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.6.1", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", "eslint-webpack-plugin": "^2.7.0", "event-source-polyfill": "1.0.25", "execa": "^5.1.1", "express": "^4.17.1", "express-graphql": "^0.12.0", "express-http-proxy": "^1.6.3", "fastest-levenshtein": "^1.0.12", "fastq": "^1.13.0", "file-loader": "^6.2.0", "find-cache-dir": "^3.3.2", "fs-exists-cached": "1.0.0", "fs-extra": "^10.1.0", "gatsby-cli": "^4.25.0", "gatsby-core-utils": "^3.25.0", "gatsby-graphiql-explorer": "^2.25.0", "gatsby-legacy-polyfills": "^2.25.0", "gatsby-link": "^4.25.0", "gatsby-page-utils": "^2.25.0", "gatsby-parcel-config": "0.16.0", "gatsby-plugin-page-creator": "^4.25.0", "gatsby-plugin-typescript": "^4.25.0", "gatsby-plugin-utils": "^3.19.0", "gatsby-react-router-scroll": "^5.25.0", "gatsby-script": "^1.10.0", "gatsby-sharp": "^0.19.0", "gatsby-telemetry": "^3.25.0", "gatsby-worker": "^1.25.0", "glob": "^7.2.3", "globby": "^11.1.0", "got": "^11.8.5", "graphql": "^15.7.2", "graphql-compose": "^9.0.7", "graphql-playground-middleware-express": "^1.7.22", "graphql-tag": "^2.12.6", "hasha": "^5.2.2", "invariant": "^2.2.4", "is-relative": "^1.0.0", "is-relative-url": "^3.0.0", "joi": "^17.4.2", "json-loader": "^0.5.7", "latest-version": "5.1.0", "lmdb": "2.5.3", "lodash": "^4.17.21", "md5-file": "^5.0.0", "meant": "^1.0.3", "memoizee": "^0.4.15", "micromatch": "^4.0.4", "mime": "^2.5.2", "mini-css-extract-plugin": "1.6.2", "mitt": "^1.2.0", "moment": "^2.29.1", "multer": "^1.4.5-lts.1", "node-fetch": "^2.6.6", "node-html-parser": "^5.3.3", "normalize-path": "^3.0.0", "null-loader": "^4.0.1", "opentracing": "^0.14.5", "p-defer": "^3.0.0", "parseurl": "^1.3.3", "physical-cpu-count": "^2.0.0", "platform": "^1.3.6", "postcss": "^8.3.11", "postcss-flexbugs-fixes": "^5.0.2", "postcss-loader": "^5.3.0", "prompts": "^2.4.2", "prop-types": "^15.7.2", "query-string": "^6.14.1", "raw-loader": "^4.0.2", "react-dev-utils": "^12.0.1", "react-refresh": "^0.14.0", "react-server-dom-webpack": "0.0.0-experimental-c8b778b7f-20220825", "redux": "4.1.2", "redux-thunk": "^2.4.0", "resolve-from": "^5.0.0", "semver": "^7.3.7", "shallow-compare": "^1.2.2", "signal-exit": "^3.0.5", "slugify": "^1.6.1", "socket.io": "3.1.2", "socket.io-client": "3.1.3", "st": "^2.0.0", "stack-trace": "^0.0.10", "string-similarity": "^1.2.2", "strip-ansi": "^6.0.1", "style-loader": "^2.0.0", "terser-webpack-plugin": "^5.2.4", "tmp": "^0.2.1", "true-case-path": "^2.2.1", "type-of": "^2.0.1", "url-loader": "^4.1.1", "uuid": "^8.3.2", "webpack": "^5.61.0", "webpack-dev-middleware": "^4.3.0", "webpack-merge": "^5.8.0", "webpack-stats-plugin": "^1.0.3", "webpack-virtual-modules": "^0.3.2", "xstate": "4.32.1", "yaml-loader": "^0.8.0" }, "dependencies": { "acorn": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "babel-preset-gatsby": { "version": "2.25.0", "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-2.25.0.tgz", "integrity": "sha512-KFfSTDAkY87/Myq1KIUk9cVphWZem/08U7ps9Hiotbo6Mge/lL6ggh3xKP9SdR5Le4DLLyIUI7a4ILrAVacYDg==", "requires": { "@babel/plugin-proposal-class-properties": "^7.14.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", "@babel/plugin-proposal-optional-chaining": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-transform-classes": "^7.15.4", "@babel/plugin-transform-runtime": "^7.15.0", "@babel/plugin-transform-spread": "^7.14.6", "@babel/preset-env": "^7.15.4", "@babel/preset-react": "^7.14.0", "@babel/runtime": "^7.15.4", "babel-plugin-dynamic-import-node": "^2.3.3", "babel-plugin-macros": "^3.1.0", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", "gatsby-core-utils": "^3.25.0", "gatsby-legacy-polyfills": "^2.25.0" } }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" } }, "core-js": { "version": "3.27.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz", "integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==" }, "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" } }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "requires": { "binary-extensions": "^2.0.0" } }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "react-server-dom-webpack": { "version": "0.0.0-experimental-c8b778b7f-20220825", "resolved": "https://registry.npmjs.org/react-server-dom-webpack/-/react-server-dom-webpack-0.0.0-experimental-c8b778b7f-20220825.tgz", "integrity": "sha512-JyCjbp6ZvkH/T0EuVPdceYlC8u5WqWDSJr2KxDvc81H2eJ+7zYUN++IcEycnR2F+HmER8QVgxfotnIx352zi+w==", "requires": { "acorn": "^6.2.1", "loose-envify": "^1.1.0", "neo-async": "^2.6.1" } }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" } }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "gatsby-cli": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-4.25.0.tgz", "integrity": "sha512-CJ2PCsfFmn9Xqc/jg9MFMU1BG5oQGiej1TFFx8GhChJ+kGhi9ANnNM+qo1K4vOmoMnsT4SSGiPAFD10AWFqpAQ==", "requires": { "@babel/code-frame": "^7.14.0", "@babel/core": "^7.15.5", "@babel/generator": "^7.16.8", "@babel/helper-plugin-utils": "^7.16.7", "@babel/preset-typescript": "^7.16.7", "@babel/runtime": "^7.15.4", "@babel/template": "^7.16.7", "@babel/types": "^7.16.8", "@jridgewell/trace-mapping": "^0.3.13", "@types/common-tags": "^1.8.1", "better-opn": "^2.1.1", "boxen": "^5.1.2", "chalk": "^4.1.2", "clipboardy": "^2.3.0", "common-tags": "^1.8.2", "convert-hrtime": "^3.0.0", "create-gatsby": "^2.25.0", "envinfo": "^7.8.1", "execa": "^5.1.1", "fs-exists-cached": "^1.0.0", "fs-extra": "^10.1.0", "gatsby-core-utils": "^3.25.0", "gatsby-telemetry": "^3.25.0", "hosted-git-info": "^3.0.8", "is-valid-path": "^0.1.1", "joi": "^17.4.2", "lodash": "^4.17.21", "node-fetch": "^2.6.6", "opentracing": "^0.14.5", "pretty-error": "^2.1.2", "progress": "^2.0.3", "prompts": "^2.4.2", "redux": "4.1.2", "resolve-cwd": "^3.0.0", "semver": "^7.3.7", "signal-exit": "^3.0.6", "stack-trace": "^0.0.10", "strip-ansi": "^6.0.1", "update-notifier": "^5.1.0", "yargs": "^15.4.1", "yoga-layout-prebuilt": "^1.10.0", "yurnalist": "^2.1.0" }, "dependencies": { "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "gatsby-core-utils": { "version": "3.25.0", "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-3.25.0.tgz", "integrity": "sha512-lmMDwbnKpqAi+8WWd7MvCTCx3E0u7j8sbVgydERNCYVxKVpzD/aLCH4WPb4EE9m1H1rSm76w0Z+MaentyB/c/Q==", "requires": { "@babel/runtime": "^7.15.4", "ci-info": "2.0.0", "configstore": "^5.0.1", "fastq": "^1.13.0", "file-type": "^16.5.3", "fs-extra": "^10.1.0", "got": "^11.8.5", "import-from": "^4.0.0", "lmdb": "2.5.3", "lock": "^1.1.0", "node-object-hash": "^2.3.10", "proper-lockfile": "^4.1.2", "resolve-from": "^5.0.0", "tmp": "^0.2.1", "xdg-basedir": "^4.0.0" } }, "gatsby-graphiql-explorer": { "version": "2.25.0", "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-2.25.0.tgz", "integrity": "sha512-/NDsaW4x3/KtvzmxYvedhDwUW1kb7gQO6iOhCkillVJSYBd6mPB8aOSulM49fyCT76UXGYFtRaUI8fyOkmpWhg==", "requires": { "@babel/runtime": "^7.15.4" } }, "gatsby-image": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/gatsby-image/-/gatsby-image-2.11.0.tgz", "integrity": "sha512-H1va64RgXizYXONhoqB3rAdSqALZi0hkBYqEsc0peVEYzb2maRhEwOchg65hKvp3HT/ahnfrik59epRguYvi/g==", "requires": { "@babel/runtime": "^7.12.5", "object-fit-images": "^3.2.4", "prop-types": "^15.7.2" } }, "gatsby-legacy-polyfills": { "version": "2.25.0", "resolved": "https://registry.npmjs.org/gatsby-legacy-polyfills/-/gatsby-legacy-polyfills-2.25.0.tgz", "integrity": "sha512-cMeFwMH1FGENo2gNpyTyMYc/CJ7uBGE26n89OGrVVvBMaQegK+CMNZBOh09sLrXUcOp8hSOX2IwzvOlo6CdWpg==", "requires": { "@babel/runtime": "^7.15.4", "core-js-compat": "3.9.0" } }, "gatsby-link": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-4.25.0.tgz", "integrity": "sha512-Fpwk45sUMPvFUAZehNE8SLb3vQyVSxt9YxU++ZZECyukK4A/3Wxk3eIzoNvwfpMfWu6pnAkqcBhIO6KAfvbPGQ==", "requires": { "@types/reach__router": "^1.3.10", "gatsby-page-utils": "^2.25.0", "prop-types": "^15.8.1" } }, "gatsby-page-utils": { "version": "2.25.0", "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-2.25.0.tgz", "integrity": "sha512-TlwS149JCeb3xGANeV8HdcQi9Q8J9hYwlO9jdxLGVIXVGbWIMWFrDuwx382jOOsISGQ3jfByToNulUzO6fiqig==", "requires": { "@babel/runtime": "^7.15.4", "bluebird": "^3.7.2", "chokidar": "^3.5.3", "fs-exists-cached": "^1.0.0", "gatsby-core-utils": "^3.25.0", "glob": "^7.2.3", "lodash": "^4.17.21", "micromatch": "^4.0.5" }, "dependencies": { "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" } }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" } }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "requires": { "binary-extensions": "^2.0.0" } }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" } } } }, "gatsby-parcel-config": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/gatsby-parcel-config/-/gatsby-parcel-config-0.16.0.tgz", "integrity": "sha512-2+hOg6cMBGZ8r+4lN3k+dOWGvku453vbZCAhp6V3RuFYxbWuvDFP7Icr0GCOyZ62utkFr9m7H2U1Wjf4KOHyEQ==", "requires": { "@gatsbyjs/parcel-namer-relative-to-cwd": "^1.10.0", "@parcel/bundler-default": "2.6.2", "@parcel/compressor-raw": "2.6.2", "@parcel/namer-default": "2.6.2", "@parcel/optimizer-terser": "2.6.2", "@parcel/packager-js": "2.6.2", "@parcel/packager-raw": "2.6.2", "@parcel/reporter-dev-server": "2.6.2", "@parcel/resolver-default": "2.6.2", "@parcel/runtime-js": "2.6.2", "@parcel/transformer-js": "2.6.2", "@parcel/transformer-json": "2.6.2" } }, "gatsby-plugin-google-analytics": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-google-analytics/-/gatsby-plugin-google-analytics-4.25.0.tgz", "integrity": "sha512-fbHrViBAbJ0Ch2gcpuJQlGxWoapaNed42k75eR4gCiZPzaTUvCKagJgLG8ro8ukD1rfD594lgLzdSEaYYcH4WQ==", "requires": { "@babel/runtime": "^7.15.4", "minimatch": "3.0.4", "web-vitals": "^1.1.2" }, "dependencies": { "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" } } } }, "gatsby-plugin-manifest": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-manifest/-/gatsby-plugin-manifest-4.25.0.tgz", "integrity": "sha512-2n7v+TvhWUMoOJEaeiPDFsf9jvOImKLZpnzxE8e6ZeeoGeDngXSZhkkP3x2UYIknHtZXUUjFJh8BaVBXiB1dSQ==", "requires": { "@babel/runtime": "^7.15.4", "gatsby-core-utils": "^3.25.0", "gatsby-plugin-utils": "^3.19.0", "semver": "^7.3.7", "sharp": "^0.30.7" }, "dependencies": { "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "gatsby-plugin-offline": { "version": "5.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-offline/-/gatsby-plugin-offline-5.25.0.tgz", "integrity": "sha512-WqAcnYvMpL1xwXF5Jf9BXTihLNktuqQHFUX0TPsQVJrmfjSNv4LxhgiWfeUuGiCO881EOHClXnBn6TqxIdS4EA==", "requires": { "@babel/runtime": "^7.15.4", "cheerio": "^1.0.0-rc.10", "gatsby-core-utils": "^3.25.0", "glob": "^7.2.3", "idb-keyval": "^3.2.0", "lodash": "^4.17.21", "workbox-build": "^4.3.1" } }, "gatsby-plugin-page-creator": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-4.25.0.tgz", "integrity": "sha512-plHek7xHSV9l1bLPa1JAnxzBqP7j2ihCPRwpBk/wIJAR8cG65wjAT+Nu8DKpW0+2/MYill84ns1r2m8g0L/7bg==", "requires": { "@babel/runtime": "^7.15.4", "@babel/traverse": "^7.15.4", "@sindresorhus/slugify": "^1.1.2", "chokidar": "^3.5.3", "fs-exists-cached": "^1.0.0", "fs-extra": "^10.1.0", "gatsby-core-utils": "^3.25.0", "gatsby-page-utils": "^2.25.0", "gatsby-plugin-utils": "^3.19.0", "gatsby-telemetry": "^3.25.0", "globby": "^11.1.0", "lodash": "^4.17.21" }, "dependencies": { "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" } }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" } }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "requires": { "binary-extensions": "^2.0.0" } }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" } } } }, "gatsby-plugin-plausible": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/gatsby-plugin-plausible/-/gatsby-plugin-plausible-0.0.7.tgz", "integrity": "sha512-pWCXsrWal8lWMmZ1wJ2dolbwZZR1CZU1LVR/K1rYC8NeA+uqTLY8h3uH3hFgP5n8jmRRenOSJ9SjWM9OIdCjOA==", "requires": { "@babel/runtime": "^7.9.2", "minimatch": "3.0.4", "react": "^16.13.1" }, "dependencies": { "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" } } } }, "gatsby-plugin-react-helmet": { "version": "5.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-5.25.0.tgz", "integrity": "sha512-sU/xae/sGuYFcFDpqUxwXnaOmx8xrU2Q+XSULqAapji0uTBhW6al6CJsaPFigi8IOG2bQX8ano2iWWcGF3/GHw==", "requires": { "@babel/runtime": "^7.15.4" } }, "gatsby-plugin-react-svg": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-react-svg/-/gatsby-plugin-react-svg-3.3.0.tgz", "integrity": "sha512-kFPElMFu1QCkiFCm1pSrVkOHAeafU6wkD0qCVPs7nL/Txh5KFh0aOO6Feiwvfre1Jo+Eg3lwCuGmgsy9L+4pDg==", "requires": { "svg-react-loader": "^0.4.6" } }, "gatsby-plugin-remove-trailing-slashes": { "version": "4.19.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-remove-trailing-slashes/-/gatsby-plugin-remove-trailing-slashes-4.19.0.tgz", "integrity": "sha512-3zyL+6pqQIeAvABi3PbtVi285n9CVCopzLZNiCLN81/xPiCggA1yyNaZVV3eS1ZbOVFlWCAFyEBRl6E6QeI2BQ==", "requires": { "@babel/runtime": "^7.15.4" } }, "gatsby-plugin-sass": { "version": "5.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-sass/-/gatsby-plugin-sass-5.25.0.tgz", "integrity": "sha512-e+47Z24DI+Uh3KcUbj/WvTyH4ZPXcC4zlwqhzspv1Ye+xMS1ipTsIelvBuTwiiEWBs6cqdcYAPhn7HoXX/errw==", "requires": { "@babel/runtime": "^7.15.4", "resolve-url-loader": "^3.1.4", "sass-loader": "^10.1.1" } }, "gatsby-plugin-sass-resources": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/gatsby-plugin-sass-resources/-/gatsby-plugin-sass-resources-3.0.1.tgz", "integrity": "sha512-C332NqMOd6z0q7F02OmL/Bl7BoJyD73vcfpF22M+qVy3TE9ugL94Pcdpki8s5TUSwJgqgs9qkTuLD+jDphMsWw==", "requires": { "@babel/runtime": "^7.0.0", "sass-resources-loader": "^1.3.3", "webpack": "^5.0.0" } }, "gatsby-plugin-sharp": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-sharp/-/gatsby-plugin-sharp-4.25.0.tgz", "integrity": "sha512-8XiSKibQyp6pOFHEkEdRCpoDA3Ywcq5PKftNMExZ51MormT0+WqRC7ynuU+0fzktDTbbSyREvblKa+21Id+rRA==", "requires": { "@babel/runtime": "^7.15.4", "async": "^3.2.4", "bluebird": "^3.7.2", "debug": "^4.3.4", "filenamify": "^4.3.0", "fs-extra": "^10.1.0", "gatsby-core-utils": "^3.25.0", "gatsby-plugin-utils": "^3.19.0", "lodash": "^4.17.21", "probe-image-size": "^7.2.3", "semver": "^7.3.7", "sharp": "^0.30.7" }, "dependencies": { "async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "gatsby-plugin-sitemap": { "version": "5.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-sitemap/-/gatsby-plugin-sitemap-5.25.0.tgz", "integrity": "sha512-0MYinO0MTsOIEd7d2NOCm/JVdFIMgoIEFem/S0gMpuW4rBCpsE6McPmRKGZl2bp277jEhU8ACt4/49nsCA1AoA==", "requires": { "@babel/runtime": "^7.15.4", "common-tags": "^1.8.2", "minimatch": "^3.1.2", "sitemap": "^7.0.0" } }, "gatsby-plugin-typescript": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-4.25.0.tgz", "integrity": "sha512-8BTtiVWuIqIEGx/PBBMWd6FYPgel16hT3js7SMo5oI9K4EPsSxRItgRf41MTJGxRR20EhL4e99g2S8x0v1+odA==", "requires": { "@babel/core": "^7.15.5", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", "@babel/plugin-proposal-numeric-separator": "^7.14.5", "@babel/plugin-proposal-optional-chaining": "^7.14.5", "@babel/preset-typescript": "^7.15.0", "@babel/runtime": "^7.15.4", "babel-plugin-remove-graphql-queries": "^4.25.0" } }, "gatsby-plugin-utils": { "version": "3.19.0", "resolved": "https://registry.npmjs.org/gatsby-plugin-utils/-/gatsby-plugin-utils-3.19.0.tgz", "integrity": "sha512-EZtvgHSU5NPbEn6a4cfSpEGCQ09SfwbhoybHTJKj1clop86HSwOCV2iH8RbCc+X6jbdgHaSZsfsl7zG1h7DBUw==", "requires": { "@babel/runtime": "^7.15.4", "fastq": "^1.13.0", "fs-extra": "^10.1.0", "gatsby-core-utils": "^3.25.0", "gatsby-sharp": "^0.19.0", "graphql-compose": "^9.0.7", "import-from": "^4.0.0", "joi": "^17.4.2", "mime": "^3.0.0" }, "dependencies": { "mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" } } }, "gatsby-react-router-scroll": { "version": "5.25.0", "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-5.25.0.tgz", "integrity": "sha512-SFSdezIa5lahCE8ieCLrtLA5tztemGco/rN8si9rI9KHu1h1jPvDhsNqs2g+Z50JrUb1RPfsmxJTmLa5i6MIgQ==", "requires": { "@babel/runtime": "^7.15.4", "prop-types": "^15.8.1" } }, "gatsby-remark-copy-linked-files": { "version": "5.25.0", "resolved": "https://registry.npmjs.org/gatsby-remark-copy-linked-files/-/gatsby-remark-copy-linked-files-5.25.0.tgz", "integrity": "sha512-kF068dZ0U920xNrlKM5BIR1MvgFdVvgR281AJfvn1xOvv/ES3elPj2bqlokbcs1f72dYcNnaJhv3UhYoIdV6Fg==", "requires": { "@babel/runtime": "^7.15.4", "cheerio": "^1.0.0-rc.10", "fs-extra": "^10.1.0", "is-relative-url": "^3.0.0", "lodash": "^4.17.21", "path-is-inside": "^1.0.2", "probe-image-size": "^7.2.3", "unist-util-visit": "^2.0.3" }, "dependencies": { "unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" } } } }, "gatsby-remark-images": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/gatsby-remark-images/-/gatsby-remark-images-6.25.0.tgz", "integrity": "sha512-NNJ17OxA8xPFtTHBfWCxAGqU9ciOielWALUlzY1YdCvYl2rcDmw498tjx77wC995yCBkcwe7yfL1tgky9bxdqQ==", "requires": { "@babel/runtime": "^7.15.4", "chalk": "^4.1.2", "cheerio": "^1.0.0-rc.10", "gatsby-core-utils": "^3.25.0", "is-relative-url": "^3.0.0", "lodash": "^4.17.21", "mdast-util-definitions": "^4.0.0", "query-string": "^6.14.1", "unist-util-select": "^3.0.4", "unist-util-visit-parents": "^3.1.1" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } } } }, "gatsby-remark-prismjs": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/gatsby-remark-prismjs/-/gatsby-remark-prismjs-6.25.0.tgz", "integrity": "sha512-O33q0aQjl3X8nVEFboQ0RKtnHLhhb0BU+ErK0D9MA6w4qSDRmDjFIWDY7nrsBP5QR80V1sjbjr4zBAAdOre/dA==", "requires": { "@babel/runtime": "^7.15.4", "parse-numeric-range": "^1.2.0", "unist-util-visit": "^2.0.3" }, "dependencies": { "parse-numeric-range": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" } } } }, "gatsby-remark-smartypants": { "version": "5.25.0", "resolved": "https://registry.npmjs.org/gatsby-remark-smartypants/-/gatsby-remark-smartypants-5.25.0.tgz", "integrity": "sha512-HTcDlQkYQ3regRvQYBuGSCTWE6d4l277yGNYOq89yxkn0CSra/FfplLWUakvFrPLQQaQwpXewhUPXSWkp/PTZg==", "requires": { "@babel/runtime": "^7.15.4", "retext": "^7.0.1", "retext-smartypants": "^4.0.0", "unist-util-visit": "^2.0.3" }, "dependencies": { "unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" } } } }, "gatsby-remark-unwrap-images": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/gatsby-remark-unwrap-images/-/gatsby-remark-unwrap-images-1.0.2.tgz", "integrity": "sha512-kOatDaz6EcYJn6oEx97pim0JkzuN1epacmHuKP9kL7r3+y1dzvNQjrJMtmDZTqC6Q8LhXD2rrFhsYS3SerTHhw==", "requires": { "unist-util-remove": "^1.0.1", "unist-util-visit": "^1.4.0" } }, "gatsby-script": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/gatsby-script/-/gatsby-script-1.10.0.tgz", "integrity": "sha512-8jAtQR0mw3G8sCy6i2D1jfGvUF5d9AIboEQuo9ZEChT4Ep5f+PSRxiWZqSjhKvintAOIeS4QXCJP5Rtp3xZKLg==", "requires": {} }, "gatsby-sharp": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/gatsby-sharp/-/gatsby-sharp-0.19.0.tgz", "integrity": "sha512-EbI3RNBu2+aaxuMUP/INmoj8vcNAG6BgpFvi1tLeU7/gVTNVQ+7pC/ZYtlVCzSw+faaw7r1ZBMi6F66mNIIz5A==", "requires": { "@types/sharp": "^0.30.5", "sharp": "^0.30.7" } }, "gatsby-source-filesystem": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-4.25.0.tgz", "integrity": "sha512-gja4++bPkYpnum4/TxFicr3zRHBArnM2HjT77EE4EuDhdl6qlJYr/heD09LIPN2jdR5gmPwMDjIZnuYZ/6j/aQ==", "requires": { "@babel/runtime": "^7.15.4", "chokidar": "^3.5.3", "file-type": "^16.5.4", "fs-extra": "^10.1.0", "gatsby-core-utils": "^3.25.0", "md5-file": "^5.0.0", "mime": "^2.5.2", "pretty-bytes": "^5.4.1", "valid-url": "^1.0.9", "xstate": "4.32.1" }, "dependencies": { "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" } }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" } }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "requires": { "binary-extensions": "^2.0.0" } }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" } } } }, "gatsby-telemetry": { "version": "3.25.0", "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-3.25.0.tgz", "integrity": "sha512-FGC1yS2evJxTN/Ku9XonCBiqhH6uO6aPjjps65BbL+Xbpct/qfirIFxYG6DhHPrksR0fKOhstJGnQqay74hWdQ==", "requires": { "@babel/code-frame": "^7.14.0", "@babel/runtime": "^7.15.4", "@turist/fetch": "^7.2.0", "@turist/time": "^0.0.2", "boxen": "^4.2.0", "configstore": "^5.0.1", "fs-extra": "^10.1.0", "gatsby-core-utils": "^3.25.0", "git-up": "^7.0.0", "is-docker": "^2.2.1", "lodash": "^4.17.21", "node-fetch": "^2.6.7" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "boxen": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", "requires": { "ansi-align": "^3.0.0", "camelcase": "^5.3.1", "chalk": "^3.0.0", "cli-boxes": "^2.2.0", "string-width": "^4.1.0", "term-size": "^2.1.0", "type-fest": "^0.8.1", "widest-line": "^3.1.0" } }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" } } }, "gatsby-transformer-remark": { "version": "5.25.1", "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-5.25.1.tgz", "integrity": "sha512-6k3uOnZYsJSgmZIWq9Y+Cqb6pysusCUBYpQY1+V9ofpSRbrZGGfuoCeFKd27x/c0jI5jneuL3NXnxwn/JJK1Ig==", "requires": { "@babel/runtime": "^7.15.4", "gatsby-core-utils": "^3.25.0", "gray-matter": "^4.0.3", "hast-util-raw": "^6.0.2", "hast-util-to-html": "^7.1.3", "lodash": "^4.17.21", "mdast-util-to-hast": "^10.2.0", "mdast-util-to-string": "^2.0.0", "mdast-util-toc": "^5.1.0", "remark": "^13.0.0", "remark-footnotes": "^3.0.0", "remark-gfm": "^1.0.0", "remark-parse": "^9.0.0", "remark-retext": "^4.0.0", "remark-stringify": "^9.0.1", "retext-english": "^3.0.4", "sanitize-html": "^1.27.5", "underscore.string": "^3.3.6", "unified": "^9.2.2", "unist-util-remove-position": "^3.0.0", "unist-util-select": "^3.0.4", "unist-util-visit": "^2.0.3" }, "dependencies": { "unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" } } } }, "gatsby-transformer-sharp": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/gatsby-transformer-sharp/-/gatsby-transformer-sharp-4.25.0.tgz", "integrity": "sha512-7aqecTvOUFiNB96ij77UnAGJs7Un0TlkpamG//dSl6Nru9EylGz/NW/Eg0vioQyHLCYdMvd5xO8V3BOHJADsnw==", "requires": { "@babel/runtime": "^7.15.4", "bluebird": "^3.7.2", "common-tags": "^1.8.2", "fs-extra": "^10.1.0", "gatsby-plugin-utils": "^3.19.0", "probe-image-size": "^7.2.3", "semver": "^7.3.7", "sharp": "^0.30.7" }, "dependencies": { "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "gatsby-worker": { "version": "1.25.0", "resolved": "https://registry.npmjs.org/gatsby-worker/-/gatsby-worker-1.25.0.tgz", "integrity": "sha512-gjp28irgHASihwvMyF5aZMALWGax9mEmcD8VYGo2osRe7p6BZuWi4cSuP9XM9EvytDvIugpnSadmTP01B7LtWg==", "requires": { "@babel/core": "^7.15.5", "@babel/runtime": "^7.15.4" } }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.3" } }, "get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, "get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" }, "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" } }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", "dev": true, "optional": true }, "git-up": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "requires": { "is-ssh": "^1.4.0", "parse-url": "^8.1.0" } }, "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" }, "github-slugger": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-base": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==", "dev": true, "optional": true, "requires": { "glob-parent": "^2.0.0", "is-glob": "^2.0.0" } }, "glob-parent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==", "dev": true, "optional": true, "requires": { "is-glob": "^2.0.0" } }, "glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "global-dirs": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "requires": { "ini": "2.0.0" }, "dependencies": { "ini": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" } } }, "global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "requires": { "global-prefix": "^3.0.0" } }, "global-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "requires": { "ini": "^1.3.5", "kind-of": "^6.0.2", "which": "^1.3.1" }, "dependencies": { "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { "isexe": "^2.0.0" } } } }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, "globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "requires": { "define-properties": "^1.1.3" } }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" }, "dependencies": { "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" } } }, "gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "requires": { "get-intrinsic": "^1.1.3" } }, "got": { "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "requires": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" } }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "graphql": { "version": "15.8.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==" }, "graphql-compose": { "version": "9.0.10", "resolved": "https://registry.npmjs.org/graphql-compose/-/graphql-compose-9.0.10.tgz", "integrity": "sha512-UsVoxfi2+c8WbHl2pEB+teoRRZoY4mbWBoijeLDGpAZBSPChnqtSRjp+T9UcouLCwGr5ooNyOQLoI3OVzU1bPQ==", "requires": { "graphql-type-json": "0.3.2" } }, "graphql-playground-html": { "version": "1.6.30", "resolved": "https://registry.npmjs.org/graphql-playground-html/-/graphql-playground-html-1.6.30.tgz", "integrity": "sha512-tpCujhsJMva4aqE8ULnF7/l3xw4sNRZcSHu+R00VV+W0mfp+Q20Plvcrp+5UXD+2yS6oyCXncA+zoQJQqhGCEw==", "requires": { "xss": "^1.0.6" } }, "graphql-playground-middleware-express": { "version": "1.7.23", "resolved": "https://registry.npmjs.org/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.23.tgz", "integrity": "sha512-M/zbTyC1rkgiQjFSgmzAv6umMHOphYLNWZp6Ye5QrD77WfGOOoSqDsVmGUczc2pDkEPEzzGB/bvBO5rdzaTRgw==", "requires": { "graphql-playground-html": "^1.6.30" } }, "graphql-tag": { "version": "2.12.6", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", "requires": { "tslib": "^2.1.0" } }, "graphql-type-json": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.3.2.tgz", "integrity": "sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg==", "requires": {} }, "gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", "requires": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "requires": { "duplexer": "^0.1.2" } }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { "function-bind": "^1.1.1" } }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "requires": { "ansi-regex": "^2.0.0" } }, "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" }, "has-cors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==" }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "requires": { "get-intrinsic": "^1.1.1" } }, "has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "requires": { "has-symbols": "^1.0.2" } }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", "dev": true, "optional": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" }, "dependencies": { "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true } } }, "has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", "dev": true, "optional": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" }, "dependencies": { "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "optional": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" }, "hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "requires": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" }, "dependencies": { "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" } } }, "hast-to-hyperscript": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", "requires": { "@types/unist": "^2.0.3", "comma-separated-tokens": "^1.0.0", "property-information": "^5.3.0", "space-separated-tokens": "^1.0.0", "style-to-object": "^0.3.0", "unist-util-is": "^4.0.0", "web-namespaces": "^1.0.0" } }, "hast-util-from-parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", "requires": { "@types/parse5": "^5.0.0", "hastscript": "^6.0.0", "property-information": "^5.0.0", "vfile": "^4.0.0", "vfile-location": "^3.2.0", "web-namespaces": "^1.0.0" } }, "hast-util-is-element": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==" }, "hast-util-parse-selector": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" }, "hast-util-raw": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.1.0.tgz", "integrity": "sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==", "requires": { "@types/hast": "^2.0.0", "hast-util-from-parse5": "^6.0.0", "hast-util-to-parse5": "^6.0.0", "html-void-elements": "^1.0.0", "parse5": "^6.0.0", "unist-util-position": "^3.0.0", "unist-util-visit": "^2.0.0", "vfile": "^4.0.0", "web-namespaces": "^1.0.0", "xtend": "^4.0.0", "zwitch": "^1.0.0" }, "dependencies": { "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, "unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" } } } }, "hast-util-sanitize": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-1.3.1.tgz", "integrity": "sha512-AIeKHuHx0Wk45nSkGVa2/ujQYTksnDl8gmmKo/mwQi7ag7IBZ8cM3nJ2G86SajbjGP/HRpud6kMkPtcM2i0Tlw==", "requires": { "xtend": "^4.0.1" } }, "hast-util-to-html": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz", "integrity": "sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw==", "requires": { "ccount": "^1.0.0", "comma-separated-tokens": "^1.0.0", "hast-util-is-element": "^1.0.0", "hast-util-whitespace": "^1.0.0", "html-void-elements": "^1.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0", "stringify-entities": "^3.0.1", "unist-util-is": "^4.0.0", "xtend": "^4.0.0" } }, "hast-util-to-parse5": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", "requires": { "hast-to-hyperscript": "^9.0.0", "property-information": "^5.0.0", "web-namespaces": "^1.0.0", "xtend": "^4.0.0", "zwitch": "^1.0.0" } }, "hast-util-whitespace": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==" }, "hastscript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", "requires": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", "hast-util-parse-selector": "^2.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0" } }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", "requires": { "capital-case": "^1.0.4", "tslib": "^2.0.3" } }, "hoist-non-react-statics": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==", "dev": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.1" } }, "hosted-git-info": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", "requires": { "lru-cache": "^6.0.0" }, "dependencies": { "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "html-entities": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" }, "html-to-react": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.5.0.tgz", "integrity": "sha512-tjihXBgaJZRRYzmkrJZ/Qf9jFayilFYcb+sJxXXE2BVLk2XsNrGeuNCVvhXmvREULZb9dz6NFTBC96DTR/lQCQ==", "requires": { "domhandler": "^5.0", "htmlparser2": "^8.0", "lodash.camelcase": "^4.3.0" } }, "html-void-elements": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" }, "htmlparser2": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", "requires": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "entities": "^4.3.0" } }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "http2-wrapper": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "requires": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" } }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, "hyphenate-style-name": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "requires": {} }, "idb-keyval": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-3.2.0.tgz", "integrity": "sha512-slx8Q6oywCCSfKgPgL0sEsXtPVnSbTLWpyiDcu6msHOyKOLari1TD1qocXVCft80umnkk3/Qqh3lwoFt8T/BPQ==" }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" }, "immer": { "version": "9.0.17", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.17.tgz", "integrity": "sha512-+hBruaLSQvkPfxRiTLK/mi4vLH+/VQS6z2KJahdoxlleFOI8ARqzOF17uy12eFDlqWmPoygwc5evgwcp+dlHhg==" }, "immutable": { "version": "3.7.6", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==" }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, "dependencies": { "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" } } }, "import-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==" }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==" }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "inline-style-parser": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, "inquirer": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "requires": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.19", "mute-stream": "0.0.8", "run-async": "^2.4.0", "rxjs": "^6.6.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" }, "dependencies": { "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "requires": { "type-fest": "^0.21.3" } }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } }, "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" } } }, "internal-slot": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "requires": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" } }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { "loose-envify": "^1.0.0" } }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, "is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "requires": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" } }, "is-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "optional": true, "requires": { "kind-of": "^6.0.0" } }, "is-alphabetical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" }, "is-alphanumerical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", "requires": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" } }, "is-array-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-typed-array": "^1.1.10" } }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "requires": { "has-bigints": "^1.0.1" } }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", "dev": true, "optional": true, "requires": { "binary-extensions": "^1.0.0" } }, "is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" }, "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "requires": { "ci-info": "^2.0.0" } }, "is-core-module": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "requires": { "has": "^1.0.3" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "optional": true, "requires": { "kind-of": "^6.0.0" } }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "requires": { "has-tostringtag": "^1.0.0" } }, "is-decimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "optional": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", "integrity": "sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==", "dev": true, "optional": true }, "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==", "dev": true, "optional": true, "requires": { "is-primitive": "^2.0.0" } }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" }, "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==" }, "is-finite": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-function": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", "requires": { "is-extglob": "^1.0.0" } }, "is-hexadecimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" }, "is-in-browser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" }, "is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "requires": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" } }, "is-invalid-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", "requires": { "is-glob": "^2.0.0" } }, "is-lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", "requires": { "tslib": "^2.0.3" } }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" }, "is-npm": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", "dev": true, "optional": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "requires": { "has-tostringtag": "^1.0.0" } }, "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { "isobject": "^3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" } } }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", "integrity": "sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==", "dev": true, "optional": true }, "is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", "integrity": "sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==", "dev": true, "optional": true }, "is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" }, "is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "requires": { "is-unc-path": "^1.0.0" } }, "is-relative-url": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-3.0.0.tgz", "integrity": "sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA==", "requires": { "is-absolute-url": "^3.0.0" } }, "is-root": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "requires": { "call-bind": "^1.0.2" } }, "is-ssh": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", "requires": { "protocols": "^2.0.1" } }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "requires": { "has-tostringtag": "^1.0.0" } }, "is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "requires": { "has-symbols": "^1.0.2" } }, "is-typed-array": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" } }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "requires": { "unc-path-regex": "^0.1.2" } }, "is-upper-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", "requires": { "tslib": "^2.0.3" } }, "is-valid-domain": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-valid-domain/-/is-valid-domain-0.1.6.tgz", "integrity": "sha512-ZKtq737eFkZr71At8NxOFcP9O1K89gW3DkdrGMpp1upr/ueWjj+Weh4l9AI4rN0Gt8W2M1w7jrG2b/Yv83Ljpg==", "requires": { "punycode": "^2.1.1" } }, "is-valid-path": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", "requires": { "is-invalid-path": "^0.1.0" } }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "requires": { "call-bind": "^1.0.2" } }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "requires": { "is-docker": "^2.0.0" } }, "is-yarn-global": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", "dev": true, "optional": true, "requires": { "isarray": "1.0.0" } }, "javascript-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==" }, "jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "requires": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" }, "dependencies": { "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } } } }, "joi": { "version": "17.7.0", "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", "requires": { "@hapi/hoek": "^9.0.0", "@hapi/topo": "^5.0.0", "@sideway/address": "^4.1.3", "@sideway/formula": "^3.0.0", "@sideway/pinpoint": "^2.0.0" } }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==" }, "js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==", "dev": true }, "json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" } }, "jss": { "version": "9.8.7", "resolved": "https://registry.npmjs.org/jss/-/jss-9.8.7.tgz", "integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==", "requires": { "is-in-browser": "^1.1.3", "symbol-observable": "^1.1.0", "warning": "^3.0.0" } }, "jss-camel-case": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.1.0.tgz", "integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==", "requires": { "hyphenate-style-name": "^1.0.2" } }, "jss-compose": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/jss-compose/-/jss-compose-5.0.0.tgz", "integrity": "sha512-YofRYuiA0+VbeOw0VjgkyO380sA4+TWDrW52nSluD9n+1FWOlDzNbgpZ/Sb3Y46+DcAbOS21W5jo6SAqUEiuwA==", "requires": { "warning": "^3.0.0" } }, "jss-default-unit": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/jss-default-unit/-/jss-default-unit-8.0.2.tgz", "integrity": "sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg==", "requires": {} }, "jss-expand": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/jss-expand/-/jss-expand-5.3.0.tgz", "integrity": "sha512-NiM4TbDVE0ykXSAw6dfFmB1LIqXP/jdd0ZMnlvlGgEMkMt+weJIl8Ynq1DsuBY9WwkNyzWktdqcEW2VN0RAtQg==", "requires": {} }, "jss-extend": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/jss-extend/-/jss-extend-6.2.0.tgz", "integrity": "sha512-YszrmcB6o9HOsKPszK7NeDBNNjVyiW864jfoiHoMlgMIg2qlxKw70axZHqgczXHDcoyi/0/ikP1XaHDPRvYtEA==", "requires": { "warning": "^3.0.0" } }, "jss-global": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/jss-global/-/jss-global-3.0.0.tgz", "integrity": "sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q==", "requires": {} }, "jss-nested": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz", "integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==", "requires": { "warning": "^3.0.0" } }, "jss-preset-default": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/jss-preset-default/-/jss-preset-default-4.5.0.tgz", "integrity": "sha512-qZbpRVtHT7hBPpZEBPFfafZKWmq3tA/An5RNqywDsZQGrlinIF/mGD9lmj6jGqu8GrED2SMHZ3pPKLmjCZoiaQ==", "requires": { "jss-camel-case": "^6.1.0", "jss-compose": "^5.0.0", "jss-default-unit": "^8.0.2", "jss-expand": "^5.3.0", "jss-extend": "^6.2.0", "jss-global": "^3.0.0", "jss-nested": "^6.0.1", "jss-props-sort": "^6.0.0", "jss-template": "^1.0.1", "jss-vendor-prefixer": "^7.0.0" } }, "jss-props-sort": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/jss-props-sort/-/jss-props-sort-6.0.0.tgz", "integrity": "sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g==", "requires": {} }, "jss-template": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/jss-template/-/jss-template-1.0.1.tgz", "integrity": "sha512-m5BqEWha17fmIVXm1z8xbJhY6GFJxNB9H68GVnCWPyGYfxiAgY9WTQyvDAVj+pYRgrXSOfN5V1T4+SzN1sJTeg==", "requires": { "warning": "^3.0.0" } }, "jss-vendor-prefixer": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz", "integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==", "requires": { "css-vendor": "^0.3.8" } }, "jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", "requires": { "array-includes": "^3.1.5", "object.assign": "^4.1.3" } }, "keyv": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", "requires": { "json-buffer": "3.0.1" } }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, "klona": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==" }, "language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" }, "language-tags": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.7.tgz", "integrity": "sha512-bSytju1/657hFjgUzPAPqszxH62ouE8nQFoFaVlIQfne4wO/wXC9A4+m8jYve7YBBvi59eq0SUpcshvG8h5Usw==", "requires": { "language-subtag-registry": "^0.3.20" } }, "latest-version": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", "requires": { "package-json": "^6.3.0" } }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "lilconfig": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "lmdb": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.3.tgz", "integrity": "sha512-iBA0cb13CobBSoGJLfZgnrykLlfJipDAnvtf+YwIqqzBEsTeQYsXrHaSBkaHd5wCWeabwrNvhjZoFMUrlo+eLw==", "requires": { "@lmdb/lmdb-darwin-arm64": "2.5.3", "@lmdb/lmdb-darwin-x64": "2.5.3", "@lmdb/lmdb-linux-arm": "2.5.3", "@lmdb/lmdb-linux-arm64": "2.5.3", "@lmdb/lmdb-linux-x64": "2.5.3", "@lmdb/lmdb-win32-x64": "2.5.3", "msgpackr": "^1.5.4", "node-addon-api": "^4.3.0", "node-gyp-build-optional-packages": "5.0.3", "ordered-binary": "^1.2.4", "weak-lru-cache": "^1.2.2" }, "dependencies": { "node-addon-api": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" } } }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" }, "loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^2.1.2" } }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "requires": { "p-locate": "^5.0.0" } }, "lock": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/lock/-/lock-1.1.0.tgz", "integrity": "sha512-NZQIJJL5Rb9lMJ0Yl1JoVr9GSdo4HTPsUEWsSFzB8dE8DSoiLCVavWZPi7Rnlv/o73u6I24S/XYc/NmG4l8EKA==" }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "lodash.deburr": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", "integrity": "sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==" }, "lodash.every": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz", "integrity": "sha512-isF82d+65/sNvQ3aaQAW7LLHnnTxSN/2fm4rhYyuufLzA4VtHz6y6S5vFwe6PQVr2xdqUOyxBbTNKDpnmeu50w==" }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==" }, "lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" }, "lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==" }, "lodash.maxby": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.maxby/-/lodash.maxby-4.6.0.tgz", "integrity": "sha512-QfTqQTwzmKxLy7VZlbx2M/ipWv8DCQ2F5BI/MRxLharOQ5V78yMSuB+JE+EuUM22txYfj09R2Q7hUlEYj7KdNg==" }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "requires": { "lodash._reinterpolate": "^3.0.0", "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "requires": { "lodash._reinterpolate": "^3.0.0" } }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, "longest-streak": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==" }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } }, "lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "requires": { "tslib": "^2.0.3" } }, "lower-case-first": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz", "integrity": "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==", "requires": { "tslib": "^2.0.3" } }, "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { "yallist": "^3.0.2" } }, "lru-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", "requires": { "es5-ext": "~0.10.2" } }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { "semver": "^6.0.0" }, "dependencies": { "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "requires": { "p-defer": "^1.0.0" }, "dependencies": { "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==" } } }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==" }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", "dev": true, "optional": true, "requires": { "object-visit": "^1.0.0" } }, "markdown-table": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", "requires": { "repeat-string": "^1.0.0" } }, "math-random": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true, "optional": true }, "md-attr-parser": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/md-attr-parser/-/md-attr-parser-1.3.0.tgz", "integrity": "sha512-KTVlfU5Oxo/6kd0YZ2mLP3eWJj+5vzh5mBCxLo3yGl1fzHIgxmtadbE9tHb7TbUBi3XZbl+P0xKeGmakat135w==", "dev": true }, "md5-file": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", "integrity": "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw==" }, "mdast-util-definitions": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", "requires": { "unist-util-visit": "^2.0.0" }, "dependencies": { "unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" } } } }, "mdast-util-find-and-replace": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz", "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==", "requires": { "escape-string-regexp": "^4.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" }, "dependencies": { "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" } } }, "mdast-util-footnote": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/mdast-util-footnote/-/mdast-util-footnote-0.1.7.tgz", "integrity": "sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==", "requires": { "mdast-util-to-markdown": "^0.6.0", "micromark": "~2.11.0" } }, "mdast-util-from-markdown": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", "requires": { "@types/mdast": "^3.0.0", "mdast-util-to-string": "^2.0.0", "micromark": "~2.11.0", "parse-entities": "^2.0.0", "unist-util-stringify-position": "^2.0.0" } }, "mdast-util-gfm": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz", "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==", "requires": { "mdast-util-gfm-autolink-literal": "^0.1.0", "mdast-util-gfm-strikethrough": "^0.2.0", "mdast-util-gfm-table": "^0.1.0", "mdast-util-gfm-task-list-item": "^0.1.0", "mdast-util-to-markdown": "^0.6.1" } }, "mdast-util-gfm-autolink-literal": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz", "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==", "requires": { "ccount": "^1.0.0", "mdast-util-find-and-replace": "^1.1.0", "micromark": "^2.11.3" } }, "mdast-util-gfm-strikethrough": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz", "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==", "requires": { "mdast-util-to-markdown": "^0.6.0" } }, "mdast-util-gfm-table": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz", "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==", "requires": { "markdown-table": "^2.0.0", "mdast-util-to-markdown": "~0.6.0" } }, "mdast-util-gfm-task-list-item": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz", "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==", "requires": { "mdast-util-to-markdown": "~0.6.0" } }, "mdast-util-to-hast": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz", "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==", "requires": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "mdast-util-definitions": "^4.0.0", "mdurl": "^1.0.0", "unist-builder": "^2.0.0", "unist-util-generated": "^1.0.0", "unist-util-position": "^3.0.0", "unist-util-visit": "^2.0.0" }, "dependencies": { "unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" } } } }, "mdast-util-to-markdown": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", "requires": { "@types/unist": "^2.0.0", "longest-streak": "^2.0.0", "mdast-util-to-string": "^2.0.0", "parse-entities": "^2.0.0", "repeat-string": "^1.0.0", "zwitch": "^1.0.0" } }, "mdast-util-to-nlcst": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-4.0.1.tgz", "integrity": "sha512-Y4ffygj85MTt70STKnEquw6k73jYWJBaYcb4ITAKgSNokZF7fH8rEHZ1GsRY/JaxqUevMaEnsDmkVv5Z9uVRdg==", "requires": { "nlcst-to-string": "^2.0.0", "repeat-string": "^1.0.0", "unist-util-position": "^3.0.0", "vfile-location": "^3.1.0" } }, "mdast-util-to-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" }, "mdast-util-toc": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-5.1.0.tgz", "integrity": "sha512-csimbRIVkiqc+PpFeKDGQ/Ck2N4f9FYH3zzBMMJzcxoKL8m+cM0n94xXm0I9eaxHnKdY9n145SGTdyJC7i273g==", "requires": { "@types/mdast": "^3.0.3", "@types/unist": "^2.0.3", "extend": "^3.0.2", "github-slugger": "^1.2.1", "mdast-util-to-string": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit": "^2.0.0" }, "dependencies": { "unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" } } } }, "mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, "meant": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/meant/-/meant-1.0.3.tgz", "integrity": "sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw==" }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "mem": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", "requires": { "map-age-cleaner": "^0.1.3", "mimic-fn": "^3.1.0" }, "dependencies": { "mimic-fn": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==" } } }, "memfs": { "version": "3.4.13", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", "requires": { "fs-monkey": "^1.0.3" } }, "memoizee": { "version": "0.4.15", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", "requires": { "d": "^1.0.1", "es5-ext": "^0.10.53", "es6-weak-map": "^2.0.3", "event-emitter": "^0.3.5", "is-promise": "^2.2.2", "lru-queue": "^0.1.0", "next-tick": "^1.1.0", "timers-ext": "^0.1.7" } }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "micromark": { "version": "2.11.4", "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", "requires": { "debug": "^4.0.0", "parse-entities": "^2.0.0" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "micromark-extension-footnote": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/micromark-extension-footnote/-/micromark-extension-footnote-0.3.2.tgz", "integrity": "sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==", "requires": { "micromark": "~2.11.0" } }, "micromark-extension-gfm": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz", "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==", "requires": { "micromark": "~2.11.0", "micromark-extension-gfm-autolink-literal": "~0.5.0", "micromark-extension-gfm-strikethrough": "~0.6.5", "micromark-extension-gfm-table": "~0.4.0", "micromark-extension-gfm-tagfilter": "~0.3.0", "micromark-extension-gfm-task-list-item": "~0.3.0" } }, "micromark-extension-gfm-autolink-literal": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz", "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==", "requires": { "micromark": "~2.11.3" } }, "micromark-extension-gfm-strikethrough": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz", "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==", "requires": { "micromark": "~2.11.0" } }, "micromark-extension-gfm-table": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz", "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==", "requires": { "micromark": "~2.11.0" } }, "micromark-extension-gfm-tagfilter": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz", "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==" }, "micromark-extension-gfm-task-list-item": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz", "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==", "requires": { "micromark": "~2.11.0" } }, "micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==", "dev": true, "optional": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", "braces": "^1.8.2", "expand-brackets": "^0.1.4", "extglob": "^0.3.1", "filename-regex": "^2.0.0", "is-extglob": "^1.0.0", "is-glob": "^2.0.1", "kind-of": "^3.0.2", "normalize-path": "^2.0.1", "object.omit": "^2.0.0", "parse-glob": "^3.0.4", "regex-cache": "^0.4.2" }, "dependencies": { "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { "mime-db": "1.52.0" } }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, "mini-css-extract-plugin": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0", "webpack-sources": "^1.1.0" } }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" }, "mitt": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==" }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "optional": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "optional": true, "requires": { "is-plain-object": "^2.0.4" } } } }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "requires": { "minimist": "^1.2.6" } }, "mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "msgpackr": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.8.1.tgz", "integrity": "sha512-05fT4J8ZqjYlR4QcRDIhLCYKUOHXk7C/xa62GzMKj74l3up9k2QZ3LgFc6qWdsPHl91QA2WLWqWc8b8t7GLNNw==", "requires": { "msgpackr-extract": "^2.2.0" } }, "msgpackr-extract": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-2.2.0.tgz", "integrity": "sha512-0YcvWSv7ZOGl9Od6Y5iJ3XnPww8O7WLcpYMDwX+PAA/uXLDtyw94PJv9GLQV/nnp3cWlDhMoyKZIQLrx33sWog==", "optional": true, "requires": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "2.2.0", "@msgpackr-extract/msgpackr-extract-darwin-x64": "2.2.0", "@msgpackr-extract/msgpackr-extract-linux-arm": "2.2.0", "@msgpackr-extract/msgpackr-extract-linux-arm64": "2.2.0", "@msgpackr-extract/msgpackr-extract-linux-x64": "2.2.0", "@msgpackr-extract/msgpackr-extract-win32-x64": "2.2.0", "node-gyp-build-optional-packages": "5.0.3" } }, "multer": { "version": "1.4.5-lts.1", "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", "requires": { "append-field": "^1.0.0", "busboy": "^1.0.0", "concat-stream": "^1.5.2", "mkdirp": "^0.5.4", "object-assign": "^4.1.1", "type-is": "^1.6.4", "xtend": "^4.0.0" } }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "nan": { "version": "2.17.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", "dev": true, "optional": true }, "nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "optional": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "fragment-cache": "^0.2.1", "is-windows": "^1.0.2", "kind-of": "^6.0.2", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "dependencies": { "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", "dev": true, "optional": true }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true, "optional": true }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "optional": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" } }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "optional": true, "requires": { "is-plain-object": "^2.0.4" } } } }, "napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "needle": { "version": "2.9.1", "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", "requires": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "nlcst-to-string": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz", "integrity": "sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg==" }, "no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "requires": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "node-abi": { "version": "3.30.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.30.0.tgz", "integrity": "sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw==", "requires": { "semver": "^7.3.5" }, "dependencies": { "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "requires": { "whatwg-url": "^5.0.0" } }, "node-gyp-build": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==" }, "node-gyp-build-optional-packages": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==" }, "node-html-parser": { "version": "5.4.2", "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", "requires": { "css-select": "^4.2.1", "he": "1.2.0" }, "dependencies": { "css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "requires": { "boolbase": "^1.0.0", "css-what": "^6.0.1", "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" } }, "dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "requires": { "domelementtype": "^2.2.0" } }, "domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" } }, "entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" } } }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node-object-hash": { "version": "2.3.10", "resolved": "https://registry.npmjs.org/node-object-hash/-/node-object-hash-2.3.10.tgz", "integrity": "sha512-jY5dPJzw6NHd/KPSfPKJ+IHoFS81/tJ43r34ZeNMXGzCOM8jwQDCD12HYayKIB6MuznrnqIYy2e891NA2g0ibA==" }, "node-releases": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==" }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "requires": { "remove-trailing-separator": "^1.0.1" } }, "normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" }, "normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" }, "not": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/not/-/not-0.1.0.tgz", "integrity": "sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==" }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "requires": { "path-key": "^3.0.0" } }, "nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "requires": { "boolbase": "^1.0.0" } }, "null-loader": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" } }, "nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", "dev": true, "optional": true, "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "optional": true, "requires": { "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "optional": true, "requires": { "kind-of": "^3.0.2" } }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "optional": true, "requires": { "kind-of": "^3.0.2" } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "optional": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "optional": true } } }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "object-fit-images": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/object-fit-images/-/object-fit-images-3.2.4.tgz", "integrity": "sha512-G+7LzpYfTfqUyrZlfrou/PLLLAPNC52FTy5y1CBywX+1/FkxIloOyQXBmZ3Zxa2AWO+lMF0JTuvqbr7G5e5CWg==" }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", "dev": true, "optional": true, "requires": { "isobject": "^3.0.0" }, "dependencies": { "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true } } }, "object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "object.entries": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "object.fromentries": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "object.hasown": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "requires": { "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==", "dev": true, "optional": true, "requires": { "for-own": "^0.1.4", "is-extendable": "^0.1.1" } }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, "optional": true, "requires": { "isobject": "^3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true } } }, "object.values": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } }, "on-headers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } }, "onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "requires": { "mimic-fn": "^2.1.0" } }, "open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "opentracing": { "version": "0.14.7", "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz", "integrity": "sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==" }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "requires": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.3" } }, "ordered-binary": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.4.0.tgz", "integrity": "sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==" }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "dev": true }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" }, "output-file-sync": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", "integrity": "sha512-uQLlclru4xpCi+tfs80l3QF24KL81X57ELNMy7W/dox+JTtxUf1bLyQ8968fFCmSqqbokjW0kn+WBIlO+rSkNg==", "dev": true, "requires": { "graceful-fs": "^4.1.4", "mkdirp": "^0.5.1", "object-assign": "^4.1.0" } }, "p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" }, "p-defer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==" }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { "yocto-queue": "^0.1.0" } }, "p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { "p-limit": "^3.0.2" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "package-json": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", "requires": { "got": "^9.6.0", "registry-auth-token": "^4.0.0", "registry-url": "^5.0.0", "semver": "^6.2.0" }, "dependencies": { "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, "@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "requires": { "defer-to-connect": "^1.0.1" } }, "cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^3.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^4.1.0", "responselike": "^1.0.2" }, "dependencies": { "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { "pump": "^3.0.0" } } } }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "requires": { "mimic-response": "^1.0.0" } }, "defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "requires": { "pump": "^3.0.0" } }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "requires": { "@sindresorhus/is": "^0.14.0", "@szmarczak/http-timer": "^1.1.2", "cacheable-request": "^6.0.0", "decompress-response": "^3.3.0", "duplexer3": "^0.1.4", "get-stream": "^4.1.0", "lowercase-keys": "^1.0.1", "mimic-response": "^1.0.1", "p-cancelable": "^1.0.0", "to-readable-stream": "^1.0.0", "url-parse-lax": "^3.0.0" }, "dependencies": { "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" } } }, "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" }, "keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "requires": { "json-buffer": "3.0.0" } }, "normalize-url": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "requires": { "lowercase-keys": "^1.0.0" }, "dependencies": { "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" } } }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "requires": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "requires": { "callsites": "^3.0.0" } }, "parse-english": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/parse-english/-/parse-english-4.2.0.tgz", "integrity": "sha512-jw5N6wZUZViIw3VLG/FUSeL3vDhfw5Q2g4E3nYC69Mm5ANbh9ZWd+eligQbeUoyObZM8neynTn3l14e09pjEWg==", "requires": { "nlcst-to-string": "^2.0.0", "parse-latin": "^4.0.0", "unist-util-modify-children": "^2.0.0", "unist-util-visit-children": "^1.0.0" } }, "parse-entities": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", "requires": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", "character-reference-invalid": "^1.0.0", "is-alphanumerical": "^1.0.0", "is-decimal": "^1.0.0", "is-hexadecimal": "^1.0.0" } }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "requires": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", "path-root": "^0.1.1" } }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==", "dev": true, "optional": true, "requires": { "glob-base": "^0.3.0", "is-dotfile": "^1.0.0", "is-extglob": "^1.0.0", "is-glob": "^2.0.0" } }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "parse-latin": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-4.3.0.tgz", "integrity": "sha512-TYKL+K98dcAWoCw/Ac1yrPviU8Trk+/gmjQVaoWEFDZmVD4KRg6c/80xKqNNFQObo2mTONgF8trzAf2UTwKafw==", "requires": { "nlcst-to-string": "^2.0.0", "unist-util-modify-children": "^2.0.0", "unist-util-visit-children": "^1.0.0" } }, "parse-numeric-range": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz", "integrity": "sha512-m6xRZuda9v6EGdnPMIkcyB3/NpdgbMJG8yPAQ0Mwm1nGlm2OE/o6YS0EAxAqv6u4/PKQPp6BNoylZnRb2U2/OA==" }, "parse-path": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "requires": { "protocols": "^2.0.0" } }, "parse-srcset": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" }, "parse-url": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "requires": { "parse-path": "^7.0.0" } }, "parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "requires": { "entities": "^4.4.0" } }, "parse5-htmlparser2-tree-adapter": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", "requires": { "domhandler": "^5.0.2", "parse5": "^7.0.0" } }, "parseqs": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" }, "parseuri": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", "dev": true, "optional": true }, "password-prompt": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz", "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==", "requires": { "ansi-escapes": "^3.1.0", "cross-spawn": "^6.0.5" }, "dependencies": { "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { "isexe": "^2.0.0" } } } }, "path-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", "requires": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-root": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", "requires": { "path-root-regex": "^0.1.0" } }, "path-root-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==" }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "peek-readable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==" }, "physical-cpu-count": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz", "integrity": "sha512-rxJOljMuWtYlvREBmd6TZYanfcPhNUKtGDZBjBBS8WG1dpN2iwPsRJZgQqN/OtJuiQckdRFOfzogqJClTrsi7g==" }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { "find-up": "^4.0.0" }, "dependencies": { "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { "p-locate": "^4.1.0" } }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "^2.2.0" } } } }, "pkg-up": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "requires": { "find-up": "^3.0.0" }, "dependencies": { "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { "locate-path": "^3.0.0" } }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { "p-limit": "^2.0.0" } }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" } } }, "platform": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, "popper.js": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", "dev": true, "optional": true }, "postcss": { "version": "8.4.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", "requires": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "postcss-calc": { "version": "8.2.4", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", "requires": { "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0" } }, "postcss-colormin": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", "requires": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" } }, "postcss-convert-values": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "requires": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, "postcss-discard-comments": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", "requires": {} }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", "requires": {} }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", "requires": {} }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", "requires": {} }, "postcss-flexbugs-fixes": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", "requires": {} }, "postcss-loader": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-5.3.0.tgz", "integrity": "sha512-/+Z1RAmssdiSLgIZwnJHwBMnlABPgF7giYzTN2NOfr9D21IJZ4mQC1R2miwp80zno9M4zMD/umGI8cR+2EL5zw==", "requires": { "cosmiconfig": "^7.0.0", "klona": "^2.0.4", "semver": "^7.3.4" }, "dependencies": { "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "postcss-merge-longhand": { "version": "5.1.7", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "requires": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.1" } }, "postcss-merge-rules": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", "requires": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" } }, "postcss-minify-font-values": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-minify-gradients": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", "requires": { "colord": "^2.9.1", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-params": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "requires": { "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-selectors": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", "requires": { "postcss-selector-parser": "^6.0.5" } }, "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "requires": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" } }, "postcss-modules-scope": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "requires": { "postcss-selector-parser": "^6.0.4" } }, "postcss-modules-values": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "requires": { "icss-utils": "^5.0.0" } }, "postcss-normalize-charset": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", "requires": {} }, "postcss-normalize-display-values": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-positions": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-string": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-timing-functions": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-unicode": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "requires": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-url": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", "requires": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-whitespace": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-ordered-values": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", "requires": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } }, "postcss-reduce-initial": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", "requires": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" } }, "postcss-reduce-transforms": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-selector-parser": { "version": "6.0.11", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "postcss-svgo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", "requires": { "postcss-value-parser": "^4.2.0", "svgo": "^2.7.0" } }, "postcss-unique-selectors": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", "requires": { "postcss-selector-parser": "^6.0.5" } }, "postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "requires": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^1.0.1", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "dependencies": { "detect-libc": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" } } }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", "dev": true, "optional": true }, "prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" }, "pretty-error": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "requires": { "lodash": "^4.17.20", "renderkid": "^2.0.4" } }, "prismjs": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, "probe-image-size": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", "requires": { "lodash.merge": "^4.6.2", "needle": "^2.5.2", "stream-parser": "~0.3.1" } }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "~2.0.3" } }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "proper-lockfile": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", "requires": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "property-information": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", "requires": { "xtend": "^4.0.0" } }, "protocols": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "requires": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "pupa": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", "requires": { "escape-goat": "^2.0.0" } }, "qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "requires": { "side-channel": "^1.0.4" } }, "query-string": { "version": "6.14.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", "requires": { "decode-uri-component": "^0.2.0", "filter-obj": "^1.1.0", "split-on-first": "^1.0.0", "strict-uri-encode": "^2.0.0" } }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" }, "ramda": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz", "integrity": "sha512-HGd5aczYKQXGILB+abY290V7Xz62eFajpa6AtMdwEmQSakJmgSO7ks4eI3HdR34j+X2Vz4Thp9VAJbrCAMbO2w==" }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, "optional": true, "requires": { "is-number": "^4.0.0", "kind-of": "^6.0.0", "math-random": "^1.0.1" }, "dependencies": { "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true, "optional": true } } }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "requires": { "safe-buffer": "^5.1.0" } }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" } } }, "raw-loader": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" } }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "dependencies": { "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" } } }, "react": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2" } }, "react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", "requires": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", "browserslist": "^4.18.1", "chalk": "^4.1.2", "cross-spawn": "^7.0.3", "detect-port-alt": "^1.1.6", "escape-string-regexp": "^4.0.0", "filesize": "^8.0.6", "find-up": "^5.0.0", "fork-ts-checker-webpack-plugin": "^6.5.0", "global-modules": "^2.0.0", "globby": "^11.0.4", "gzip-size": "^6.0.0", "immer": "^9.0.7", "is-root": "^2.1.0", "loader-utils": "^3.2.0", "open": "^8.4.0", "pkg-up": "^3.1.0", "prompts": "^2.4.2", "react-error-overlay": "^6.0.11", "recursive-readdir": "^2.2.2", "shell-quote": "^1.7.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "dependencies": { "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "loader-utils": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" }, "open": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "requires": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } } } }, "react-dom": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", "scheduler": "^0.19.1" } }, "react-error-overlay": { "version": "6.0.11", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, "react-fast-compare": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" }, "react-helmet": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-5.2.1.tgz", "integrity": "sha512-CnwD822LU8NDBnjCpZ4ySh8L6HYyngViTZLfBBb3NjtrpN8m49clH8hidHouq20I51Y6TpCTISCBbqiY5GamwA==", "requires": { "object-assign": "^4.1.1", "prop-types": "^15.5.4", "react-fast-compare": "^2.0.2", "react-side-effect": "^1.1.0" } }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-jss": { "version": "8.6.1", "resolved": "https://registry.npmjs.org/react-jss/-/react-jss-8.6.1.tgz", "integrity": "sha512-SH6XrJDJkAphp602J14JTy3puB2Zxz1FkM3bKVE8wON+va99jnUTKWnzGECb3NfIn9JPR5vHykge7K3/A747xQ==", "requires": { "hoist-non-react-statics": "^2.5.0", "jss": "^9.7.0", "jss-preset-default": "^4.3.0", "prop-types": "^15.6.0", "theming": "^1.3.0" } }, "react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==" }, "react-side-effect": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.2.0.tgz", "integrity": "sha512-v1ht1aHg5k/thv56DRcjw+WtojuuDHFUgGfc+bFHOWsF4ZK6C2V57DO0Or0GPsg6+LSTE0M6Ry/gfzhzSwbc5w==", "requires": { "shallowequal": "^1.0.1" } }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", "requires": { "mute-stream": "~0.0.4" } }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" }, "dependencies": { "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, "readable-web-to-node-stream": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", "requires": { "readable-stream": "^3.6.0" }, "dependencies": { "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } } } }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "optional": true, "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" }, "dependencies": { "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", "dev": true, "optional": true }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true, "optional": true }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "optional": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", "extend-shallow": "^2.0.1", "fill-range": "^4.0.0", "isobject": "^3.0.1", "repeat-element": "^1.1.2", "snapdragon": "^0.8.1", "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" } }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", "dev": true, "optional": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "posix-character-classes": "^0.1.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "optional": true, "requires": { "is-descriptor": "^0.1.0" } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "optional": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "optional": true } } }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "optional": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", "expand-brackets": "^2.1.4", "extend-shallow": "^2.0.1", "fragment-cache": "^0.2.1", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "optional": true, "requires": { "is-descriptor": "^1.0.0" } } } }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "dev": true, "optional": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" } }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "optional": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "optional": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "optional": true, "requires": { "is-plain-object": "^2.0.4" } }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "optional": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "optional": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "extglob": "^2.0.4", "fragment-cache": "^0.2.1", "kind-of": "^6.0.2", "nanomatch": "^1.2.9", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "optional": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" } } } }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "optional": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" } } } }, "recursive-readdir": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "requires": { "minimatch": "^3.0.5" } }, "redux": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz", "integrity": "sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==", "requires": { "@babel/runtime": "^7.9.2" } }, "redux-thunk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", "requires": {} }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "requires": { "regenerate": "^1.4.2" } }, "regenerator-runtime": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==", "dev": true }, "regenerator-transform": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { "babel-runtime": "^6.18.0", "babel-types": "^6.19.0", "private": "^0.1.6" } }, "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "optional": true, "requires": { "is-equal-shallow": "^0.1.3" } }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "optional": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "optional": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" } }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "optional": true, "requires": { "is-plain-object": "^2.0.4" } } } }, "regex-parser": { "version": "2.2.11", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" }, "regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "functions-have-names": "^1.2.2" } }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", "integrity": "sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ==", "dev": true, "requires": { "regenerate": "^1.2.1", "regjsgen": "^0.2.0", "regjsparser": "^0.1.4" } }, "registry-auth-token": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", "requires": { "rc": "1.2.8" } }, "registry-url": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", "requires": { "rc": "^1.2.8" } }, "regjsgen": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", "integrity": "sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==", "dev": true }, "regjsparser": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "integrity": "sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==", "dev": true, "requires": { "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true } } }, "rehype-react": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-3.1.0.tgz", "integrity": "sha512-7SiLiqNudSGkvhrePkdKqdUvngZqzG+PJhdR5EeIFELz2j2ek4aO5DHbxUXYvaZfqUiBDO2Aeq1OROUmxmu+Vg==", "requires": { "@mapbox/hast-util-table-cell-style": "^0.1.3", "has": "^1.0.1", "hast-to-hyperscript": "^5.0.0" }, "dependencies": { "hast-to-hyperscript": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-5.0.0.tgz", "integrity": "sha512-DLl3eYTz8uwwzEubDUdCChsR5t5b2ne+yvHrA2h58Suq/JnN3+Gsb9Tc4iZoCCsykmFUc6UUpwxTmQXs0akSeg==", "requires": { "comma-separated-tokens": "^1.0.0", "property-information": "^4.0.0", "space-separated-tokens": "^1.0.0", "style-to-object": "^0.2.1", "unist-util-is": "^2.0.0", "web-namespaces": "^1.1.2" } }, "property-information": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-4.2.0.tgz", "integrity": "sha512-TlgDPagHh+eBKOnH2VYvk8qbwsCG/TAJdmTL7f1PROUcSO8qt/KSmShEQ/OKvock8X9tFjtqjCScyOkkkvIKVQ==", "requires": { "xtend": "^4.0.1" } }, "style-to-object": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz", "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==", "requires": { "inline-style-parser": "0.1.1" } }, "unist-util-is": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" } } }, "relay-runtime": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz", "integrity": "sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==", "requires": { "@babel/runtime": "^7.0.0", "fbjs": "^3.0.0", "invariant": "^2.2.4" } }, "remark": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", "requires": { "remark-parse": "^9.0.0", "remark-stringify": "^9.0.0", "unified": "^9.1.0" } }, "remark-footnotes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-3.0.0.tgz", "integrity": "sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==", "requires": { "mdast-util-footnote": "^0.1.0", "micromark-extension-footnote": "^0.3.0" } }, "remark-gfm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz", "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==", "requires": { "mdast-util-gfm": "^0.1.0", "micromark-extension-gfm": "^0.3.0" } }, "remark-parse": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", "requires": { "mdast-util-from-markdown": "^0.8.0" } }, "remark-react": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/remark-react/-/remark-react-5.0.1.tgz", "integrity": "sha512-yHv5WIh47srKfdm794UMIHjNLr6EY2YCzsqvdJ/qvN1Tq1jgyg3q8Zo9pJc4L7BwZOMTia6O2JgrJeOsJfowzA==", "requires": { "@mapbox/hast-util-table-cell-style": "^0.1.3", "hast-to-hyperscript": "^6.0.0", "hast-util-sanitize": "^1.0.0", "mdast-util-to-hast": "^4.0.0" }, "dependencies": { "hast-to-hyperscript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-6.0.0.tgz", "integrity": "sha512-QnJbXddVGNJ5v3KegK1MY6luTkNDBcJnCQZcekt7AkES2z4tYy85pbFUXx7Mb0iXZBKfwoVdgfxU12GbmlwbbQ==", "requires": { "comma-separated-tokens": "^1.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0", "style-to-object": "^0.2.1", "unist-util-is": "^2.0.0", "web-namespaces": "^1.1.2" } }, "mdast-util-definitions": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz", "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==", "requires": { "unist-util-visit": "^1.0.0" } }, "mdast-util-to-hast": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-4.0.0.tgz", "integrity": "sha512-yOTZSxR1aPvWRUxVeLaLZ1sCYrK87x2Wusp1bDM/Ao2jETBhYUKITI3nHvgy+HkZW54HuCAhHnS0mTcbECD5Ig==", "requires": { "collapse-white-space": "^1.0.0", "detab": "^2.0.0", "mdast-util-definitions": "^1.2.0", "mdurl": "^1.0.1", "trim": "0.0.1", "trim-lines": "^1.0.0", "unist-builder": "^1.0.1", "unist-util-generated": "^1.1.0", "unist-util-position": "^3.0.0", "unist-util-visit": "^1.1.0", "xtend": "^4.0.1" } }, "style-to-object": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz", "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==", "requires": { "inline-style-parser": "0.1.1" } }, "unist-builder": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.4.tgz", "integrity": "sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg==", "requires": { "object-assign": "^4.1.0" } }, "unist-util-is": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" } } }, "remark-retext": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-4.0.0.tgz", "integrity": "sha512-cYCchalpf25bTtfXF24ribYvqytPKq0TiEhqQDBHvVEEsApebwruPWP1cTcvTFBidmpXyqzycm+y8ng7Kmvc8Q==", "requires": { "mdast-util-to-nlcst": "^4.0.0" } }, "remark-stringify": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", "requires": { "mdast-util-to-markdown": "^0.6.0" } }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" }, "renderkid": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "requires": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", "strip-ansi": "^3.0.1" }, "dependencies": { "css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "requires": { "boolbase": "^1.0.0", "css-what": "^6.0.1", "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" } }, "dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "requires": { "domelementtype": "^2.2.0" } }, "domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" } }, "entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, "htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", "domutils": "^2.5.2", "entities": "^2.0.0" } } } }, "repeat-element": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true, "optional": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", "dev": true, "requires": { "is-finite": "^1.0.0" } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "require-package-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz", "integrity": "sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==" }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "requires": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, "resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "requires": { "resolve-from": "^5.0.0" } }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==" }, "resolve-url-loader": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.5.tgz", "integrity": "sha512-mgFMCmrV/tA4738EsFmPFE5/MaqSgUMe8LK971kVEKA/RrNVb7+VqFsg/qmKyythf34eyq476qIobP/gfFBGSQ==", "requires": { "adjust-sourcemap-loader": "3.0.0", "camelcase": "5.3.1", "compose-function": "3.0.3", "convert-source-map": "1.7.0", "es6-iterator": "2.0.3", "loader-utils": "^1.2.3", "postcss": "7.0.36", "rework": "1.0.1", "rework-visit": "1.0.0", "source-map": "0.6.1" }, "dependencies": { "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } } } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "requires": { "safe-buffer": "~5.1.1" } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "requires": { "minimist": "^1.2.0" } }, "loader-utils": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^1.0.1" } }, "postcss": { "version": "7.0.36", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", "supports-color": "^6.1.0" } }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { "has-flag": "^3.0.0" } } } }, "responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "requires": { "lowercase-keys": "^2.0.0" } }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "requires": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true, "optional": true }, "retext": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/retext/-/retext-7.0.1.tgz", "integrity": "sha512-N0IaEDkvUjqyfn3/gwxVfI51IxfGzOiVXqPLWnKeCDbiQdxSg0zebzHPxXWnL7TeplAJ+RE4uqrXyYN//s9HjQ==", "requires": { "retext-latin": "^2.0.0", "retext-stringify": "^2.0.0", "unified": "^8.0.0" }, "dependencies": { "unified": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", "requires": { "bail": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^2.0.0", "trough": "^1.0.0", "vfile": "^4.0.0" } } } }, "retext-english": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/retext-english/-/retext-english-3.0.4.tgz", "integrity": "sha512-yr1PgaBDde+25aJXrnt3p1jvT8FVLVat2Bx8XeAWX13KXo8OT+3nWGU3HWxM4YFJvmfqvJYJZG2d7xxaO774gw==", "requires": { "parse-english": "^4.0.0", "unherit": "^1.0.4" } }, "retext-latin": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-2.0.4.tgz", "integrity": "sha512-fOoSSoQgDZ+l/uS81oxI3alBghDUPja0JEl0TpQxI6MN+dhM6fLFumPJwMZ4PJTyL5FFAgjlsdv8IX+6IRuwMw==", "requires": { "parse-latin": "^4.0.0", "unherit": "^1.0.4" } }, "retext-smartypants": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-4.0.0.tgz", "integrity": "sha512-Mknd05zuIycr4Z/hNDxA8ktqv7pG7wYdTZc68a2MJF+Ibg/WloR5bbyrEjijwNwHRR+xWsovkLH4OQIz/mghdw==", "requires": { "nlcst-to-string": "^2.0.0", "unist-util-visit": "^2.0.0" }, "dependencies": { "unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" } } } }, "retext-stringify": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-2.0.4.tgz", "integrity": "sha512-xOtx5mFJBoT3j7PBtiY2I+mEGERNniofWktI1cKXvjMEJPOuqve0dghLHO1+gz/gScLn4zqspDGv4kk2wS5kSA==", "requires": { "nlcst-to-string": "^2.0.0" } }, "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rework": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", "integrity": "sha512-eEjL8FdkdsxApd0yWVZgBGzfCQiT8yqSc2H1p4jpZpQdtz7ohETiDMoje5PlM8I9WgkqkreVxFUKYOiJdVWDXw==", "requires": { "convert-source-map": "^0.3.3", "css": "^2.0.0" }, "dependencies": { "convert-source-map": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", "integrity": "sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg==" } } }, "rework-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", "integrity": "sha512-W6V2fix7nCLUYX1v6eGPrBOZlc03/faqzP4sUxMAJMBMOPYhfV/RyLegTufn5gJKaOITyi+gvf0LXDZ9NzkHnQ==" }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "requires": { "queue-microtask": "^1.2.2" } }, "rx": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==" }, "rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "requires": { "tslib": "^1.9.0" }, "dependencies": { "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" } } }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", "dev": true, "optional": true, "requires": { "ret": "~0.1.10" } }, "safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" } }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sanitize-html": { "version": "1.27.5", "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.27.5.tgz", "integrity": "sha512-M4M5iXDAUEcZKLXkmk90zSYWEtk5NH3JmojQxKxV371fnMh+x9t1rqdmXaGoyEHw3z/X/8vnFhKjGL5xFGOJ3A==", "requires": { "htmlparser2": "^4.1.0", "lodash": "^4.17.15", "parse-srcset": "^1.0.2", "postcss": "^7.0.27" }, "dependencies": { "dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" }, "dependencies": { "domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "requires": { "domelementtype": "^2.2.0" } } } }, "domhandler": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", "requires": { "domelementtype": "^2.0.1" } }, "domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" }, "dependencies": { "domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "requires": { "domelementtype": "^2.2.0" } } } }, "entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, "htmlparser2": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", "requires": { "domelementtype": "^2.0.1", "domhandler": "^3.0.0", "domutils": "^2.0.0", "entities": "^2.0.0" } }, "picocolors": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "requires": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "sass": { "version": "1.57.1", "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz", "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==", "peer": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" }, "dependencies": { "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "peer": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "peer": true }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "peer": true, "requires": { "fill-range": "^7.0.1" } }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "peer": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" } }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "peer": true, "requires": { "to-regex-range": "^5.0.1" } }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true, "peer": true }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "peer": true, "requires": { "is-glob": "^4.0.1" } }, "immutable": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz", "integrity": "sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og==", "peer": true }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "peer": true, "requires": { "binary-extensions": "^2.0.0" } }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "peer": true }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "peer": true, "requires": { "is-extglob": "^2.1.1" } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "peer": true }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "peer": true, "requires": { "picomatch": "^2.2.1" } } } }, "sass-loader": { "version": "10.4.1", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.4.1.tgz", "integrity": "sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==", "requires": { "klona": "^2.0.4", "loader-utils": "^2.0.0", "neo-async": "^2.6.2", "schema-utils": "^3.0.0", "semver": "^7.3.2" }, "dependencies": { "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "sass-resources-loader": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-1.3.5.tgz", "integrity": "sha512-pCxaoRZxbKxDWhu5ZcsV7/apPYrL/z0F+25C29L4e8pajWM/4jM4hRXSRP4jEWTXo/kYIU9bEXKZZdGfjN90+Q==", "requires": { "async": "^2.1.4", "chalk": "^1.1.3", "glob": "^7.1.1", "loader-utils": "^1.0.4" }, "dependencies": { "async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "requires": { "lodash": "^4.17.14" } }, "json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "requires": { "minimist": "^1.2.0" } }, "loader-utils": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^1.0.1" } } } }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "scheduler": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", "requires": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "semver-diff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", "requires": { "semver": "^6.3.0" }, "dependencies": { "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" }, "dependencies": { "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "sentence-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, "serialize-javascript": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "requires": { "randombytes": "^2.1.0" } }, "serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.18.0" } }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "optional": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" } }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "requires": { "kind-of": "^6.0.2" } }, "shallow-compare": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/shallow-compare/-/shallow-compare-1.2.2.tgz", "integrity": "sha512-LUMFi+RppPlrHzbqmFnINTrazo0lPNwhcgzuAXVVcfy/mqPDrQmHAyz5bvV0gDAuRFrk804V0HpQ6u9sZ0tBeg==" }, "shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" }, "sharp": { "version": "0.30.7", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.7.tgz", "integrity": "sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==", "requires": { "color": "^4.2.3", "detect-libc": "^2.0.1", "node-addon-api": "^5.0.0", "prebuild-install": "^7.1.1", "semver": "^7.3.7", "simple-get": "^4.0.1", "tar-fs": "^2.1.1", "tunnel-agent": "^0.6.0" }, "dependencies": { "detect-libc": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "node-addon-api": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "requires": { "shebang-regex": "^3.0.0" } }, "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "shell-quote": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==" }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" } }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "signedsource": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==" }, "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" }, "simple-get": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "requires": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "requires": { "is-arrayish": "^0.3.1" }, "dependencies": { "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" } } }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "sitemap": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", "requires": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.2.4" }, "dependencies": { "@types/node": { "version": "17.0.45", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" } } }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", "dev": true }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } } } }, "slugify": { "version": "1.6.5", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz", "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==" }, "snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "requires": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "optional": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "map-cache": "^0.2.2", "source-map": "^0.5.6", "source-map-resolve": "^0.5.0", "use": "^3.1.0" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "optional": true, "requires": { "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "optional": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "optional": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "optional": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "optional": true } } }, "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "optional": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "optional": true, "requires": { "is-descriptor": "^1.0.0" } }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true } } }, "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "optional": true, "requires": { "kind-of": "^3.2.0" }, "dependencies": { "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "socket.io": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", "integrity": "sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw==", "requires": { "@types/cookie": "^0.4.0", "@types/cors": "^2.8.8", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.1", "engine.io": "~4.1.0", "socket.io-adapter": "~2.1.0", "socket.io-parser": "~4.0.3" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "socket.io-adapter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz", "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==" }, "socket.io-client": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-3.1.3.tgz", "integrity": "sha512-4sIGOGOmCg3AOgGi7EEr6ZkTZRkrXwub70bBB/F0JSkMOUFpA77WsL87o34DffQQ31PkbMUIadGOk+3tx1KGbw==", "requires": { "@types/component-emitter": "^1.2.10", "backo2": "~1.0.2", "component-emitter": "~1.3.0", "debug": "~4.3.1", "engine.io-client": "~4.1.0", "parseuri": "0.0.6", "socket.io-parser": "~4.0.4" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "socket.io-parser": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz", "integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==", "requires": { "@types/component-emitter": "^1.2.10", "component-emitter": "~1.3.0", "debug": "~4.3.1" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "requires": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", "urix": "^0.1.0" } }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { "source-map": "^0.5.6" } }, "source-map-url": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" }, "space-separated-tokens": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" }, "split-on-first": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "optional": true, "requires": { "extend-shallow": "^3.0.0" }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "optional": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" } }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "optional": true, "requires": { "is-plain-object": "^2.0.4" } } } }, "sponge-case": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz", "integrity": "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==", "requires": { "tslib": "^2.0.3" } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "st": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/st/-/st-2.0.0.tgz", "integrity": "sha512-drN+aGYnrZPNYIymmNwIY7LXYJ8MqsqXj4fMRue3FOgGMdGjSX10fhJ3qx0sVQPhcWxhEaN4U/eWM4O4dbYNAw==", "requires": { "async-cache": "^1.1.0", "bl": "^4.0.0", "fd": "~0.0.2", "graceful-fs": "^4.2.3", "mime": "^2.4.4", "negotiator": "~0.6.2" } }, "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" }, "stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", "dev": true, "optional": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "optional": true, "requires": { "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "optional": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "optional": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "optional": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, "optional": true } } }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "stream-parser": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", "requires": { "debug": "2" } }, "streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" }, "strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==" }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { "safe-buffer": "~5.1.0" }, "dependencies": { "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, "string-natural-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" }, "string-similarity": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-1.2.2.tgz", "integrity": "sha512-IoHUjcw3Srl8nsPlW04U3qwWPk3oG2ffLM0tN853d/E/JlIvcmZmDY2Kz5HzKp4lEi2T7QD7Zuvjq/1rDw+XcQ==", "requires": { "lodash.every": "^4.6.0", "lodash.flattendeep": "^4.4.0", "lodash.foreach": "^4.5.0", "lodash.map": "^4.6.0", "lodash.maxby": "^4.6.0" } }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "dependencies": { "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } } } }, "string.prototype.matchall": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" } }, "string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "stringify-entities": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", "requires": { "character-entities-html4": "^1.0.0", "character-entities-legacy": "^1.0.0", "xtend": "^4.0.0" } }, "stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "requires": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" }, "dependencies": { "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" } } }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "requires": { "ansi-regex": "^2.0.0" } }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" }, "strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==" }, "strip-comments": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", "requires": { "babel-extract-comments": "^1.0.0", "babel-plugin-transform-object-rest-spread": "^6.26.0" } }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==" }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", "requires": { "escape-string-regexp": "^1.0.2" } }, "strtok3": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", "requires": { "@tokenizer/token": "^0.3.0", "peek-readable": "^4.1.0" } }, "style-loader": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" } }, "style-to-object": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", "requires": { "inline-style-parser": "0.1.1" } }, "stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "requires": { "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" } }, "sudo-prompt": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz", "integrity": "sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==" }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "svg-react-loader": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/svg-react-loader/-/svg-react-loader-0.4.6.tgz", "integrity": "sha512-HVEypjWQsQuJdBIPzXGxpmQsQts7QwfQuYgK1rah6BVCMoLNSCh/ESKVNd7/tHq8DkWYHHTyaUMDA1FjqZYrgA==", "requires": { "css": "2.2.4", "loader-utils": "1.1.0", "ramda": "0.21.0", "rx": "4.1.0", "traverse": "0.6.6", "xml2js": "0.4.17" }, "dependencies": { "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==" }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==" }, "loader-utils": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha512-gkD9aSEG9UGglyPcDJqY9YBTUtCLKaBK6ihD2VP1d1X60lTfFspNZNulGBBbUZLkPygy4LySYHyxBpq+VhjObQ==", "requires": { "big.js": "^3.1.3", "emojis-list": "^2.0.0", "json5": "^0.5.0" } } } }, "svgo": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "requires": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^4.1.3", "css-tree": "^1.1.3", "csso": "^4.2.0", "picocolors": "^1.0.0", "stable": "^0.1.8" }, "dependencies": { "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" }, "css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "requires": { "boolbase": "^1.0.0", "css-what": "^6.0.1", "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" } }, "dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "requires": { "domelementtype": "^2.2.0" } }, "domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" } }, "entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" } } }, "swap-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz", "integrity": "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==", "requires": { "tslib": "^2.0.3" } }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" }, "table": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "requires": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1" }, "dependencies": { "ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } } } }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "requires": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "requires": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" }, "dependencies": { "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } } } }, "term-size": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" }, "terser": { "version": "5.16.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } } } }, "terser-webpack-plugin": { "version": "5.3.6", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "requires": { "@jridgewell/trace-mapping": "^0.3.14", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "terser": "^5.14.1" }, "dependencies": { "jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "requires": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "requires": { "randombytes": "^2.1.0" } }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "requires": { "has-flag": "^4.0.0" } } } }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "theming": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/theming/-/theming-1.3.0.tgz", "integrity": "sha512-ya5Ef7XDGbTPBv5ENTwrwkPUexrlPeiAg/EI9kdlUAZhNlRbCdhMKRgjNX1IcmsmiPcqDQZE6BpSaH+cr31FKw==", "requires": { "brcast": "^3.0.1", "is-function": "^1.0.1", "is-plain-object": "^2.0.1", "prop-types": "^15.5.8" } }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", "requires": { "es5-ext": "~0.10.46", "next-tick": "1" } }, "tippy.js": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-4.3.5.tgz", "integrity": "sha512-NDq3efte8nGK6BOJ1dDN1/WelAwfmh3UtIYXXck6+SxLzbIQNZE/cmRSnwScZ/FyiKdIcvFHvYUgqmoGx8CcyA==", "requires": { "popper.js": "^1.14.7" } }, "title-case": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", "requires": { "tslib": "^2.0.3" } }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "requires": { "rimraf": "^3.0.0" }, "dependencies": { "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { "glob": "^7.1.3" } } } }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", "dev": true }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", "dev": true, "optional": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "optional": true }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "optional": true, "requires": { "is-buffer": "^1.1.5" } } } }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "optional": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "optional": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" } }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "optional": true, "requires": { "is-plain-object": "^2.0.4" } } } }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { "is-number": "^7.0.0" }, "dependencies": { "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" } } }, "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "token-types": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", "requires": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "traverse": { "version": "0.6.6", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", "integrity": "sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==" }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" }, "trim-lines": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-1.1.3.tgz", "integrity": "sha512-E0ZosSWYK2mkSu+KEtQ9/KqarVjA9HztOSX+9FDdNacRAq29RRV6ZQNgob3iuW8Htar9vAfEa6yyt5qBAHZDBA==" }, "trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", "requires": { "escape-string-regexp": "^1.0.2" } }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", "dev": true }, "trough": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" }, "true-case-path": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==" }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { "json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "requires": { "minimist": "^1.2.0" } } } }, "tslib": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" }, "tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "requires": { "tslib": "^1.8.1" }, "dependencies": { "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" } } }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "requires": { "safe-buffer": "^5.0.1" } }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "requires": { "prelude-ls": "^1.2.1" } }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "type-of": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-of/-/type-of-2.0.1.tgz", "integrity": "sha512-39wxbwHdQ2sTiBB8wAzKfQ9GN+om8w+sjNWzr+vZJR5AMD5J+J7Yc8AtXnU9r/r2c8XiDZ/smxutDmZehX/qpQ==" }, "typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "requires": { "call-bind": "^1.0.2", "for-each": "^0.3.3", "is-typed-array": "^1.1.9" } }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "requires": { "is-typedarray": "^1.0.0" } }, "typescript": { "version": "4.9.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "peer": true }, "ua-parser-js": { "version": "0.7.32", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==" }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "requires": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==" }, "underscore.string": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", "requires": { "sprintf-js": "^1.1.1", "util-deprecate": "^1.0.2" }, "dependencies": { "sprintf-js": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" } } }, "unherit": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", "requires": { "inherits": "^2.0.0", "xtend": "^4.0.0" } }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" }, "unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "requires": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==" }, "unicode-property-aliases-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" }, "unified": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", "requires": { "bail": "^1.0.0", "extend": "^3.0.0", "is-buffer": "^2.0.0", "is-plain-obj": "^2.0.0", "trough": "^1.0.0", "vfile": "^4.0.0" } }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "optional": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" } }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "requires": { "crypto-random-string": "^2.0.0" } }, "unist-builder": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" }, "unist-util-generated": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" }, "unist-util-is": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" }, "unist-util-modify-children": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-2.0.0.tgz", "integrity": "sha512-HGrj7JQo9DwZt8XFsX8UD4gGqOsIlCih9opG6Y+N11XqkBGKzHo8cvDi+MfQQgiZ7zXRUiQREYHhjOBHERTMdg==", "requires": { "array-iterate": "^1.0.0" } }, "unist-util-position": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" }, "unist-util-remove": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-1.0.3.tgz", "integrity": "sha512-mB6nCHCQK0pQffUAcCVmKgIWzG/AXs/V8qpS8K72tMPtOSCMSjDeMc5yN+Ye8rB0FhcE+JvW++o1xRNc0R+++g==", "requires": { "unist-util-is": "^3.0.0" }, "dependencies": { "unist-util-is": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" } } }, "unist-util-remove-position": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-3.0.0.tgz", "integrity": "sha512-17kIOuolVuK16LMb9KyMJlqdfCtlfQY5FjY3Sdo9iC7F5wqdXhNjMq0PBvMpkVNNnAmHxXssUW+rZ9T2zbP0Rg==", "requires": { "unist-util-visit": "^2.0.0" }, "dependencies": { "unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" } } } }, "unist-util-select": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-3.0.4.tgz", "integrity": "sha512-xf1zCu4okgPqGLdhCDpRnjwBNyv3EqjiXRUbz2SdK1+qnLMB7uXXajfzuBvvbHoQ+JLyp4AEbFCGndmc6S72sw==", "requires": { "css-selector-parser": "^1.0.0", "not": "^0.1.0", "nth-check": "^2.0.0", "unist-util-is": "^4.0.0", "zwitch": "^1.0.0" } }, "unist-util-stringify-position": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", "requires": { "@types/unist": "^2.0.2" } }, "unist-util-visit": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", "requires": { "unist-util-visit-parents": "^2.0.0" }, "dependencies": { "unist-util-is": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" }, "unist-util-visit-parents": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", "requires": { "unist-util-is": "^3.0.0" } } } }, "unist-util-visit-children": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz", "integrity": "sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ==" }, "unist-util-visit-parents": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0" } }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, "unixify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", "requires": { "normalize-path": "^2.1.1" } }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", "dev": true, "optional": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" }, "dependencies": { "has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", "dev": true, "optional": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", "isobject": "^2.0.0" }, "dependencies": { "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", "dev": true, "optional": true, "requires": { "isarray": "1.0.0" } } } }, "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", "dev": true, "optional": true }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "optional": true } } }, "update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" } }, "update-notifier": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "requires": { "boxen": "^5.0.0", "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", "is-installed-globally": "^0.4.0", "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", "latest-version": "^5.1.0", "pupa": "^2.1.1", "semver": "^7.3.4", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "upper-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", "requires": { "tslib": "^2.0.3" } }, "upper-case-first": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", "requires": { "tslib": "^2.0.3" } }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { "punycode": "^2.1.0" } }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==" }, "url-loader": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", "requires": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", "schema-utils": "^3.0.0" } }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "requires": { "prepend-http": "^2.0.0" } }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true, "optional": true }, "user-home": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", "integrity": "sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==", "dev": true }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "utility-types": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, "v8flags": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", "integrity": "sha512-SKfhk/LlaXzvtowJabLZwD4K6SGRYeoxA7KJeISlUMAB/NT4CBkZjMq3WceX2Ckm4llwqYVo8TICgsDYCBU2tA==", "dev": true, "requires": { "user-home": "^1.1.1" } }, "valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" }, "value-or-promise": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz", "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==" }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, "vfile": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", "unist-util-stringify-position": "^2.0.0", "vfile-message": "^2.0.0" } }, "vfile-location": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" }, "vfile-message": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", "requires": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^2.0.0" } }, "warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", "requires": { "loose-envify": "^1.0.0" } }, "watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "weak-lru-cache": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==" }, "web-namespaces": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" }, "web-vitals": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { "version": "5.75.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { "@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, "webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" } } }, "webpack-dev-middleware": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.3.0.tgz", "integrity": "sha512-PjwyVY95/bhBh6VUqt6z4THplYcsvQ8YNNBTBM873xLVmw8FLeALn0qurHbs9EmcfhzQis/eoqypSnZeuUz26w==", "requires": { "colorette": "^1.2.2", "mem": "^8.1.1", "memfs": "^3.2.2", "mime-types": "^2.1.30", "range-parser": "^1.2.1", "schema-utils": "^3.0.0" } }, "webpack-merge": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "requires": { "clone-deep": "^4.0.1", "wildcard": "^2.0.0" } }, "webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "webpack-stats-plugin": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/webpack-stats-plugin/-/webpack-stats-plugin-1.1.1.tgz", "integrity": "sha512-aWwE/YuO2W7VCOyWwyDJ7BRSYRYjeXat+X31YiasMM3FS6/4X9W4Mb9Q0g+jIdVgArr1Mb08sHBJKMT5M9+gVA==" }, "webpack-virtual-modules": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.3.2.tgz", "integrity": "sha512-RXQXioY6MhzM4CNQwmBwKXYgBs6ulaiQ8bkNQEl2J6Z+V+s7lgl/wGvaI/I0dLnYKB8cKsxQc17QOAVIphPLDw==", "requires": { "debug": "^3.0.0" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { "isexe": "^2.0.0" } }, "which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" } }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" }, "which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", "is-typed-array": "^1.1.10" } }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "requires": { "string-width": "^4.0.0" } }, "wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "workbox-background-sync": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-broadcast-update": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-build": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", "requires": { "@babel/runtime": "^7.3.4", "@hapi/joi": "^15.0.0", "common-tags": "^1.8.0", "fs-extra": "^4.0.2", "glob": "^7.1.3", "lodash.template": "^4.4.0", "pretty-bytes": "^5.1.0", "stringify-object": "^3.3.0", "strip-comments": "^1.0.2", "workbox-background-sync": "^4.3.1", "workbox-broadcast-update": "^4.3.1", "workbox-cacheable-response": "^4.3.1", "workbox-core": "^4.3.1", "workbox-expiration": "^4.3.1", "workbox-google-analytics": "^4.3.1", "workbox-navigation-preload": "^4.3.1", "workbox-precaching": "^4.3.1", "workbox-range-requests": "^4.3.1", "workbox-routing": "^4.3.1", "workbox-strategies": "^4.3.1", "workbox-streams": "^4.3.1", "workbox-sw": "^4.3.1", "workbox-window": "^4.3.1" }, "dependencies": { "fs-extra": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "requires": { "graceful-fs": "^4.1.6" } }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" } } }, "workbox-cacheable-response": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-core": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" }, "workbox-expiration": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-google-analytics": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", "requires": { "workbox-background-sync": "^4.3.1", "workbox-core": "^4.3.1", "workbox-routing": "^4.3.1", "workbox-strategies": "^4.3.1" } }, "workbox-navigation-preload": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-precaching": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-range-requests": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-routing": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-strategies": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-streams": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-sw": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==" }, "workbox-window": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", "requires": { "workbox-core": "^4.3.1" } }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "requires": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "requires": {} }, "xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" }, "xml2js": { "version": "0.4.17", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", "integrity": "sha512-1O7wk/NTQN0UEOItIYTxK4qP4sMUVU60MbF4Nj0a8jd6eebMXOicVI/KFOEsYKKH4uBpx6XG9ZGZctXK5rtO5Q==", "requires": { "sax": ">=0.6.0", "xmlbuilder": "^4.1.0" } }, "xmlbuilder": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", "integrity": "sha512-oEePiEefhQhAeUnwRnIBLBWmk/fsWWbQ53EEWsRuzECbQ3m5o/Esmq6H47CYYwSLW+Ynt0rS9hd0pd2ogMAWjg==", "requires": { "lodash": "^4.0.0" } }, "xmlhttprequest-ssl": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==" }, "xss": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", "requires": { "commander": "^2.20.3", "cssfilter": "0.0.10" } }, "xstate": { "version": "4.32.1", "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.32.1.tgz", "integrity": "sha512-QYUd+3GkXZ8i6qdixnOn28bL3EvA++LONYL/EMWwKlFSh/hiLndJ8YTnz77FDs+JUXcwU7NZJg7qoezoRHc4GQ==" }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "xxhash-wasm": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==" }, "y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yaml-loader": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.8.0.tgz", "integrity": "sha512-LjeKnTzVBKWiQBeE2L9ssl6WprqaUIxCSNs5tle8PaDydgu3wVFXTbMfsvF2MSErpy9TDVa092n4q6adYwJaWg==", "requires": { "javascript-stringify": "^2.0.1", "loader-utils": "^2.0.0", "yaml": "^2.0.0" }, "dependencies": { "yaml": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==" } } }, "yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "requires": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" }, "dependencies": { "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { "p-locate": "^4.1.0" } }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "^2.2.0" } } } }, "yargs-parser": { "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" }, "dependencies": { "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" } } }, "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" }, "yoga-layout-prebuilt": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz", "integrity": "sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==", "requires": { "@types/yoga-layout": "1.9.2" } }, "yurnalist": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/yurnalist/-/yurnalist-2.1.0.tgz", "integrity": "sha512-PgrBqosQLM3gN2xBFIMDLACRTV9c365VqityKKpSTWpwR+U4LAFR3rSVyEoscWlu3EzX9+Y0I86GXUKxpHFl6w==", "requires": { "chalk": "^2.4.2", "inquirer": "^7.0.0", "is-ci": "^2.0.0", "read": "^1.0.7", "strip-ansi": "^5.2.0" }, "dependencies": { "ansi-regex": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" } }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } } } }, "zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" } } } thinc-release-v9.1.1/website/package.json000066400000000000000000000052451467064331700204040ustar00rootroot00000000000000{ "name": "thinc.ai", "private": true, "description": "Thinc website", "version": "0.0.1", "author": "Explosion ", "dependencies": { "@tippy.js/react": "^2.2.2", "autoprefixer": "^10.4.13", "classnames": "^2.2.6", "gatsby": "^4.18.2", "gatsby-image": "^2.11.0", "gatsby-plugin-google-analytics": "^4.25.0", "gatsby-plugin-manifest": "^4.25.0", "gatsby-plugin-offline": "^5.25.0", "gatsby-plugin-plausible": "^0.0.7", "gatsby-plugin-react-helmet": "^5.25.0", "gatsby-plugin-react-svg": "^3.3.0", "gatsby-plugin-remove-trailing-slashes": "^4.19.0", "gatsby-plugin-sass": "^5.25.0", "gatsby-plugin-sass-resources": "^3.0.1", "gatsby-plugin-sharp": "^4.25.0", "gatsby-plugin-sitemap": "^5.25.0", "gatsby-remark-copy-linked-files": "^5.25.0", "gatsby-remark-images": "^6.25.0", "gatsby-remark-prismjs": "^6.25.0", "gatsby-remark-smartypants": "^5.25.0", "gatsby-remark-unwrap-images": "^1.0.2", "gatsby-source-filesystem": "^4.25.0", "gatsby-transformer-remark": "^5.25.1", "gatsby-transformer-sharp": "^4.25.0", "html-to-react": "^1.3.4", "parse-numeric-range": "0.0.2", "prismjs": "^1.15.0", "react": "^16.8.2", "react-dom": "^16.8.2", "react-helmet": "^5.2.0", "react-jss": "^8.6.1", "rehype-react": "^3.1.0", "remark-react": "^5.0.1", "slugify": "^1.3.6" }, "scripts": { "deploy": "npm run fonts:fetch && npm run build", "build": "gatsby build", "dev": "gatsby develop", "lint": "eslint src", "clear": "rm -rf .cache", "test": "echo \"Write tests! -> https://gatsby.app/unit-testing\"", "fonts:fetch": "wget -O fonts.zip $SECRET_FONTS_URL; unzip fonts.zip -d ./src/fonts; rm fonts.zip" }, "devDependencies": { "babel-cli": "^6.26.0", "babel-core": "^6.26.0", "babel-plugin-transform-class-properties": "^6.24.1", "babel-plugin-transform-decorators-legacy": "^1.3.4", "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-plugin-transform-react-remove-prop-types": "^0.4.13", "babel-preset-env": "^1.6.1", "babel-preset-react": "^6.24.1", "json5": "^2.1.0", "md-attr-parser": "^1.2.1", "prettier": "^1.16.4", "unist-util-remove": "^1.0.3", "unist-util-visit": "^1.4.0" }, "repository": { "type": "git", "url": "https://github.com/explosion/thinc" }, "engines": { "node": "16" } } thinc-release-v9.1.1/website/plugins/000077500000000000000000000000001467064331700175715ustar00rootroot00000000000000thinc-release-v9.1.1/website/plugins/gatsby-remark-code-blocks/000077500000000000000000000000001467064331700245245ustar00rootroot00000000000000thinc-release-v9.1.1/website/plugins/gatsby-remark-code-blocks/index.js000066400000000000000000000047311467064331700261760ustar00rootroot00000000000000/** * Support titles, line highlights and more for code blocks */ const visit = require('unist-util-visit') const parseAttr = require('md-attr-parser') const defaultOptions = { defaultPrefix: '###', prefixMap: { javascript: '///', jsx: '///', }, languageAliases: {}, githubRegex: /^https:\/\/(github|raw.githubusercontent).com/, prompts: ['$'], } module.exports = ({ markdownAST }, userOptions = {}) => { const options = Object.assign({}, defaultOptions, userOptions) visit(markdownAST, 'code', node => { if (node.value) { const langName = node.lang || 'none' const lang = options.languageAliases[langName] || langName const prefix = options.prefixMap[lang] || options.defaultPrefix const lines = node.value.split('\n') let attrs = { lang } const firstLine = lines[0].trim() if (firstLine && firstLine.startsWith(prefix)) { const title = firstLine.slice(prefix.length).trim() attrs.title = title // Check for attributes in title, e.g. {executable="true"} const parsed = title.split(/\{(.*?)\}/) if (parsed.length >= 2 && parsed[1]) { const { prop } = parseAttr(parsed[1]) attrs = { ...attrs, ...prop, title: parsed[0].trim(), lang } } // Overwrite the code text with the rest of the lines node.value = lines.slice(1).join('\n') } else if (firstLine && options.githubRegex.test(firstLine)) { // GitHub URL attrs.github = 'true' } // If it's a bash code block and single line, check for prompts if (lang === 'bash') { const [trueFirstLine, ...trueLines] = node.value.split('\n') for (let prompt of options.prompts) { if (trueFirstLine.startsWith(prompt)) { const content = [trueFirstLine.slice(prompt.length).trim(), ...trueLines] attrs.prompt = prompt node.value = content.join('\n') break } } } const data = node.data || (node.data = {}) const hProps = data.hProperties || (data.hProperties = {}) node.data.hProperties = Object.assign({}, hProps, attrs) } }) return markdownAST } thinc-release-v9.1.1/website/plugins/gatsby-remark-code-blocks/package.json000066400000000000000000000003351467064331700270130ustar00rootroot00000000000000{ "name": "gatsby-remark-code-blocks", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" } thinc-release-v9.1.1/website/plugins/gatsby-remark-custom-attrs/000077500000000000000000000000001467064331700250045ustar00rootroot00000000000000thinc-release-v9.1.1/website/plugins/gatsby-remark-custom-attrs/index.js000066400000000000000000000041331467064331700264520ustar00rootroot00000000000000/** * Simplified implementation of remark-attr that allows custom attributes on * nodes *inline* via the following syntax: {#some-id key="value"}. Extracting * them inline is slightly hackier (at least in this implementation), but it * makes the resulting markup valid and compatible with formatters like * Prettier, which do not allow additional content right below headlines. * Based on: https://github.com/arobase-che/remark-attr */ const visit = require('unist-util-visit') const parseAttr = require('md-attr-parser') const defaultOptions = { elements: ['heading'], } module.exports = ({ markdownAST }, userOptions = {}) => { const options = Object.assign({}, defaultOptions, userOptions) visit(markdownAST, null, node => { if (options.elements.includes(node.type)) { if ( node.children && node.children.length && node.children[node.children.length - 1].type === 'text' && node.children[node.children.length - 1].value ) { if (node.children.length > 1 && node.children.every(el => el.type === 'text')) { // If headlines contain escaped characters, e.g. // Doc.\_\_init\_\_, it will be split into several nodes const mergedText = node.children.map(el => el.value).join('') node.children[0].value = mergedText node.children = [node.children[0]] } const lastIdx = node.children.length - 1 const parsed = node.children[lastIdx].value.split(/\{(.*?)\}/) if (parsed.length >= 2 && parsed[1]) { const text = parsed[0] const { prop } = parseAttr(parsed[1]) const data = node.data || (node.data = {}) const hProps = data.hProperties || (data.hProperties = {}) node.data.hProperties = Object.assign({}, hProps, prop) node.children[lastIdx].value = text } } } }) return markdownAST } thinc-release-v9.1.1/website/plugins/gatsby-remark-custom-attrs/package.json000066400000000000000000000003361467064331700272740ustar00rootroot00000000000000{ "name": "gatsby-remark-custom-attrs", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" } thinc-release-v9.1.1/website/plugins/gatsby-remark-unwrap/000077500000000000000000000000001467064331700236535ustar00rootroot00000000000000thinc-release-v9.1.1/website/plugins/gatsby-remark-unwrap/index.js000066400000000000000000000015701467064331700253230ustar00rootroot00000000000000/** * Unwrap elements and remove outer

* Fork of: https://github.com/xuopled/gatsby-remark-unwrap-images */ const visit = require('unist-util-visit') const remove = require('unist-util-remove') const defaultOptions = { elements: ['image', 'html'], } function isWrapped(child, elements = []) { return elements.includes(child.type) || (child.type === 'text' && child.value === '\n') } module.exports = ({ markdownAST }, userOptions = {}) => { const options = Object.assign({}, defaultOptions, userOptions) const elements = options.elements || [] visit(markdownAST, 'paragraph', (node, index, parent) => { const wrapped = node.children.every(child => isWrapped(child, elements)) if (!wrapped) return remove(node, 'text') parent.children.splice(index, 1, ...node.children) return index }) return markdownAST } thinc-release-v9.1.1/website/plugins/gatsby-remark-unwrap/package.json000066400000000000000000000003301467064331700261350ustar00rootroot00000000000000{ "name": "gatsby-remark-unwrap", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" } thinc-release-v9.1.1/website/src/000077500000000000000000000000001467064331700166775ustar00rootroot00000000000000thinc-release-v9.1.1/website/src/components/000077500000000000000000000000001467064331700210645ustar00rootroot00000000000000thinc-release-v9.1.1/website/src/components/box.js000066400000000000000000000013131467064331700222100ustar00rootroot00000000000000import React from 'react' import classNames from 'classnames' import * as classes from '../styles/box.module.sass' export const Box = ({ Component = 'section', id, className, children }) => ( {children} ) export const Infobox = ({ variant, children }) => { const infoboxClassNames = classNames(classes.infobox, { [classes.warning]: variant === 'warning', [classes.danger]: variant === 'danger', }) return ( {variant ? '!' : 'i'} {children} ) } thinc-release-v9.1.1/website/src/components/code.js000066400000000000000000000150661467064331700223440ustar00rootroot00000000000000import React, { useState, useEffect, Fragment } from 'react' import classNames from 'classnames' import highlightCode from 'gatsby-remark-prismjs/highlight-code.js' import rangeParser from 'parse-numeric-range' import Icon from './icon' import Link from './link' import { H5 } from './typography' import { isString, htmlToReact, isTrue, getStringChildren } from '../util' import CUSTOM_TYPES from '../../docs/_type_links.json' import * as classes from '../styles/code.module.sass' const GITHUB_URL_SPLIT_PATH = 'thinc/' const DEFAULT_TYPE_URL = CUSTOM_TYPES.__default__ function getGitHubPath(url) { if (!url.includes(GITHUB_URL_SPLIT_PATH)) { return url.split('github.com/').slice(-1) } const path = url.split(`/${GITHUB_URL_SPLIT_PATH}`).slice(-1) return `${GITHUB_URL_SPLIT_PATH}${path}` } function linkType(el, showLink = true) { if (!isString(el) || !el.length) return el const elStr = el.trim() if (!elStr) return el const typeUrl = CUSTOM_TYPES[elStr] const url = typeUrl == true ? DEFAULT_TYPE_URL : typeUrl const ws = el[0] == ' ' return url && showLink ? ( {ws && ' '} {elStr} ) : ( el ) } export const InlineCode = ({ wrap, prompt, className, children, ...props }) => { const codeClassNames = classNames(classes.inlineCode, className, { [classes.wrap]: wrap || (isString(children) && children.length >= 20), }) return ( {children} ) } export const Kbd = ({ children }) => {children} export const Pre = ({ children, className, ...props }) => (
        {children}
    
) export const CodeComponent = ({ lang = 'none', highlight, github = false, children, className, ...props }) => { const codeText = Array.isArray(children) ? children.join('') : children || '' const isGitHub = isTrue(github) if (isGitHub) { return } const highlightRange = highlight ? rangeParser.parse(highlight).filter(n => n > 0) : [] const html = lang === 'none' ? codeText : highlightCode(lang, codeText, {}, highlightRange) return } const CodeWrapper = ({ title, html, lang = 'none', small = false, wrap = false, prompt, className, children, ...props }) => { const codeClassNames = classNames(className, `language-${lang}`, { [classes.small]: isTrue(small), [classes.wrap]: isTrue(wrap), }) const tagClassNames = classNames(classes.titleTag, { [classes.titleTagSmall]: isTrue(small), }) return ( <> {title && ( {title} )} {children} {htmlToReact(html)} ) } const GitHubCode = React.memo(({ url, lang }) => { const errorMsg = `Can't fetch code example from GitHub :( Please use the link above to view the example. If you've come across a broken link, we always appreciate a pull request to the repository, or a report on the issue tracker. Thanks!` const [initialized, setInitialized] = useState(false) const [code, setCode] = useState(errorMsg) const rawUrl = url .replace('github.com', 'raw.githubusercontent.com') .replace('/blob', '') .replace('/tree', '') useEffect(() => { if (!initialized) { setCode(null) fetch(rawUrl) .then(res => res.text().then(text => ({ text, ok: res.ok }))) .then(({ text, ok }) => { setCode(ok ? text : errorMsg) }) .catch(err => { setCode(errorMsg) console.error(err) }) setInitialized(true) } }, [initialized, rawUrl, errorMsg]) const html = lang === 'none' || !code ? code : highlightCode(lang, code) const title = ( View on GitHub ) return (
{' '} {getGitHubPath(url)}
) }) export const CodeBlock = props => (
        
    
) export const TypeAnnotation = ({ lang = 'python', link = true, children }) => { const showLink = isTrue(link) const code = Array.isArray(children) ? children.join('') : children || '' const html = lang === 'none' || !code ? code : highlightCode(lang, code) const result = htmlToReact(html) const elements = Array.isArray(result) ? result : [result] const annotClassNames = classNames( 'type-annotation', `language-${lang}`, classes.typeAnnotation, { [classes.wrap]: code.length >= 20, } ) return ( {elements.map((el, i) => ( {linkType(el, showLink)} ))} ) } export const Ndarray = ({ shape, link = true, children }) => { const strChildren = getStringChildren(children) const html = highlightCode('python', strChildren) const result = htmlToReact(html) const elements = Array.isArray(result) ? result : [result] return ( {elements.map((el, i) => ( {linkType(el, isTrue(link))} ))} {' '} {shape && ( {`(${shape})`} )} ) } export const CodeScreenshot = ({ width, children }) => (
{children}
) thinc-release-v9.1.1/website/src/components/dropdown.js000066400000000000000000000013641467064331700232620ustar00rootroot00000000000000import React from 'react' import classNames from 'classnames' import { navigate } from 'gatsby' import * as classes from '../styles/dropdown.module.sass' const Dropdown = ({ defaultValue, className, onChange, children }) => { const defaultOnChange = ({ target }) => { const isExternal = /((http(s?)):\/\/|mailto:)/gi.test(target.value) if (isExternal) { window.location.href = target.value } else { navigate(target.value) } } return ( ) } export default Dropdown thinc-release-v9.1.1/website/src/components/footer.js000066400000000000000000000036361467064331700227300ustar00rootroot00000000000000import React from 'react' import { graphql, StaticQuery } from 'gatsby' import classNames from 'classnames' import Link from './link' import Icon from './icon' import * as classes from '../styles/footer.module.sass' export default ({ className }) => ( { const { twitter, github, company, companyUrl, imprintUrl } = site.siteMetadata return (
  • © 2017- {new Date().getFullYear()}{' '} {company}
  • Legal & Imprint
) }} /> ) const query = graphql` query { site { siteMetadata { company companyUrl imprintUrl email twitter github } } } ` thinc-release-v9.1.1/website/src/components/grid.js000066400000000000000000000005261467064331700223520ustar00rootroot00000000000000import React from 'react' import classNames from 'classnames' import * as classes from '../styles/grid.module.sass' export default ({ layout = 'auto', children }) => { const gridClassNames = classNames(classes.root, { [classes.feature]: layout === 'feature', }) return
{children}
} thinc-release-v9.1.1/website/src/components/icon.js000066400000000000000000000030111467064331700223450ustar00rootroot00000000000000import React from 'react' import classNames from 'classnames' import * as classes from '../styles/icon.module.sass' import TwitterIcon from '../images/icons/twitter.svg' import GitHubIcon from '../images/icons/github.svg' import ArrowRightIcon from '../images/icons/arrow-right.svg' import YesIcon from '../images/icons/yes.svg' import NoIcon from '../images/icons/no.svg' import CubeIcon from '../images/icons/cube.svg' import FileIcon from '../images/icons/file.svg' const ICONS = { twitter: TwitterIcon, github: GitHubIcon, right: ArrowRightIcon, yes: YesIcon, no: NoIcon, cube: CubeIcon, file: FileIcon, } export default ({ name, size = 16, alt = null, className, ...props }) => { const SvgIcon = ICONS[name] if (!SvgIcon) throw Error(`Invalid icon name: '${name}'`) const style = { minWidth: size } const iconClassNames = classNames(classes.root, className, { [classes.red]: name === 'no', [classes.green]: name === 'yes', }) const altTexts = { yes: 'yes', no: 'no' } return ( ) } export const Emoji = ({ alt, children }) => { const attrs = alt ? { role: 'img', 'aria-label': alt } : { 'aria-hidden': true } return ( {children} ) } thinc-release-v9.1.1/website/src/components/landing.js000066400000000000000000000074641467064331700230510ustar00rootroot00000000000000import React from 'react' import classNames from 'classnames' import { graphql, StaticQuery } from 'gatsby' import Img from 'gatsby-image' import { InlineCode as DefaultInlineCode } from '../components/code' import Link, { Button } from '../components/link' import { H3 } from '../components/typography' import { Emoji } from '../components/icon' import ExplosionLogo from '../images/logos/explosion.svg' import Logo from '../images/logo.svg' import * as classes from '../styles/landing.module.sass' const headerQuery = graphql` query { site { siteMetadata { company companyUrl } } headerTopLeft: file(relativePath: { eq: "landing_top-left.png" }) { ...headerImage } headerTopRight: file(relativePath: { eq: "landing_top-right.png" }) { ...headerImage } } ` export const headerImage = graphql` fragment headerImage on File { childImageSharp { fluid(maxWidth: 1200, quality: 100) { ...GatsbyImageSharpFluid } } } ` export const Header = ({ logo = true, logoLink, companyLogo = true, children }) => { const logoSvg = return ( { const { company, companyUrl } = data.site.siteMetadata return (
{companyLogo && ( )}
{logo && logoLink ? ( {logoSvg} ) : ( logoSvg )}
{children}
) }} /> ) } export const InlineCode = props => export const Section = ({ title, to, buttonText = 'Read more', narrow = false, className, children, }) => { const sectionClassNames = classNames(classes.section, className, { [classes.sectionNarrow]: narrow, }) return (
{title && (

{title}

)} {children} {to && ( )}
) } export const Feature = ({ title, emoji, children }) => (

{emoji && {emoji}} {title}

{children}
) export const FeatureGrid = ({ children }) =>
{children}
thinc-release-v9.1.1/website/src/components/layout.js000066400000000000000000000004141467064331700227360ustar00rootroot00000000000000import React from 'react' import SEO from './seo' const Layout = ({ title, description, className, children }) => ( <>
{children}
) export default Layout thinc-release-v9.1.1/website/src/components/link.js000066400000000000000000000037461467064331700223710ustar00rootroot00000000000000import React from 'react' import { Link as GatsbyLink } from 'gatsby' import classNames from 'classnames' import Icon from './icon' import * as classes from '../styles/link.module.sass' const internalRegex = /(http(s?)):\/\/(explosion.ai|prodi.gy|spacy.io|irl.spacy.io|support.prodi.gy)/gi const Link = ({ type, ...props }) => { // This is a workaround for the gatsby-remark-copy-linked-files, which // only recognizes
elements, not a custom