diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..1d1ce117 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.md linguist-detectable=true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0bde78ab..90a384cd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,39 +3,83 @@ name: CI on: push: branches: - - "*" + - master pull_request: + # Allow running manually + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: "pages" + cancel-in-progress: true + +defaults: + run: + shell: bash + jobs: - build: + spellcheck: runs-on: ubuntu-latest steps: + - name: Checkout sources + uses: actions/checkout@v3 - - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 with: - submodules: true + node-version: '16' - - name: Setup Hugo - uses: peaceiris/actions-hugo@v2 + - name: Install + run: npm install + + - name: Spellcheck + run: npm run spellcheck + + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 with: - hugo-version: '0.87.0' - extended: true + submodules: recursive - - name: Setup node - uses: actions/setup-node@v1 + - name: Set up Python + uses: actions/setup-python@v4 with: - node-version: '14.x' + python-version: '3.9' + cache: 'pip' + + - run: pip install -r requirements.txt + + - name: Setup Pages + uses: actions/configure-pages@v1 - - uses: actions/cache@v1 + - name: Build + run: | + mkdocs build + + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 with: - path: $HOME/.npm - key: npm-${{ hashFiles('package-lock.json') }} + path: ./site + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest - - name: Install Dependencies - run: npm ci + needs: + - spellcheck + - build - - name: Build site - run: ./scripts/build.sh + if: github.ref_name == 'master' || github.ref_name == 'sp2023' - - name: Run tests - run: npm run ci-test + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v1 diff --git a/.gitignore b/.gitignore index 6817efec..d3204f2e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,73 +1,5 @@ - -# Created by https://www.gitignore.io/api/node,hugo,intellij - -### Hugo ### -hugo.exe -/public/ -### Intellij ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff: -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/dictionaries - -# Sensitive or high-churn files: -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.xml -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml - -# Gradle: -.idea/**/gradle.xml -.idea/**/libraries - -# CMake -cmake-build-debug/ - -# Mongo Explorer plugin: -.idea/**/mongoSettings.xml - -## File-based project format: -*.iws - -## Plugin-specific files: - -# IntelliJ -/out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# Ruby plugin and RubyMine -/.rakeTasks - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -### Intellij Patch ### -# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 - -# *.iml -# modules.xml -# .idea/misc.xml -# *.ipr - -# Sonarlint plugin -.idea/sonarlint +# Created by https://www.toptal.com/developers/gitignore/api/python,node +# Edit at https://www.toptal.com/developers/gitignore?templates=python,node ### Node ### # Logs @@ -76,6 +8,11 @@ logs npm-debug.log* yarn-debug.log* yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json # Runtime data pids @@ -88,11 +25,12 @@ lib-cov # Coverage directory used by tools like istanbul coverage +*.lcov # nyc test coverage .nyc_output -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) .grunt # Bower dependency directory (https://bower.io/) @@ -101,15 +39,18 @@ bower_components # node-waf configuration .lock-wscript -# Compiled binary addons (http://nodejs.org/api/addons.html) +# Compiled binary addons (https://nodejs.org/api/addons.html) build/Release # Dependency directories node_modules/ jspm_packages/ -# Typescript v1 declaration files -typings/ +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo # Optional npm cache directory .npm @@ -117,6 +58,15 @@ typings/ # Optional eslint cache .eslintcache +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + # Optional REPL history .node_repl_history @@ -126,10 +76,238 @@ typings/ # Yarn Integrity file .yarn-integrity -# dotenv environment variables file +# dotenv environment variable files .env - - -# End of https://www.gitignore.io/api/node,hugo,intellij - -content/tutorials/kit-assembly.files +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + +# ruff +.ruff_cache/ + +# LSP config files +pyrightconfig.json + +# End of https://www.toptal.com/developers/gitignore/api/python,node diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index adc12ab0..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "themes/learn"] - path = themes/learn - url = https://github.com/matcornic/hugo-theme-learn diff --git a/.spelling b/.spelling index 0d3511f3..3cdb30e6 100644 --- a/.spelling +++ b/.spelling @@ -1,79 +1,20 @@ -× -100x100mm -11.1V -15cm -2.2A. -2m -4.5m -2.5m -20000Hz -20Hz -2200mAh -250x250mm -2m -2mm -3.3V -3.81mm -3m -4mm -5cm -5mm -7-zip -7.5mm -70x84x20mm -83x99x24mm -Adafruit -AprilTag -Arduino -booleans -CamCon -CamCons -Codecademy +# Custom spellings for this repo. +# +# Keep each section alphabetically sorted. +BIDMAS Datacamp -dropdown -elif -energised -enum -forklift -FreeCodeCamp -H0-1 -iMAX -inputted -IntelliSense -kickstart -L0-3 -LearnPython -LiPo -macOS -Math -matplotlib -microswitch -microswitches -numpy -piezo -plt +GPIO Programiz -PyCharm -pyplot -python3 -r.zone -R2021b -scikit-learn -scipy -Smallpeice -SourceBots -square-ish -StackOverflow -submodule -TargetInfo -TeckNet Tutorialspoint -Uno -vcc -VSCode -W3Schools -Webots -www.python.org -python-396 -_f_ -× +piezo + +# Specific +PULLUP +sbot +Smallpeice + +# Technical things +fontawesome +matplotlib +scikit +scipy diff --git a/README.md b/README.md index 97c98949..4dcfcec3 100644 --- a/README.md +++ b/README.md @@ -2,30 +2,61 @@ [![CI](https://github.com/sourcebots/docs/actions/workflows/ci.yml/badge.svg)](https://github.com/sourcebots/docs/actions/workflows/ci.yml) -URL: http://docs.sourcebots.co.uk +URL: https://docs.sourcebots.co.uk -## Requirements -- [Hugo](https://gohugo.io) (>=0.87.0) -- [NodeJS](https://nodejs.org/) (>=14) (required for tests only) +## Installation -## Local Setup -1. `npm install` -2. `git submodule update --init` -3. `./scripts/build.sh` +To run this project locally, you'll need: -The site will be output to `public/`. +- Python (`>=3.6, <3.12`) +- `pip` +## Usage -## Dev server -`./scripts/server.sh` will start a server on http://localhost:1313. +### Installing dependencies -## Tests -Running tests locally is optional, as they're automatically run by the CI in PRs. +It's recommended to use a [virtual environment](https://docs.python.org/3/tutorial/venv.html): -Currently, the only test run is a spell-checker. +``` +python -m venv env +env\Scripts\activate.bat # on windows +source env/bin/activate # on macOS / Linux +``` -## Style notes +Then, install dependencies: -Since our pages can almost all be accessed both with and without a trailing -slash, we prefer all our links to be root-relative (i.e: `/foo/bar`) rather -than parent-relative (i.e: `../bar`). +``` +pip install -r requirements.txt +``` + +### Running development server + +``` +mkdocs serve +``` + +This will launch a server on http://localhost:8000. Content in the server will live-reload as changes are made. If large refactors of the site structure are made, it's advisable to stop the server, make the changes, then restart it. + +### Production build + +``` +mkdocs build +``` + +This will build the site once, and place it in `site/` in the root of the project. This may be useful to see which files are rendered, and how exactly to access them. + +### Spell checking + +This project uses `cspell` for spell checking. Plugins are +available for a variety of editors and a command line runner is available +through `npm`: + +``` +npm install +``` + +``` +npm run spellcheck +``` + +Words that `cspell` is unaware of can be added to the `.spelling` file. diff --git a/config.yml b/config.yml deleted file mode 100644 index 220d1a81..00000000 --- a/config.yml +++ /dev/null @@ -1,41 +0,0 @@ -baseURL: https://docs.sourcebots.co.uk -languageCode: en-gb -title: SourceBots Documentation -theme: learn - -params: - author: SourceBots - description: SourceBots Documentation - showVisitedLinks: false - disableInlineCopyToClipBoard: true - disableLanguageSwitchingButton: true - disableAssetsBusting: true - ordersectionsby: "weight" - editURL: "https://github.com/sourcebots/docs/tree/master/content/" - - pythonVersion: 3.5.3 - -menu: - shortcuts: - - name: " Github Repo" - url: https://github.com/sourcebots/docs - - - name: " Website" - url: https://sourcebots.co.uk/ - -enableGitInfo: true -enableRobotsTXT: true -disableHugoGeneratorInject: true -enableEmoji: true -taxonomies: [] -pygmentsCodeFencesGuessSyntax: true -disableKinds: - - taxonomy - - taxonomyTerm - -outputs: - home: - - html - - json - -buildFuture: true diff --git a/content/api/_index.md b/content/api/_index.md deleted file mode 100644 index a24da0a6..00000000 --- a/content/api/_index.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: API -weight: 2 ---- - -Programming your robot is done in [Python](https://www.python.org/), -specifically version 3.9.6. You can learn more about Python from their -[docs](https://docs.python.org/3/), and our whirlwind tour. - -## Setup - -The following two lines are required to complete initialisation of the -kit: - -``` python -from sbot import * - -r = Robot() -``` - -Once this has been done, this `Robot` object can be used to control the -robot's functions. - -The remainder of the tutorials pages will assume your `Robot` object is -defined as `r`. - -## Running your code - -Your code needs to be put in the `zone-0` or `zone-1` folder in a file called -`forklift.py` or `crane.py` for the forklift and crane robots respectively. - -{{% notice tip %}} -If this file is missing or incorrectly named, your robot won't do -anything. No log file will be created. -{{% /notice %}} - -## Logs - -A log file is saved in the `output/` folder so you can see what your robot did, -what it didn't do, and any errors it raised. Each log file is in a folder based on its -date and time, so you can look back at your previous runs. - -## Included Libraries - -Python already comes with plenty of [built-in -libraries](https://docs.python.org/3.9/py-modindex.html) to use. We -install some extra ones which may be of use: - -- [numpy 1.19.3](https://pypi.org/project/numpy/1.19.3/) -- [matplotlib 3.3.3](https://pypi.org/project/matplotlib/3.3.3/) -- [pandas 1.1.4](https://pypi.org/project/pandas/1.1.4/) -- [scikit-learn 0.23.2](https://pypi.org/project/scikit-learn/0.23.2/) -- [scipy 1.5.4](https://pypi.org/project/scipy/1.5.4/) - -{{% notice tip %}} -If you would like an extra library installed, go and ask a volunteer to -see if we can help. -{{% /notice %}} diff --git a/content/api/arduino.md b/content/api/arduino.md deleted file mode 100644 index 4e4fb7dc..00000000 --- a/content/api/arduino.md +++ /dev/null @@ -1,161 +0,0 @@ ---- -title: Arduino API ---- - -The [Arduino](https://store.arduino.cc/arduino-uno-rev3) provides a -total of 18 pins for either digital input or output (labelled 2 to 13 -and A0 to A5), including 6 for analogue input (labelled A0 to A5). - -## Accessing the Arduino - -The Arduino can be accessed using the `arduino` property of the `Robot` -object. - -``` python -my_arduino = r.arduino -``` - -You can use the GPIO *(General Purpose Input/Output)* pins for anything, -from microswitches to LEDs. GPIO is only available on pins 2 to 13 and -A0 to A5 because pins 0 and 1 are reserved for communication with the -rest of our kit. - -## Simulator - -In the simulator, the Arduino's pins are pre-populated and pre-configured. -The first few digital pins are occupied by digital inputs, the next few by -digital outputs, and the analogue pins are attached to ultrasound sensors. - -To find out how many inputs and outputs each type of robot has, check the -[robot docs](/robots/). - -You won't be able to change pin mode like in -a physical robot (see below), but pins 0 and 1 are still unavailable. - -### Digital Inputs - -Each robot has a number of digital inputs, starting from pin 2. If your -robot has 5 inputs, those would occupy pins 2-6. - -These all have a digital state which you can read as a boolean. - -```python -bumper_pressed = r.arduino.pins[5].digital_state -``` - -### Digital Outputs - -The digital outputs start the pin after the last input. If your robot has 5 -inputs and 3 outputs, the outputs would occupy pins 7-9. - -You can set their state similarly to reading the inputs, and you can also -read the last value that was set. - -```python -led_state = r.arduino.pins[8].digital_state -r.arduino.pins[8].digital_state = not led_state # Toggle output -``` - -### Analogue Inputs - -Any analogue input devices (e.g. distance sensors) are connected to the -Arduino's analogue input pins starting from pin `A0`. You can read their -values like this: - -```python -distance = r.arduino.pins[AnaloguePin.A0].analogue_value -``` - -The value read is returned as a float. - -## Pin Mode (Unavailable in Simulator) - -GPIO pins have four different modes. A pin can only have one mode at a -time, and some pins aren't compatible with certain modes. These pin -modes are represented by an -[enum](https://docs.python.org/3/library/enum.html) which needs to be -imported before they can be used. - -``` python -from sbot import GPIOPinMode -``` - -{{% notice tip %}} -The input modes closely resemble those of an Arduino. More information -on them can be found in [their -docs](https://www.arduino.cc/en/Tutorial/DigitalPins). -{{% /notice %}} - -### Setting the pin mode - -You will need to ensure that the pin is in the correct pin mode before -performing an action with that pin. You can read about the possible pin -modes below. - -``` python -r.arduino.pins[3].mode = GPIOPinMode.DIGITAL_INPUT_PULLUP -``` - -### `GPIOPinMode.DIGITAL_INPUT` - -In this mode, the digital state of the pin (whether it is high or low) -can be read. - -``` python -r.arduino.pins[4].mode = GPIOPinMode.DIGITAL_INPUT - -pin_value = r.arduino.pins[4].digital_state -``` - -### `GPIOPinMode.DIGITAL_INPUT_PULLUP` - -Same as `GPIOPinMode.DIGITAL_INPUT`, but with an internal [pull-up -resistor](https://learn.sparkfun.com/tutorials/pull-up-resistors) -enabled. - -``` python -r.arduino.pins[4].mode = GPIOPinMode.DIGITAL_INPUT_PULLUP - -pin_value = r.arduino.pins[4].digital_state -``` - -### `GPIOPinMode.DIGITAL_OUTPUT` - -In this mode, we can set binary values of `0V` or `5V` to the pin. - -``` python -r.arduino.pins[4].mode = GPIOPinMode.DIGITAL_OUTPUT -r.arduino.pins[6].mode = GPIOPinMode.DIGITAL_OUTPUT - -r.arduino.pins[4].digital_state = True -r.arduino.pins[6].digital_state = False -``` - -### `GPIOPinMode.ANALOGUE_INPUT` - -Certain sensors output analogue signals rather than digital ones, and so -have to be read differently. The Arduino has six analogue inputs, which -are labelled `A0` to `A5`; however pins `A4` and `A5` are reserved and -cannot be used. - -{{% notice tip %}} -Analogue signals can have any voltage, while digital signals can only -take on one of two voltages. You can read more about digital vs analogue -signals [here](https://learn.sparkfun.com/tutorials/analog-vs-digital). -{{% /notice %}} - -``` python -from sbot import AnaloguePin - -r.arduino.pins[AnaloguePin.A0].mode = GPIOPinMode.ANALOGUE_INPUT - -pin_value = r.arduino.pins[AnaloguePin.A0].analogue_value -``` - -{{% notice tip %}} -The values are the voltages read on the pins, between 0 and 5. -{{% /notice %}} - -{{% notice warning %}} -Pins `A4` and `A5` are reserved and cannot be used. -{{% /notice %}} diff --git a/content/api/compass.md b/content/api/compass.md deleted file mode 100644 index 75cc2e93..00000000 --- a/content/api/compass.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Compass -weight: 10 ---- - -The forklift robot has a compass unit. This allows [robots](/robots/) to determine the direction it's facing in the arena. - -```python -# Get the heading of the robot. -heading = r.compass.get_heading() # Radians -``` - -When called, the `get_heading` method will return the heading of the robot in radians as a float. The heading is in the range 0 to tau (2π), where 0 is the robot facing directly North, and values increasing clockwise. diff --git a/content/api/encoder.md b/content/api/encoder.md deleted file mode 100644 index 685caec9..00000000 --- a/content/api/encoder.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Motor Encoder API -weight: 8 ---- - -Most moving parts of the robot have encoders attached. There are two kinds of encoders, linear encoders and rotary encoders. You can tell which is which by the joint it is attached to; if the joint rotates it is a Rotary encoder, whilst if it slides, it is a linear encoder. - -## Linear Encoders - -Linear encoders are attached to joints that move in a straight line (i.e. raising/lowering the forklift). - -Linear encoders measure the distance the joint has moved from its start position, in *metres*. - -All encoders are stored in a list called `encoders`, you can access the encoder with `encoders[i]`, where `i` is the slot the encoder is plugged into. You can find this number in the [documentation for the robot](/robots/). - -```python -# Get the distance from the start position -distance_from_start = r.encoders[1].displacement # in Metres -``` - -## Rotary Encoders - -Rotary encoders are attached to joints that rotate (i.e. wheel rotations). - -Rotary encoders measure the total rotation the joint has moved from its start position, in *radians*. - -All encoders are stored in a list called `encoders`, you can access the encoder with `encoders[i]`, where `i` is the slot the encoder is plugged into. You can find this number in the [documentation for the robot](/robots/). - -```python -# Get the total rotation from the start position -rotation_from_start = r.encoders[1].rotation # in Radians -``` diff --git a/content/api/magnet.md b/content/api/magnet.md deleted file mode 100644 index 40b788a7..00000000 --- a/content/api/magnet.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Magnet API -weight: 8 ---- - -The magnet is only available on the [Crane robot](/robots/crane). - -The magnet of the crane will only stick to containers. - -## Getting the magnet's status - -A magnet can be either energised or de-energised, you can turn the magnet on or off by setting `r.magnet.energised` like so: -```python -# Turn on the magnet -r.magnet.energised = True -# Turn off the magnet -r.magnet.energised = False -``` - -{{% notice warning %}} -Check the spelling of `energised`, it's in British English, `energized` will not work! -{{% /notice %}} - -You can get the current state of the magnet by getting the value of `energized` like so: - -```python -magnet_on = r.magnet.energised -``` - -## Checking if a container is nearby - -The magnet can tell you if there is an object in range to be picked up. You can check if any object is in range by accessing the `nearby` method: -```python -# Is there a container nearby? -is_nearby = r.magnet.nearby() # True or False -``` diff --git a/content/api/radio.md b/content/api/radio.md deleted file mode 100644 index dc4cbf4f..00000000 --- a/content/api/radio.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Radio API -weight: 6 ---- - -Radio transmitters and receivers are attached to various items in the arena. -Each transmitter encodes their identity, which means that receivers can identify these objects. - -Using the signal strength and bearing of the received radio signals, you're able to -determine the distance and direction of a transmitter relative to the radio in 2D. - -Our library provides this through a `radio` attached to your `Robot`, -which has a `sweep` function that detects transmitters that are in range: - -``` python -# Get all transmitters that are in range. -transmitters = r.radio.sweep() -``` - -When called, the `sweep()` function uses the radio receiver to scan for all transmitters in range. -It returns a list of `Target` objects, each of which describes one of the transmitters that were found within range. -A detailed description of the attributes of `Target` objects is provided at the bottom of this page. - -Here's an example that will repeatedly print out the information, bearing, and signal strength of each transmitter in range: - -``` python -# Continuously prints details of nearby transmitters. -while True: - transmitters = r.radio.sweep() - print("I found", len(transmitters), "transmitter(s):") - - for tx in transmitters: - print("Transmitter ID:", tx.target_info.id) - print(" Type:", tx.target_info.type) - print(" Owner:", tx.target_info.owner) - print(" Bearing:", tx.bearing) - print(" Signal Strength:", tx.signal_strength) -``` - -## Detecting beacons - -There are 4 beacons in the arena, see [the rules](/rules/) for their locations. These beacons continually transmit their identity. Beacons can be detected up to 4.5m away. - -The beacons have the `target_info.type` value of `0` (`TargetType.BEACON`), which can be used to detect if it is a beacon. See '[Objects of the Radio System](#objects-of-the-radio-system)' below for all available information. - -## Detecting containers - -There are many containers in the arena, which are each owned by a specific team. Containers can be detected up to 2m away. - -The beacons have the `target_info.type` value of `1` (`TargetType.CONTAINER`), which can be used to detect if it is a container. See '[Objects of the Radio System](#objects-of-the-radio-system)' below for all available information. - - -## Objects of the Radio System - -### Target - -A `Target` object contains information about a _detected_ transmitter. -It has the following attributes: - -`target_info` -: A [`TargetInfo`](#targetinfo) object containing information about the transmitter that was detected. - -`signal_strength` -: The measured strength of the signal as a float. - -`bearing` -: The angle to the `Target` in radians as a float. - A bearing of `0` is in front of the robot. Positive bearings are to the robot's right. - -### TargetInfo - -The `TargetInfo` object contains information about a transmitter. -It has the following attributes: - -`id` -: The ID of the transmitter, either 1-16 for containers, or 100-103 for beacons. See [the rules](/rules/) for the arena layout. - -`type` -: The type of the transmitter, either `0` (`TargetType.BEACON`) for a beacon, or `1` (`TargetType.CONTAINER`) for a container. - -`owner` -: The zone id of the robot that currently owns the stations territory. This can be `0` (`Owner.ZONE_0`), `1` (`Owner.ZONE_1`), or `-1` (`Owner.NULL`). which indicates it does not have an owner (i.e. it's a beacon). Remember, you can find out which zone your robot is in using [r.zone](/api/game-state) diff --git a/content/api/servos.md b/content/api/servos.md deleted file mode 100644 index 3d5dee4b..00000000 --- a/content/api/servos.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Servos ---- - -{{% notice note %}} -Servos only apply to the [physical robot](/robots/physical/). -{{% /notice %}} - -You can control attached servo motors from the [Arduino](/api/arduino/). By default, servos will be unpowered when your robot starts, and can freely rotate when turned by hand. Upon setting a value, they will hold the corresponding position. They will become unpowered again when you turn off your robot, unplug your USB stick, or set their position to the special value `None`. - -## Querying servos - -The servo assembly can interface with up to sixteen servos connected to it. - -```python -servo_zero = r.arduino.servos[0] -``` - -{{% notice tip %}} -Servo can be connected to any port, you don't have to start at 0! -{{% /notice %}} - -## Controlling servos - -Servos can be controlled using the `position` parameter. This should be set to a value between -1 and 1. - -```python -servo_zero.position = 0.65 -print(servo_zero.position) ->>> 0.65 -``` - -{{% notice tip %}} -When `position` is set to `None`, the servo loses power and can freely rotate. This is the same state they're in at start-up. -{{% /notice %}} diff --git a/content/api/touch.md b/content/api/touch.md deleted file mode 100644 index 1905346a..00000000 --- a/content/api/touch.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Touch Sensors -weight: 7 ---- - -![Touch sensor](/img/api/touch-sensor.png?width=600px) - -Microswitches, or touch sensors, are used to measure when something is touching the sensor. - -## Reading the touch sensor - -The touch sensors will be connected to a specific pin in the Arduino, typically wired in such a way that the pin's voltage is changed when the switch is pressed by an object. - -To read this, you need to read the digital value of the correct pin. You can get the correct pin number by looking at [the documentation for the robot](/robots/), then writing the code like so: - -``` python -# Get if something is touching the touch sensor. -is_touching = r.arduino.pins[pin].digital_state # True or False -``` \ No newline at end of file diff --git a/content/api/ultrasound.md b/content/api/ultrasound.md deleted file mode 100644 index a3a86347..00000000 --- a/content/api/ultrasound.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Ultrasound Sensors -weight: 7 ---- - -![Ultrasound sensor](/img/api/ultrasound.png?width=300px) - -Ultrasound sensors can measure distance of objects from the sensor. Ultrasound sensors emit a pulse of very high frequency sound, and measure the time it takes to hear an echo, typically Ultrasound sensors have electronics on the sensor to decide when an echo is received, and reports back a number as the distance in meters. - -Ultrasound sensors measure distance in a 18 degree diameter cone in front of the sensor, and report the closest measured distance in that cone. Ultrasound sensors also have a maximum distance. (Ultrasound sensors typically also have a minimum distance too, but we do not simulate that in our simulator). - -In our robots, ultrasound sensors are connected to the ['Arduino'](/api/arduino) board, which is used to read sensors for many different purposes. Keep reading to learn how to take measurements. - -## Reading the ultrasound sensor - -### Simulator - -The ultrasound sensors will be connected to a specific pin in the Arduino, and will constantly measure distances. Consult the description of the [robot](/robots/) to see which pin you should use. The analogue value of the pin will be the measured distance, in metres. - -Ultrasound sensors have a maximum range of 2 metres, if objects are further than 2m away from the robot, it will report a distance of 2m. - -``` python -# Get the closest distance to the ultrasound sensor is reading. -distance_metres = r.arduino.pins[AnaloguePin.A0].analogue_value -``` - -### Physical - -Connect the ultrasound sensor to a pair of digital Arduino pins. You can read either the time taken for the sound pulse to reflect back or the pre-calculated distance from the API - -``` python -trigger_pin = 4 -echo_pin = 5 -u = r.arduino.ultrasound_sensors[trigger_pin, echo_pin] - -time_taken = u.pulse() - -distance_metres = u.distance() -``` - -{{% notice warning %}} -If the ultrasound signal never returns, the sensor will timeout and -return `None`. -{{% /notice %}} diff --git a/content/faqs/_index.md b/content/faqs/_index.md deleted file mode 100644 index 5279ee85..00000000 --- a/content/faqs/_index.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: FAQs -weight: 6 ---- - -Teams often ask us questions, so we've put the most common ones below, so others can learn from them. - -{{% expand "Can we make our robot shoot/destroy/launch projectiles at/ram/jam the sensors of/etc... other robots?" %}} -No. The rules clearly state this is a non-contact sport and any team's robot which deliberately harms another robot will be asked to modify their design. Competitors are also expected to behave within the spirit of good sporting conduct at all times. -{{% /expand %}} diff --git a/content/kit/_index.md b/content/kit/_index.md deleted file mode 100644 index f5c5f403..00000000 --- a/content/kit/_index.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Kit -weight: 5 ---- - -{{% notice warning %}} -These kit docs are only relevant for the physical robot, as opposed to the [simulator](/simulator/). -{{% /notice %}} - -## Boards - -Besides the Raspberry Pi, there are 3 main controller boards on your robot: - -| [Motor Board](motor-board) | [Power Board](power-board) | [Servo Assembly](servo-assembly) | [Raspberry Pi](pi) | -|---|---|---|---| -| ![Motor Board](/img/kit/mcv4b.png?width=20pc) | ![Power Board](/img/kit/pbv4.png?width=20pc) | ![Servo Assembly](/img/kit/servo-assembly.png?width=20pc) | ![Pi](/img/kit/pi.jpg?width=20pc) | diff --git a/content/kit/pi/_index.md b/content/kit/pi/_index.md deleted file mode 100644 index a1a45254..00000000 --- a/content/kit/pi/_index.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Raspberry Pi ---- - -The [Raspberry Pi 3](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/) provided with your kit is what runs the code you write and controls the other peripheral boards. - -![Raspberry Pi 3](https://www.raspberrypi.org/app/uploads/2017/05/Raspberry-Pi-3-462x322.jpg) - -The Raspberry Pi is enclosed in a plastic case to protect the delicate components, and allow for easier mounting to your robot. It is powered using a micro-USB cable from one of the power board's 5V outputs. - -## Included software -The software included on the Raspberry Pi allows it to run your robot. No graphical or user-required software is installed. You _do not_ need to connect to your Raspberry Pi from a computer in order to use your robot. - -{{% notice warning %}} -Please do not attempt to modify the software on the Raspberry Pi. It has been configured and tested in its current configuration. Unauthorized modifications may damage your robot or prevent accurate debugging. -{{% /notice %}} diff --git a/content/kit/servo-assembly/GPIO.md b/content/kit/servo-assembly/GPIO.md deleted file mode 100644 index c4f0c43e..00000000 --- a/content/kit/servo-assembly/GPIO.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: GPIO ---- - -The Arduino allows you to connect your kit to your own electronics. It has fourteen digital I/O pins, and six analogue. The analogue pins can read an analogue signal from 0 to 5V. The board also has a couple of ground pins, as well as some pins fixed at 3.3V and 5V output. - -The pin layout of the servo assembly is the same as an Arduino Uno. - -{{% notice note %}} -The Arduino communicates with the servo shield using two of the analogue input pins (4 and 5), and with the Raspberry Pi using two of the digital IO pins (0 and 1). These four pins are therefore reserved, and using them may cause the Arduino or servo shield to behave unusually. -{{% /notice %}} - -![Pin Map](https://raw.githubusercontent.com/Bouni/Arduino-Pinout/master/Arduino%20Uno%20R3%20Pinout.png?width=50pc) diff --git a/content/kit/servo-assembly/_index.md b/content/kit/servo-assembly/_index.md deleted file mode 100644 index 138d75c6..00000000 --- a/content/kit/servo-assembly/_index.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Servo Assembly ---- - -The servo assembly allows you to control GPIO pins, analogue pins, and servos. It's comprised of an [Arduino Uno](https://store.arduino.cc/arduino-uno-rev3), and a [servo shield](https://learn.adafruit.com/adafruit-16-channel-pwm-slash-servo-shield). - -![Servo Assembly](/img/kit/servo-assembly.jpg?width=30pc) - -## The servo shield -The servo shield enables you to control up to sixteen servos. It's attached to the top of the Arduino, passing its pins through. - -## The reset button -The reset button allows you to instantly reboot the Arduino in case it isn't working. This is not a guaranteed fix, but may solve some problems. - - -## Designs -The schematic diagrams for both the Arduino and shield are below, as well as the source code of the firmware on the Arduino. You do not need this information to use the board but it may be of interest to some people. - -- [Servo Shield Schematic](https://cdn-learn.adafruit.com/assets/assets/000/036/269/original/adafruit_products_schem.png) -- [Arduino Uno Schematic](https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf) -- [Firmware Source](https://github.com/sourcebots/servo-firmware) diff --git a/content/kit/servo-assembly/servos.md b/content/kit/servo-assembly/servos.md deleted file mode 100644 index 87ca48be..00000000 --- a/content/kit/servo-assembly/servos.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Servos ---- - -By itself, an Arduino is incapable of driving servos, without a lot of hard work and pin munging. So we're using a shield instead! This shield allows control of sixteen servos. - -## Connecting your servos -There are a total of sixteen servo connectors, grouped into four groups of four. Servo cables are connected with 0V (the black or brown wire) towards the side of the reset button. - -## Power -The Arduino itself is powered entirely over USB. If you wish to use servos, you'll need to supply an additional 5V through the connector on the shield from the [power board](/kit/power-board). There are two red LEDs next to the power input that will turn on if the board is correctly powered. diff --git a/content/kit/servo-assembly/ultrasound.md b/content/kit/servo-assembly/ultrasound.md deleted file mode 100644 index 81f128d4..00000000 --- a/content/kit/servo-assembly/ultrasound.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Ultrasound ---- - -Ultrasound sensors are a useful way of measuring distance. Ultrasound sensors communicate with the kit using two wires. A signal is sent to the sensor on the _trigger_ pin, and the length of a response pulse on the _echo_ pin can be used to calculate the distance. - -{{% notice warning %}} -Ultrasound should only be considered accurate up to around two metres, beyond which the signal can become distorted and produce erroneous results. -{{% /notice %}} - -## Wiring up the sensor -The sensor has four pin connections: ground, 5V (sometimes labelled _vcc_), _trigger_ and _echo_. Most ultrasound sensors will label which pin is which. The ground and 5V should be wired to the ground and 5V pins of the Arduino respectively. The trigger and echo pins should be attached to two different digital IO pins. Take note of these two pins, you'll need them to [use the sensor](/api/arduino#ultrasound-sensors). - -{{% notice tip %}} -If the sensor always returns a distance of zero, it means the _trigger_ and _echo_ pins are connected the wrong way! Either change the pin numbers in the code, or swap the connections. -{{% /notice %}} diff --git a/content/robots/_index.md b/content/robots/_index.md deleted file mode 100644 index eb0f85c8..00000000 --- a/content/robots/_index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Robots -weight: 4 ---- - -In this year's competition we have 2 Robots, which are each controlled by their own python file. - -- [Crane Robot](crane) which is controlled by `crane.py`. -- [Forklift Robot](forklift) which is controlled by `forklift.py`. - -There is also a [Physical Robot](physical). - -See [the API section](/api/) for more details on how to run your code. diff --git a/content/robots/crane.md b/content/robots/crane.md deleted file mode 100644 index a7d45f8c..00000000 --- a/content/robots/crane.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Crane Robot -weight: 2 ---- - -![Crane robot](/img/robots/crane-isolated.png) - -The crane has three [linear motor](/api/motor-board), allowing it to move its [electromagnet](/api/magnet) in 3 dimensions. Each motor has an [encoder (position sensor)](/api/encoder) that can tell you the position of the motor along its track. - -Additionally, the crane has one ultrasound distance sensor and a radio, both attached to the hook (see below). - -## Motor layout - -The layout of the [motors](/api/motor-board) attached to the motor boards are as follows: - -- Motor Board 0: - - Motor 0 - Bridge motor - - Motor 1 - Trolley motor -- Motor Board 1: - - Motor 0 - Hoist motor - -## Encoder layout - -The layout of the [encoders](/api/encoder) are as follows: - -- Slot 0: Bridge linear encoder -- Slot 1: Trolley linear encoder -- Slot 2: Hoist linear encoder - -## Ultrasound sensor - -The crane has one [ultrasound sensor](/api/ultrasound) pointing downwards from the magnet. The ultrasound sensor is attached to Arduino pin `AnaloguePin.A0`. - -## Radio - -The crane robot has a [radio](/api/radio) receiver attached to the hook, which can be used to detect which container is below it. diff --git a/content/robots/forklift.md b/content/robots/forklift.md deleted file mode 100644 index b82eb018..00000000 --- a/content/robots/forklift.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Forklift Robot -weight: 1 ---- - -![Forklift robot](/img/robots/forklift-isolated.png) - -The forklift has two [radial motors](/api/motor-board), allowing it to move itself around the arena. It also has 2 grabber motors, wired so they move together. Each motor has an [encoder (position sensor)](/api/encoder) that can tell you either the position of the motor along its track, or its angle relative to the start. - -The forklift robot also has multiple Ultrasound sensors, a touch sensor, and a radio, see below for details. - -## Motor layout - -The layout of the motors attached to the motor boards for the forklift robot are as follows: - -- Motor Board 0: - - Motor 0 - Left wheel motor - - Motor 1 - Right wheel motor -- Motor Board 1: - - Motor 0 - Grabber motor (Both arms) - -## Encoder layout - -The layout of the Encoders are as follows: - -- Slot 0: Left wheel rotary encoder -- Slot 1: Right wheel rotary encoder -- Slot 2: Left grabber linear encoder -- Slot 3: Right grabber linear encoder - -{{% notice note %}} -Hint: the radius of a forklift wheel is 5cm. -{{% /notice %}} - -## Touch sensor - -In addition to other sensors, the forklift also has a [microswitch touch sensor](/api/touch) at the rear. This is used to detect if the forklift's rear is touching another object (a container, another robot, or a wall). The touch sensor is connected to pin `2` of the Arduino. - -## Ultrasound (Distance) Sensor - -The forklift has many [ultrasound sensors](/api/ultrasound) attached to various points in the robot, here is the layout of the ultrasound sensors: - -- `AnaloguePin.A0`: Front Left -- `AnaloguePin.A1`: Front Right -- `AnaloguePin.A2`: Left -- `AnaloguePin.A3`: Right -- `AnaloguePin.A4`: Front -- `AnaloguePin.A5`: Back - -## Radio - -The forklift robot has a [radio](/api/radio) receiver attached to its centre. diff --git a/content/robots/physical.md b/content/robots/physical.md deleted file mode 100644 index e8e68992..00000000 --- a/content/robots/physical.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Physical robot ---- - -The physical robot is closely modelled after the [forklift](/robots/forklift) robot, however is different in a few important ways. The physical robot has two [radial motors](/api/motor-board), allowing it to move itself around the arena. - -## Motor layout - -The layout of the motors attached to the motor boards for the forklift robot are as follows: - -- Motor Board 0: - - Motor 0 - Left wheel motor - - Motor 1 - Right wheel motor - -## Servos - -The front grabber is actuated by a single [servo](/api/servos), attached to the [Arduino](/api/arduino/#servos). It is plugged in to port 0. - -The servo will only let you move the grabber in a safe range. `1` will open the grabber, and `-1` will close the grabber. - -## Ultrasound - -The forklift has an [ultrasound sensor](/api/ultrasound) attached to the front of the robot. This sensor uses digital pin 4 as the trigger pin and 5 as the echo. diff --git a/content/rules/_index.md b/content/rules/_index.md deleted file mode 100644 index dad11849..00000000 --- a/content/rules/_index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Rules -weight: 4 ---- - -You can find the rules for Smallpeice 2021 competition here!: - -# [Download the rules!](/rules.pdf) diff --git a/content/simulator/_index.md b/content/simulator/_index.md deleted file mode 100644 index 24d39dde..00000000 --- a/content/simulator/_index.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Simulator -weight: 3 ---- - -{{% notice note %}} -Should you wish to run the simulator locally, this is fine, however it will drastically limit your ability to collaborate with the rest of your team. -{{% /notice %}} - -## Running simulations - -To ease the load on your computers, the Webots simulator will be run by us, which you can interact with through our runner interface. The runner allows you to run simulations, and view the logs and recordings afterwards. - -To run a simulation, click the "Run Simulation" button. The button will prevent you from running additional simulations whilst a simulation is running. Once the simulation has finished, the button will return to "Run Simulation", and an entry will be shown below it with a link to the logs and animation for your simulation run. Note that this always uses the files in the `zone-0` / `zone-1` directory. - -## Directory structure - -In VSCode, you will see a directory structure which looks similar to this: - -``` plain -. -├── competition-simulator -│ ├── controllers -│ │ ├── example_controller -│ │ └── sr_controller -│ ├── ... -│ └── worlds -├── output -│ └── 2021-08-07T19_20_46.108422 -│ ├── 2021-08-07T18_31_56.html -│ ├── 2021-08-07T18_31_56.json -│ ├── 2021-08-07T18_31_56.x3d -│ └── logs.txt -└── zone-0 - ├── crane.py - └── forklift.py -``` diff --git a/content/simulator/local.md b/content/simulator/local.md deleted file mode 100644 index cf458e79..00000000 --- a/content/simulator/local.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Local installation ---- - -Should you wish to run the simulator locally, this is fine, however it will drastically limit your ability to collaborate with the rest of your team. - -## Installation - -### Prerequisites - -You need to download and install Webots R2021b (the download is around 0.5 GB). This is the platform we run our simulation in. - -### Python Version - -You will also need Python 3.9 installed. - -There are a small number of [external libraries](/api#included-libraries) which will be available to your robot code during the competition. For local development you will need to install these yourself. - -{{% notice warning %}} -If you are installing python on Windows, you will need to add python to `PATH` otherwise Webots will not be able to find the python installation -{{% /notice %}} - -### Installing the simulation - - 1. Download the simulation, and unzip it somewhere on your computer. - 2. Using the Webots IDE, open the `worlds/Arena.wbt` file. - -You may receive a warning about your computer’s GPU not being good enough, which can be ignored - -### Changing your version of Python - -If Webots is picking up the incorrect version of Python, you’ll need to change it. This can be done using Tools > Preferences > General > Python command. You’ll need to ensure a matching version of Python is installed. - -## Overview - -Within the Webots IDE, there are a few different panels: - -- In the centre of your screen is the 3D simulated view of the arena -- On the left is a tree hierarchy of all elements in this “world” -- At the bottom is the console, where output from your robot code will be displayed -- At the top are your general controls which include the time controls. Press the centre play button to run the simulation at normal speed. - -## Time - -In the simulated environment, time advances only at the pace that the simulator is run. The relation between this time and the real passage of time depends on a couple of factors: the speed the simulation is configured to run at and the ability of the computer running the simulation to process it fast enough. - -You can configure and observe the speed the simulator is running at from the toolbar in Webots: -![alt text](https://www.studentrobotics.org/docs/images/content/simulator/speed-toolbar.png) - -Here the simulation has run for 13.28 seconds, but is currently paused (the speed multiplier shows 0.00×). You could choose to step a single time increment, run the simulator at real speed (▶), or run the simulator at various faster speeds (▶▶ and ▶▶▶). - -These differences mean that your code will need to use a different mechanism to find the current time or to sleep within the simulation. Find out more by heading over to the programming docs on time. - -## Useful Links -- [Camera Controls](https://www.cyberbotics.com/doc/guide/the-3d-window#navigation-in-the-scene) -- [Graphics Settings](https://www.cyberbotics.com/doc/guide/preferences#opengl) diff --git a/content/simulator/programming/_index.md b/content/simulator/programming/_index.md deleted file mode 100644 index 8ded1675..00000000 --- a/content/simulator/programming/_index.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Programming -weight: 1 ---- - -On first run, the robot will execute an example program for convenience. On first run, this will be copied into `zone-0` in the same directory that `competition-simulator-` is stored in: - -```plain -. -├── competition-simulator- -│ ├── ... -│ └── worlds -│ └── Arena.wbt -├── zone-0 -│ ├── crane.py -│ └── forklift.py -└── zone-1 -``` - -Your code for the forklift robot should go in `forklift.py` and the crane in `crane.py`. - -{{% notice warning %}} -Only your controller code will be present in the competition environment. -{{% /notice %}} - -### Time - -In the simulated environment, time advances only at the pace that the simulator -is run. As a result, using `time.time` to know how long your robot has been -running for or `time.sleep` to wait for some duration will be unreliable. - -As a result the API present in the simulator supports a slightly different -approach to handling time. See the documentation about [simulated time](./time) -for more details. - -## Other robots - -There is another robot in the arena; its starting zone is zone 1. By default, this robot will not move. - -To control the zone 1 robot, you will need to provide its code: - -Create the robot code in `zone-1/forklift.py` and `zone-1/crane.py`. Your original code in `zone-0/` will still be used to control zone 0 robots. Robots which do not have any robot code in their `zone-x` directory will not do anything. - -``` plain -. -├── competition-simulator -│ ├── controllers -│ │ ├── example_controller -│ │ └── sr_controller -│ ├── ... -│ └── worlds -├── zone-0 -│ └── crane.py -└── zone-1 - └── crane.py -``` diff --git a/content/simulator/programming/time.md b/content/simulator/programming/time.md deleted file mode 100644 index 13ca6a1f..00000000 --- a/content/simulator/programming/time.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: Time ---- - -In the simulated environment, time advances only at the pace that the simulator is run and in cooperation with the controller code (such as the code controlling your robot). As a result, using `time.time` to know how long your robot has been running for or `time.sleep` to wait for some duration will have unpredictable results, especially when run on a computer other than the one you are developing on (such as during the competition). - -Instead your code should explicitly signal to the simulator when it is ready for time to advance and should query for the current time from the simulator. This can be done by using the methods detailed below. - -{{% notice tip %}} -If you find that the simulator freezes then this indicates that your code is busy doing something without giving the simulator a chance to run. This usually indicates that you have a loop somewhere which is expecting time to advance on its own and which should be modified to call `R.sleep` occasionally (even a very small value will allow the simulator to progress). -{{% /notice %}} - -## Sleeping - -If you want to wait for something to happen within the simulation, and you can be reasonably confident that it will take a given amount of time, you can use sleep method on your robot to pause your code for a given duration. - -Internally this uses the simulation’s own clock and so is suitable for use in place of `time.sleep`. Note that, just as with `time.sleep`, while your code is sleeping your robot will continue any actions it was doing. - -```python -# Blink the output -R.arduino.pins[8].digital_state = True -R.sleep(1.5) # Sleep for a second and a half of simulation time -R.arduino.pins[8].digital_state = False -``` - -## Getting the current time - -If you need to measure the time since some previous moment within the simulator, your robot has a time method which can be used in place of `time.time` to get a number (in seconds) that increases in line with simulation time. - -Time zero as returned by this method is the point at which the simulation began, however you should not rely on that being a useful reference point as it may not be the moment at which the match began. - -```python -then = R.time() - -# .. do some other things .. - -now = R.time() - -duration = now - then -``` diff --git a/content/tutorials/_index.md b/content/tutorials/_index.md deleted file mode 100644 index 47a71cbd..00000000 --- a/content/tutorials/_index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Tutorials -weight: 1 ---- - -This part of the docs contains some practical guides for getting starting with both Python and the simulator. - -* [Basic Movement](basic-movement) - explains how to use the kit to operate a motor -* [Python: A Whirlwind Tour](python-whirlwind-tour) - a guide to using Python, aimed towards those who haven't used it before diff --git a/content/tutorials/basic-movement.md b/content/tutorials/basic-movement.md deleted file mode 100644 index d5d01be1..00000000 --- a/content/tutorials/basic-movement.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: Basic Movement ---- - -The example program we'll write will do a number of things with the motor: forwards and backwards, and different power settings, for example. Let's begin. To start off, we'll just make a motor move forwards, then backwards, and then repeat. - -### Forwards & backwards - -Doing this is actually very easy; the only thing you need to realise is that a positive number is forwards and a negative number is backwards. - -{{% notice warning %}} -The actual direction of travel of a motor, when mounted on a robot, will depend on its orientation and the way in which the wires are connected to the motor board. If the motor appears to be going in the wrong direction, just swap the motor's positive and negative wires over. -{{% /notice %}} - -Here's the code: - -```python -from sbot import * - -r = Robot() - -while True: - r.motor_boards[0].m0.power = 0.5 - r.motor_boards[0].m1.power = 0.5 - r.sleep(3) - - r.motor_boards[0].m0.power = 0 - r.motor_boards[0].m1.power = 0 - r.sleep(1.4) - - r.motor_boards[0].m0.power = -0.5 - r.motor_boards[0].m1.power = -0.5 - r.sleep(1) - - r.motor_boards[0].m0.power = 0 - r.motor_boards[0].m1.power = 0 - r.sleep(4) -``` - -You're familiar with the first few lines; in fact, the only lines you may not be familiar with are the `r.motor_boards...` lines. For a comprehensive reference to the `motor` object, see [`motor` API](/api/motor-board) page. -But, to summarise: - -`r.motor_boards.m0.power = 0.5` sets the target power of the motor connected to output 0 on the first [motor board](/kit/motor-board) to half speed forwards (i.e. a duty-cycle of 0.5 forwards). As you would expect, then, `-0.5` will put the this motor into reverse at half power. -`r.motor_boards.m0.power = 0` will brake the motor and stop it. - -So, if you put the above code on your robot, you should be able to see a motor spin forwards, stop, spin backwards, stop, and then repeat... - -{{% notice note %}} -If you find that the motor doesn't turn when you run the above code, check that you've got all the cables connected to the right places, in particular note that the motor board has _two_ outputs. -{{% /notice %}} - -### Changing the speed - -Now we're going to modify the program to vary the speed of the motor. Our aim is to do the forwards and backwards bit (as above), but, before we loop round again, ramp the power up to 70%, then down to -70%, and then back to 0 (all in steps of 10%). Here's the code: - -```python -from sbot import * - -r = Robot() - -while True: - r.motor_boards[0].m0.power = 0.5 - r.motor_boards[0].m1.power = 0.5 - r.sleep(3) - - r.motor_boards[0].m0.power = 0 - r.motor_boards[0].m1.power = 0 - r.sleep(1.4) - - r.motor_boards[0].m0.power = -0.5 - r.motor_boards[0].m1.power = -0.5 - r.sleep(1) - - r.motor_boards[0].m0.power = 0 - r.motor_boards[0].m1.power = 0 - r.sleep(4) - - # ^^ code from before ^^ - - # power up to 0.7 (from 0.1) - for pwr in range(10, 80, 10): - r.motor_boards[0].m0.power = pwr / 100.0 - r.motor_boards[0].m1.power = pwr / 100.0 - r.sleep(0.1) - - # power down from 0.7 (to 0.1) - for pwr in range(70, 0, -10): - r.motor_boards[0].m0.power = pwr / 100.0 - r.motor_boards[0].m1.power = pwr / 100.0 - r.sleep(0.1) - - # set power to 0 for a second - r.motor_boards[0].m0.power = 0 - r.motor_boards[0].m1.power = 0 - r.sleep(1) - - # power up to -0.7 (from -0.1) - for pwr in range(-10, -80, -10): - r.motor_boards[0].m0.power = pwr / 100.0 - r.motor_boards[0].m1.power = pwr / 100.0 - r.sleep(0.1) - - # power down to -0.1 (from -0.7) - for pwr in range(-70, 0, 10): - r.motor_boards[0].m0.power = pwr / 100.0 - r.motor_boards[0].m1.power = pwr / 100.0 - r.sleep(0.1) - - # set power to 0 for a second - r.motor_boards[0].m0.power = 0 - r.motor_boards[0].m1.power = 0 - r.sleep(1) -``` - -## Next steps - -From here, you should be able to make your robot move about in a controlled manner. See if you can make your robot drive forwards to a given point, stop, turn around and then return to its starting point. diff --git a/cspell.json b/cspell.json new file mode 100644 index 00000000..307ffe1e --- /dev/null +++ b/cspell.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json", + "version": "0.2", + "dictionaryDefinitions": [ + { + "name": "project-words", + "path": "./.spelling", + "addWords": true + } + ], + "dictionaries": ["en-gb", "python", "project-words"] +} diff --git a/docs/.pages b/docs/.pages new file mode 100644 index 00000000..4302a90e --- /dev/null +++ b/docs/.pages @@ -0,0 +1,6 @@ +nav: + - index.md + - tutorials + - rules + - ... + - resources diff --git a/docs/assets/docs/arduino-schematic.pdf b/docs/assets/docs/arduino-schematic.pdf new file mode 100644 index 00000000..35622e7f Binary files /dev/null and b/docs/assets/docs/arduino-schematic.pdf differ diff --git a/static/docs/motor-schematic.pdf b/docs/assets/docs/motor-schematic.pdf similarity index 100% rename from static/docs/motor-schematic.pdf rename to docs/assets/docs/motor-schematic.pdf diff --git a/static/docs/power-schematic.pdf b/docs/assets/docs/power-schematic.pdf similarity index 100% rename from static/docs/power-schematic.pdf rename to docs/assets/docs/power-schematic.pdf diff --git a/docs/assets/docs/servo-schematic.pdf b/docs/assets/docs/servo-schematic.pdf new file mode 100644 index 00000000..4d4343b9 Binary files /dev/null and b/docs/assets/docs/servo-schematic.pdf differ diff --git a/static/favicon.ico b/docs/assets/favicon.ico similarity index 100% rename from static/favicon.ico rename to docs/assets/favicon.ico diff --git a/static/img/api/touch-sensor.png b/docs/assets/img/api/touch-sensor.png similarity index 100% rename from static/img/api/touch-sensor.png rename to docs/assets/img/api/touch-sensor.png diff --git a/static/img/api/ultrasound.png b/docs/assets/img/api/ultrasound.png similarity index 100% rename from static/img/api/ultrasound.png rename to docs/assets/img/api/ultrasound.png diff --git a/docs/assets/img/api/vision/arena_marker.jpg b/docs/assets/img/api/vision/arena_marker.jpg new file mode 100644 index 00000000..ddd08391 Binary files /dev/null and b/docs/assets/img/api/vision/arena_marker.jpg differ diff --git a/docs/assets/img/api/vision/arena_marker_annotated.jpg b/docs/assets/img/api/vision/arena_marker_annotated.jpg new file mode 100644 index 00000000..1d96cffd Binary files /dev/null and b/docs/assets/img/api/vision/arena_marker_annotated.jpg differ diff --git a/docs/assets/img/api/vision/cartesian.svg b/docs/assets/img/api/vision/cartesian.svg new file mode 100644 index 00000000..9eff8eb3 --- /dev/null +++ b/docs/assets/img/api/vision/cartesian.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + Y + Z + X + Camera + + Forwards + + + diff --git a/docs/assets/img/api/vision/m-45x0y0z.png b/docs/assets/img/api/vision/m-45x0y0z.png new file mode 100644 index 00000000..3e840b9f Binary files /dev/null and b/docs/assets/img/api/vision/m-45x0y0z.png differ diff --git a/docs/assets/img/api/vision/m0x-45y0z.png b/docs/assets/img/api/vision/m0x-45y0z.png new file mode 100644 index 00000000..9c6cdaea Binary files /dev/null and b/docs/assets/img/api/vision/m0x-45y0z.png differ diff --git a/docs/assets/img/api/vision/m0x0y-45z.png b/docs/assets/img/api/vision/m0x0y-45z.png new file mode 100644 index 00000000..daa4bfec Binary files /dev/null and b/docs/assets/img/api/vision/m0x0y-45z.png differ diff --git a/docs/assets/img/api/vision/m0x0y0z.png b/docs/assets/img/api/vision/m0x0y0z.png new file mode 100644 index 00000000..f66084cd Binary files /dev/null and b/docs/assets/img/api/vision/m0x0y0z.png differ diff --git a/docs/assets/img/api/vision/m0x0y45z.png b/docs/assets/img/api/vision/m0x0y45z.png new file mode 100644 index 00000000..84cdb274 Binary files /dev/null and b/docs/assets/img/api/vision/m0x0y45z.png differ diff --git a/docs/assets/img/api/vision/m0x45y0z.png b/docs/assets/img/api/vision/m0x45y0z.png new file mode 100644 index 00000000..34bb07d9 Binary files /dev/null and b/docs/assets/img/api/vision/m0x45y0z.png differ diff --git a/docs/assets/img/api/vision/m45x0y0z.png b/docs/assets/img/api/vision/m45x0y0z.png new file mode 100644 index 00000000..3034d941 Binary files /dev/null and b/docs/assets/img/api/vision/m45x0y0z.png differ diff --git a/docs/assets/img/api/vision/spherical.svg b/docs/assets/img/api/vision/spherical.svg new file mode 100644 index 00000000..6279e354 --- /dev/null +++ b/docs/assets/img/api/vision/spherical.svg @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + Camera + + + Forwards + + + r + θ + φ + diff --git a/docs/assets/img/api/vision/yawpitchroll.png b/docs/assets/img/api/vision/yawpitchroll.png new file mode 100644 index 00000000..a564be9e Binary files /dev/null and b/docs/assets/img/api/vision/yawpitchroll.png differ diff --git a/static/img/assembly/camcons.png b/docs/assets/img/assembly/camcons.png similarity index 100% rename from static/img/assembly/camcons.png rename to docs/assets/img/assembly/camcons.png diff --git a/static/img/assembly/motor-board.png b/docs/assets/img/assembly/motor-board.png similarity index 100% rename from static/img/assembly/motor-board.png rename to docs/assets/img/assembly/motor-board.png diff --git a/static/img/assembly/motor_and_camcon.png b/docs/assets/img/assembly/motor_and_camcon.png similarity index 100% rename from static/img/assembly/motor_and_camcon.png rename to docs/assets/img/assembly/motor_and_camcon.png diff --git a/static/img/assembly/pi-power-cable.png b/docs/assets/img/assembly/pi-power-cable.png similarity index 100% rename from static/img/assembly/pi-power-cable.png rename to docs/assets/img/assembly/pi-power-cable.png diff --git a/static/img/assembly/pi.png b/docs/assets/img/assembly/pi.png similarity index 100% rename from static/img/assembly/pi.png rename to docs/assets/img/assembly/pi.png diff --git a/static/img/assembly/power-board.png b/docs/assets/img/assembly/power-board.png similarity index 100% rename from static/img/assembly/power-board.png rename to docs/assets/img/assembly/power-board.png diff --git a/static/img/assembly/servo-assembly.png b/docs/assets/img/assembly/servo-assembly.png similarity index 100% rename from static/img/assembly/servo-assembly.png rename to docs/assets/img/assembly/servo-assembly.png diff --git a/docs/assets/img/kit/arduino_headers.png b/docs/assets/img/kit/arduino_headers.png new file mode 100644 index 00000000..2590a716 Binary files /dev/null and b/docs/assets/img/kit/arduino_headers.png differ diff --git a/docs/assets/img/kit/arduino_pinout.png b/docs/assets/img/kit/arduino_pinout.png new file mode 100644 index 00000000..ce523b74 Binary files /dev/null and b/docs/assets/img/kit/arduino_pinout.png differ diff --git a/docs/assets/img/kit/battery.jpg b/docs/assets/img/kit/battery.jpg new file mode 100644 index 00000000..9d2d5acd Binary files /dev/null and b/docs/assets/img/kit/battery.jpg differ diff --git a/static/img/kit/mcv4b.png b/docs/assets/img/kit/mcv4b.png similarity index 100% rename from static/img/kit/mcv4b.png rename to docs/assets/img/kit/mcv4b.png diff --git a/static/img/kit/mcv4b_board_diagram.png b/docs/assets/img/kit/mcv4b_board_diagram.png similarity index 100% rename from static/img/kit/mcv4b_board_diagram.png rename to docs/assets/img/kit/mcv4b_board_diagram.png diff --git a/static/img/kit/pbv4.png b/docs/assets/img/kit/pbv4.png similarity index 100% rename from static/img/kit/pbv4.png rename to docs/assets/img/kit/pbv4.png diff --git a/static/img/kit/pi.jpg b/docs/assets/img/kit/pi.jpg similarity index 100% rename from static/img/kit/pi.jpg rename to docs/assets/img/kit/pi.jpg diff --git a/static/img/kit/power_board_v4_diagram.png b/docs/assets/img/kit/power_board_v4_diagram.png similarity index 100% rename from static/img/kit/power_board_v4_diagram.png rename to docs/assets/img/kit/power_board_v4_diagram.png diff --git a/docs/assets/img/kit/power_hat.svg b/docs/assets/img/kit/power_hat.svg new file mode 100644 index 00000000..9fb7a64c --- /dev/null +++ b/docs/assets/img/kit/power_hat.svg @@ -0,0 +1,359 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + + diff --git a/docs/assets/img/kit/sbv4.png b/docs/assets/img/kit/sbv4.png new file mode 100644 index 00000000..4289ccb0 Binary files /dev/null and b/docs/assets/img/kit/sbv4.png differ diff --git a/docs/assets/img/kit/sbv4_diagram.png b/docs/assets/img/kit/sbv4_diagram.png new file mode 100644 index 00000000..3af1436a Binary files /dev/null and b/docs/assets/img/kit/sbv4_diagram.png differ diff --git a/static/img/logo-white.svg b/docs/assets/img/logo-white.svg similarity index 100% rename from static/img/logo-white.svg rename to docs/assets/img/logo-white.svg diff --git a/static/img/tutorials/add.png b/docs/assets/img/tutorials/add.png similarity index 100% rename from static/img/tutorials/add.png rename to docs/assets/img/tutorials/add.png diff --git a/static/img/tutorials/divide.png b/docs/assets/img/tutorials/divide.png similarity index 100% rename from static/img/tutorials/divide.png rename to docs/assets/img/tutorials/divide.png diff --git a/static/img/tutorials/multiply.png b/docs/assets/img/tutorials/multiply.png similarity index 100% rename from static/img/tutorials/multiply.png rename to docs/assets/img/tutorials/multiply.png diff --git a/static/img/tutorials/powers.png b/docs/assets/img/tutorials/powers.png similarity index 100% rename from static/img/tutorials/powers.png rename to docs/assets/img/tutorials/powers.png diff --git a/static/img/tutorials/subtract.png b/docs/assets/img/tutorials/subtract.png similarity index 100% rename from static/img/tutorials/subtract.png rename to docs/assets/img/tutorials/subtract.png diff --git a/static/img/tutorials/whrl-mac-1.png b/docs/assets/img/tutorials/whrl-mac-1.png similarity index 100% rename from static/img/tutorials/whrl-mac-1.png rename to docs/assets/img/tutorials/whrl-mac-1.png diff --git a/static/img/tutorials/whrl-win-1.png b/docs/assets/img/tutorials/whrl-win-1.png similarity index 100% rename from static/img/tutorials/whrl-win-1.png rename to docs/assets/img/tutorials/whrl-win-1.png diff --git a/static/img/tutorials/whrl-win-2.png b/docs/assets/img/tutorials/whrl-win-2.png similarity index 100% rename from static/img/tutorials/whrl-win-2.png rename to docs/assets/img/tutorials/whrl-win-2.png diff --git a/static/rules.pdf b/docs/assets/rules.pdf similarity index 100% rename from static/rules.pdf rename to docs/assets/rules.pdf diff --git a/content/_index.md b/docs/index.md similarity index 75% rename from content/_index.md rename to docs/index.md index 16a09c25..47006850 100644 --- a/content/_index.md +++ b/docs/index.md @@ -1,5 +1,8 @@ --- -title: Homepage +title: Home +hide: + - navigation + - toc --- # SourceBots Robotics Documentation @@ -8,9 +11,8 @@ This documentation explains how to use the kit and the robot's Python API. There are a number of sections in the documentation offering help for the kit and programming. Under the tutorials section, concepts from across the entire documentation are brought together to help you understand what you can, or need, to do. -{{% notice tip %}} -Remember: **Read the docs!** -{{% /notice %}} +!!! tip + Read the docs! Within this documentation, you will come across a number of boxes like this: @@ -23,12 +25,13 @@ These are code examples provided to help you. From time to time, you may come across some warnings such as the following: -{{% notice warning %}} -Test your code! -{{% /notice %}} +!!! warning + Test your code! + +!!! danger + High voltage It would be advisable to take note of these, especially that one! You will also come across some blue boxes providing information, similar to the following: -{{% notice note %}} -Some useful information... like the information given in the information box above. -{{% /notice %}} +!!! note + Some useful information... like the information given in the information box above. diff --git a/docs/kit/arduino.md b/docs/kit/arduino.md new file mode 100644 index 00000000..de5db94c --- /dev/null +++ b/docs/kit/arduino.md @@ -0,0 +1,47 @@ +# Arduino + +This board allows you to control GPIO pins and analogue pins. More specifically, it's an [Arduino Uno](https://store.arduino.cc/arduino-uno-rev3>). + +![Arduino Uno](../assets/img/kit/arduino_headers.png) + +## Headers + +We have supplied 2 screw terminal headers for your Arduino, allowing you to easily and securely attach your sensors. + +## The reset button + +The small button next to the USB socket allows you to instantly reboot the Arduino in case it +isn't working. This isn't a guaranteed fix, but may solve some problems. + +## GPIO Pins + +The Arduino allows you to connect your kit to your own electronics. It has fourteen digital I/O pins, and six analogue input pins. The analogue pins can read an analogue signal from 0 to 5V and the digital pins can receive or send digital signals at 0V & 5V. The board also has a couple of ground pins, as well as some pins fixed at 3.3V and 5V output to supply power to your sensors. + +![Pin Map](../assets/img/kit/arduino_pinout.png) + +## Ultrasound Sensors + +Ultrasound sensors are a useful way of measuring distance. Ultrasound sensors communicate with the kit using two wires. A signal is sent to the sensor on the trigger pin, and the length of a response pulse on the echo pin can be used to calculate the distance. + +!!! warning + Ultrasound should only be considered accurate up to around two metres, beyond which the signal can become distorted and produce erroneous results. + +The sensor has four pin connections: ground, 5V (sometimes labelled +*vcc*), *trigger* and *echo*. Most ultrasound sensors will label which +pin is which. The ground and 5V should be wired to the ground and 5V +pins of the Arduino respectively. The trigger and echo pins should be +attached to two different digital IO pins. Take note of these two pins, +you'll need them to use the sensor. + +!!! tip + If the sensor always returns a distance of zero, it might mean the *trigger* and *echo* pins are connected the wrong way! Either change the pin numbers in the code, or swap the connections. + +## Designs + +The schematic diagrams for the Arduino is below, as +well as the source code of the firmware on the Arduino. You do not need +this information to use the board but it may be of interest to some +people. + +- [Arduino Uno Schematic](../assets/docs/arduino-schematic.pdf) +- [Firmware Source](https://github.com/sourcebots/arduino-fw) diff --git a/docs/kit/batteries.md b/docs/kit/batteries.md new file mode 100644 index 00000000..83eea391 --- /dev/null +++ b/docs/kit/batteries.md @@ -0,0 +1,64 @@ +# Batteries + +![LiPo Battery](../assets/img/kit/battery.jpg){ width="50%" } + +Your robot uses lithium-ion polymer (LiPo) batteries. +These are similar to those used in laptops, and are small and light for +the amount of energy they contain. This is great for your robot but it +is vital to treat such a high concentration of energy with respect. If +you do not, there is a serious risk of fire and injury. To avoid this, +you should follow the safety information on this page closely, at all +times. + +!!! warning + You must not use any batteries, chargers, bags or cables not explicitly authorised by SourceBots. + +## Warnings + +- Never leave batteries unattended when they are in use. +- Always place the batteries in the provided bag when not in use. +- If a battery has any cuts, nicks, exposed copper on wires or is + bulging to the point of no longer being squishy, contact us + immediately. + +!!! danger + Disobeying the above warnings greatly increases the risk of damage to your battery, which can have **fatal consequences**. If you have any questions or doubts, talk to a member of staff immediately. + +## Storing batteries + +When your batteries are not actively in use, they should be safely +stored. You must disconnect the batteries from all electrical equipment, +and place them in the battery charging bag. You should then store the +charging bag in a safe location. + +## Operating batteries + +To use your batteries, you must connect them to the power board. Do not +tamper with the cable or connect the batteries to anything other than +the power board (or the charger when charging). + +During operation, the battery is protected by over-current protection +and a fuse in the power board. If any equipment is short circuited, the +over-current protection will activate, protecting the battery. In +extreme circumstances the fuse may blow to prevent damage to the +battery. This is an important safety feature: do not, under any +circumstances, bypass the fuse. It is not user serviceable and if it has +blown then the power board must be replaced. If you suspect the fuse has +blown then please contact us straight away. + +Mechanical damage to a battery can be dangerous, and a puncture or large +force applied to a battery causes a serious risk of fire. To avoid this, +your battery should be shielded from mechanical damage while you operate +it. Secure your battery to your robot, so that it does not move or fall +off while the robot moves. You should also build a compartment for the +battery to be placed in, so that accidental collisions do not damage the +battery. + +## Flat batteries + +When the battery has been almost completely discharged, the Power Board +will automatically turn off and the LED marked “Power / Flat Battery +Indicator” in the [diagram](./power-board.md) will +flash red and green. You should immediately disconnect the battery. Flat +batteries should be given to a facilitator in exchange for a freshly charged +battery. diff --git a/docs/kit/index.md b/docs/kit/index.md new file mode 100644 index 00000000..133d034f --- /dev/null +++ b/docs/kit/index.md @@ -0,0 +1,15 @@ +--- +title: Kit +--- + +## Boards + +Your kit consists of 5 main "boards": + +| [Motor Board](./motor-board.md) | [Power Board](./power-board.md) | [Servo Board](./servo-board.md) | [Arduino](./arduino.md) | [Raspberry Pi](./pi.md) | +|---|---|---|---|---| +| ![Motor Board](../assets/img/kit/mcv4b.png) | ![Power Board](../assets/img/kit/pbv4.png) | ![Servo Board](../assets/img/kit/sbv4.png) | ![Arduino](../assets/img/kit/arduino_headers.png) | ![Pi](../assets/img/kit/pi.jpg) | + +It should be noted that only the Raspberry Pi and Power Board are required for your kit to work. The other boards will provide useful features to help your robot work. + +You will also need a [Battery](./batteries.md) to use your kit, although this may not be supplied to you immediately. diff --git a/content/kit/motor-board.md b/docs/kit/motor-board.md similarity index 93% rename from content/kit/motor-board.md rename to docs/kit/motor-board.md index 95720cfe..ebc9f9b5 100644 --- a/content/kit/motor-board.md +++ b/docs/kit/motor-board.md @@ -7,7 +7,8 @@ The Motor Board can be used to control two 12V DC motors. These can be used for The speed and direction of the two outputs are controlled independently through the USB interface. The USB interface is isolated from the rest of the board to prevent damage to the host in the case of a board failure. Due to this isolation the board must have power applied to both the power connector (from the 12V outputs on the power board) and the USB port. If the board does not have power applied to the power connector then the kit will report that there is a problem with the motor board. ## Board diagram -![Board Diagram](/img/kit/mcv4b_board_diagram.png) + +![Board Diagram](../assets/img/kit/mcv4b_board_diagram.png) ## Indicators | LED | Meaning | Initial power-up state | @@ -34,8 +35,8 @@ The case measures 70x84x20mm. Don’t forget that the cables will stick out. ## Designs You can access the schematics and source code of the firmware on the motor board in the following places. You do not need this information to use the board but it may be of interest to some people. -- [Full Schematics](/docs/motor-schematic.pdf) -- [Firmware Source](https://github.com/sourcebots/motor-v4-fw) +- [Full Schematics](../assets/docs/motor-schematic.pdf) +- [Firmware Source](https://github.com/srobo/motor-v4-fw) - [Hardware Source](https://github.com/sourcebots/motor-v4-hw) [^1]: Can be sustained for one second, on a single channel. diff --git a/docs/kit/pi.md b/docs/kit/pi.md new file mode 100644 index 00000000..02081a1c --- /dev/null +++ b/docs/kit/pi.md @@ -0,0 +1,36 @@ +# Raspberry Pi + +!!! danger + Do not re-flash or edit the SD card. This will stop your robot working! + +![Raspberry Pi 3B+](../assets/img/kit/pi.jpg){ width="50%" } + +The brain of your robot is a Raspberry Pi 3B+. This handles the running of your python code, recognition of markers and sends control commands to the other boards. + +## Power Hat + +Your Raspberry Pi has a Pi Power Hat mounted on the top. This allows you to connect power to it using a 3.81mm CamCon. + +![Pi Power Hat](../assets/img/kit/power_hat.svg){ width="200" } + +### Indicator LEDs + +There are 4 indicator LEDs on the Pi Power Hat. + +All LEDs will turn on at boot. After the Pi detects a USB stick, the LEDs work as follows: + +1. This LED will illuminate bright green when your Raspberry Pi is on. You may also notice it flicker during boot. +2. This LED will illuminate green when your code has finished without error. +3. This LED will illuminate yellow whilst your code is running. +4. This LED will illuminate red if your code has crashed. + +!!! tip + The LEDs may take a few seconds to update after you insert or remove your USB. + +## Technical Details + +Your robot is running a customised version of the [Raspberry Pi OS](https://www.raspberrypi.com/software/) operating system. + +When a USB stick is inserted, the SourceBots software will look for a file named `robot.py`, and then execute it. + +The output of your code is written to a file named `log.txt` on the USB stick. diff --git a/content/kit/power-board.md b/docs/kit/power-board.md similarity index 78% rename from content/kit/power-board.md rename to docs/kit/power-board.md index 584d8e46..e78282fb 100644 --- a/content/kit/power-board.md +++ b/docs/kit/power-board.md @@ -10,7 +10,8 @@ It also holds the internal On|Off switch for the whole robot as well as the Start button which is used to start your robot code. ## Board diagram -![Power Board Diagram](/img/kit/power_board_v4_diagram.png) + +![Power Board Diagram](../assets/img/kit/power_board_v4_diagram.png) ## Connectors There are six power output connectors on the board, labelled L0–L3, H0, and H1. @@ -21,15 +22,14 @@ They should be used to connect to the motor board power input, though can also be used to power other devices. These are enabled when your robot code is started and can also be turned on or off from your code. -There are two 5V connectors that can be used to connect low-current devices that take 5V inputs, such as the Raspberry Pi and the servo shield. +There are two 5V connectors that can be used to connect low-current devices that take 5V inputs, such as the Raspberry Pi. -There is also a Micro USB B connector which should be used to connect the Raspberry Pi for control of the power board. +There is also a Micro USB B connector which should be connected to the Raspberry Pi for control of the power board. Finally, there are connectors for external Start and On|Off switches. You may connect any latching switch for the On|Off switch, or a push-to-make button for the Start button. -{{% notice note %}} -If you intend to use only the internal On|Off switch, a CamCon must be plugged into the On|Off connector with a wire connecting one pin to the other pin on the same connector. Your power board should already have one of these plugged in. -{{% /notice %}} +!!! tip + If you intend to use only the internal On|Off switch, a CamCon must be plugged into the On|Off connector with a wire connecting one pin to the other pin on the same connector. Your power board should already have one of these plugged in. ## Indicators | LED | Meaning | Initial power-up state | @@ -37,11 +37,11 @@ If you intend to use only the internal On|Off switch, a CamCon must be plugged i | PWR\|FLAT | Green when powered
Flashing red and green when the battery is low | Green | | 5V | Green when 5V is being supplied | Green | | H0–1, L0–3 | Green when the corresponding output is on [^1]
Red when the output's current limit is reached | Off | -| RUN\|ERROR | Orange on power-up, or USB reset
Flashing green when ready to run
Solid green when running or booting | Orange | +| RUN\|ERROR | Orange on power-up, or USB disconnection
Flashing green when ready to run
Solid green when running or booting | Orange | [^1]: The outputs only turn on when your program runs (specifically, when the `Robot` object is created). -On power-up, the Power Board will emit some beeps, which are related to the version of the firmware it has installed. +On power-up and when waiting for the start button, the Power Board will beep once. If the Power Board starts beeping (and all the outputs turn off) then this means that the whole board's current limit has been triggered. @@ -69,6 +69,6 @@ The case measures 83x99x24mm. Don’t forget that the cables will stick out. ## Designs You can access the schematics and source code of the firmware for the power board in the following places. You do not need this information to use the board but it may be of interest to some people. -- [Full Schematics](/docs/power-schematic.pdf) -- [Firmware Source](https://github.com/sourcebots/power-v4-fw) +- [Full Schematics](../assets/docs/power-schematic.pdf) +- [Firmware Source](https://github.com/srobo/power-v4-fw) - [Hardware Source](https://github.com/sourcebots/power-v4-hw) diff --git a/docs/kit/servo-board.md b/docs/kit/servo-board.md new file mode 100644 index 00000000..58d33b82 --- /dev/null +++ b/docs/kit/servo-board.md @@ -0,0 +1,61 @@ +# Servo Board + +The Servo Board can be used to control up to 12 RC servos. Many devices +are available that can be controlled as servos, such as RC motor speed +controllers, and these can also be used with the board. + +## Board Diagram + +![Board Diagram](../assets/img/kit/sbv4_diagram.png) + +## Indicators + +| LED | Meaning | Initial power-up state | +|-------|----------------------|------------------------| +| Power | The board is powered | On + +## Connectors + +There are 8 servo connections on the left-side of the board, and 4 on +the right. Servo cables are connected vertically, with 0V (the black or +brown wire) at the bottom of the board. + +For the servo board to operate correctly, you must connect it to the 12V +power rail from the power board. A green LED will light next to the +servo board 12V connector when it is correctly powered and the 8 outputs +on the left-side of the board can be used. + +To use the 4 auxillary outputs on the right-side of the board, 5V needs to be connected to the auxillary input. + +## Case Dimensions + +The case measures 68x68x21mm. Don't forget that the cables will stick +out. + +## Range of servos + +When using the majority of servos that we supply, you will find that the +servo will only turn about 90 degrees. + +## Specification + +| Parameter | Value | +|----------------------------------|-------------| +| Number of servo channels | 12 | +| Nominal input voltage | 11.1V ± 15% | +| Output voltage | 5.5V | +| Maximum total output current[^1] | 10A | + +## Designs +------- + +You can access the schematics and source code of the firmware on the +servo board in the following places. You do not need this information to +use the board but it may be of interest to some people. + +- [Full Schematics](../assets/docs/servo-schematic.pdf) +- [Firmware Source](https://github.com/srobo/servo-v4-fw/) +- [Hardware designs](https://github.com/sourcebots/servo-v4-hw) + +[^1]: If the auxiliary input is connected, outputs 8-11 have an independent + maximum current. diff --git a/docs/programming/arduino.md b/docs/programming/arduino.md new file mode 100644 index 00000000..6f0a92dd --- /dev/null +++ b/docs/programming/arduino.md @@ -0,0 +1,119 @@ +# Arduino API + +The [Arduino](https://store.arduino.cc/arduino-uno-rev3) provides a +total of 18 pins for either digital input or output (labelled 2 to 13 +and A0 to A5), including 6 for analogue input (labelled A0 to A5). + +!!! warning + Digital pins 0 and 1 are reserved and cannot be used. + +## Accessing the Arduino + +The Arduino can be accessed using the `arduino` property of the `Robot` +object. + +``` python +my_arduino = robot.arduino +``` + +You can use the GPIO *(General Purpose Input/Output)* pins for anything, +from microswitches to LEDs. GPIO is only available on pins 2 to 13 and +A0 to A5 because pins 0 and 1 are reserved for communication with the +rest of our kit. + +## Pin Mode + +GPIO pins have four different modes. A pin can only have one mode at a +time, and some pins aren't compatible with certain modes. These pin +modes are represented by an +[enum](https://docs.python.org/3/library/enum.html) which needs to be +imported before they can be used. + +``` python +from sbot import GPIOPinMode +``` + +!!! tip + The input modes closely resemble those of an Arduino. More information on them can be found in [their docs](https://www.arduino.cc/en/Tutorial/DigitalPins). + +### Setting the pin mode + +You will need to ensure that the pin is in the correct pin mode before +performing an action with that pin. You can read about the possible pin +modes below. + +``` python +robot.arduino.pins[3].mode = GPIOPinMode.DIGITAL_INPUT_PULLUP +``` + +### `GPIOPinMode.DIGITAL_INPUT` + +In this mode, the digital state of the pin (whether it is high or low) +can be read. + +``` python +robot.arduino.pins[4].mode = GPIOPinMode.DIGITAL_INPUT + +pin_value = robot.arduino.pins[4].digital_state +``` + +### `GPIOPinMode.DIGITAL_INPUT_PULLUP` + +Same as `GPIOPinMode.DIGITAL_INPUT`, but with an internal [pull-up +resistor](https://learn.sparkfun.com/tutorials/pull-up-resistors) +enabled. + +``` python +robot.arduino.pins[4].mode = GPIOPinMode.DIGITAL_INPUT_PULLUP + +pin_value = robot.arduino.pins[4].digital_state +``` + +### `GPIOPinMode.DIGITAL_OUTPUT` + +In this mode, we can set binary values of `0V` or `5V` to the pin. + +``` python +robot.arduino.pins[4].mode = GPIOPinMode.DIGITAL_OUTPUT +robot.arduino.pins[6].mode = GPIOPinMode.DIGITAL_OUTPUT + +robot.arduino.pins[4].digital_state = True +robot.arduino.pins[6].digital_state = False +``` + +### `GPIOPinMode.ANALOGUE_INPUT` + +Certain sensors output analogue signals rather than digital ones, and so +have to be read differently. The Arduino has six analogue inputs, which +are labelled `A0` to `A5`; however pins `A4` and `A5` are reserved and +cannot be used. + +!!! tip + Analogue signals can have any voltage, while digital signals can only + take on one of two voltages. You can read more about digital vs analogue + signals [here](https://learn.sparkfun.com/tutorials/analog-vs-digital). + +``` python +from sbot import AnaloguePin + +robot.arduino.pins[AnaloguePin.A0].mode = GPIOPinMode.ANALOGUE_INPUT + +pin_value = robot.arduino.pins[AnaloguePin.A0].analogue_value +``` + +!!! tip + The values are the voltages read on the pins, between 0 and 5. + +## Ultrasound Sensors + +You can also measure distance using an ultrasound sensor from the arduino. + +```python +# Trigger pin: 4 +# Echo pin: 5 + +distance_metres = robot.arduino.ultrasound_measure(4, 5) +``` + +!!! warning + The ultrasound sensor can measure distances up to 2 metres. If the ultrasound signal has to travel further than 2m, the sensor will timeout and return `None`. diff --git a/content/api/game-state.md b/docs/programming/game-state.md similarity index 96% rename from content/api/game-state.md rename to docs/programming/game-state.md index e7d629b8..280e885d 100644 --- a/content/api/game-state.md +++ b/docs/programming/game-state.md @@ -15,7 +15,7 @@ Your robot can be in 1 of 2 modes: `DEVELOPMENT` and `COMPETITION`. By default, your robot will be in `DEVELOPMENT` mode: ``` python -r.is_competition +robot.is_competition >> False ``` @@ -29,9 +29,9 @@ zone. The number of zones depends on the game. Each zone is given a number, which you can access with the `zone` property: ``` python -r.zone +robot.zone >> 1 ``` During a competition match, a USB drive will be used to tell your robot -which corner it's in. By default during development, this is `0`. \ No newline at end of file +which corner it's in. By default during development, this is `0`. diff --git a/docs/programming/index.md b/docs/programming/index.md new file mode 100644 index 00000000..3d286f9e --- /dev/null +++ b/docs/programming/index.md @@ -0,0 +1,89 @@ +# Programming + +Programming your robot is done in [Python](https://www.python.org/), +specifically version 3.9.6. You can learn more about Python from their +[docs](https://docs.python.org/3/), and our [whirlwind tour](../tutorials/python-whirlwind-tour.md). + +Each board has an API which allows its various functionality to be controlled. + +## Setup + +The following two lines are required to complete initialisation of the +kit: + +``` python +from sbot import Robot + +robot = Robot() +``` + +Once this has been done, this `Robot` object can be used to control the +robot's functions. + +The remainder of the tutorials pages will assume your `Robot` object is +defined as `robot`. + +!!! note + In Python, variables are case-sensitive. `robot` is an instance of `Robot`. + +## Running your code + +Your code needs to be put on a USB drive in a file called `robot.py`. When connected to the robot, this file will be executed. The file is directly executed off your USB drive, with your drive as the working directory. + +!!! tip + If this file is missing or incorrectly named, your robot won't do anything. No log file will be created. + +To stop your code running, you can just remove the USB drive. This will also stop the motors and any other peripherals connected to the kit. + +You can then reinsert the USB drive into the robot, and it will run your `main.py` again (from the start). This allows you to make changes and test them quickly. + +## Logs + +A log file is saved to your USB so you can see what your robot did, +what it didn't do, and any errors it raised. The file is saved to log.txt in the top-level directory of the USB drive. + +!!! warning + The previous log file is deleted at the start of each run, so copy it elsewhere if you need to keep hold of it! + +## Running Code before pressing the start button + +If you want to do things before the start button press, such as setting up servos or motors, you can pass `wait_for_start` to the `Robot` constructor. You will then need to wait for the start button manually using `robot.wait_start()`. + +```python +robot = Robot(wait_for_start=False) + +# Do your setup here + +robot.wait_start() +``` + +## Debug mode + +It is possible to run your robot in "Debug Mode". + +In "Debug Mode", your robot will print more information about what it is doing. + +```python +from sbot import Robot + +robot = Robot(debug=True) +``` + +!!! info + Debug mode is very verbose. It will print a lot of information that you may not need. + +## Included Libraries + +Python comes with plenty of [built-in +libraries](https://docs.python.org/3.9/py-modindex.html) to use. We +install some extra ones which may be of use: + +- [numpy 1.25.0](https://pypi.org/project/numpy/1.25.0/) +- [matplotlib 3.7.1](https://pypi.org/project/matplotlib/3.7.1/) +- [pandas 2.0.3](https://pypi.org/project/pandas/2.0.3/) +- [scipy 1.11.1](https://pypi.org/project/scipy/1.11.1/) + +!!! tip + If you would like an extra library installed, go and ask a volunteer to see if we can help. + +*[API]: Application Programming Interface diff --git a/content/api/motor-board.md b/docs/programming/motor-board.md similarity index 69% rename from content/api/motor-board.md rename to docs/programming/motor-board.md index dbea54b8..dd2b7c13 100644 --- a/content/api/motor-board.md +++ b/docs/programming/motor-board.md @@ -1,6 +1,4 @@ ---- -title: Motor Board API ---- +# Motor Board API The kit can control multiple motors simultaneously. One Motor Board can control up to two motors. @@ -11,22 +9,19 @@ If there is exactly one motor board attached to your robot, it can be accessed using the `motor_board` property of the `Robot` object. ``` python -my_motor_board = r.motor_board +my_motor_board = robot.motor_board ``` -{{% notice warning %}} -If there is more than one motor board on your kit, you *must* use the -`motor_boards` property. `r.motor_board` *will cause an error*. This is -because the kit doesn't know which motor board you want to access. -{{% /notice %}} +!!! warning + If there is more than one motor board on your kit, you *must* use the `motor_boards` property. `robot.motor_board` *will cause an error*. This is because the kit doesn't know which motor board you want to access. Motor boards attached to your robot can be accessed under the `motor_boards` property of the `Robot`. The boards are indexed by their serial number, which is written on the board. ``` python -my_motor_board = r.motor_boards["SRO-AAD-GBH"] -my_other_motor_board = r.motor_boards["SR08U6"] +my_motor_board = robot.motor_boards["SRO-AAD-GBH"] +my_other_motor_board = robot.motor_boards["SR08U6"] ``` ## Controlling the Motor Board @@ -63,17 +58,11 @@ my_motor_board.motors[1].power >>> -1 ``` -{{% notice warning %}} -Setting a value outside of the range `-1` to `1` will raise an exception -and your code will crash. -{{% /notice %}} +!!! warning + Setting a value outside of the range `-1` to `1` will raise an exception and your code will crash. -{{% notice warning %}} -Sudden large changes in the motor speed setting (e.g. `-1` to `0`, `1` -to `-1` etc.) will likely trigger the over-current protection and your -robot will shut down with a distinct beeping noise and/or a red light -next to the power board output that is powering the motor board. -{{% /notice %}} +!!! danger + Sudden large changes in the motor speed setting (e.g. `-1` to `0`, `1` to `-1` etc.) will likely trigger the over-current protection and your robot will shut down with a distinct beeping noise and/or a red light next to the power board output that is powering the motor board. ### Special values @@ -90,9 +79,8 @@ from sbot import BRAKE, COAST `BRAKE` will stop the motors from turning, and thus stop your robot as quick as possible. -{{% notice tip %}} -`BRAKE` does the same as setting the power to `0`. -{{% /notice %}} +!!! note + `BRAKE` does the same as setting the power to `0`. ``` python from sbot import BRAKE diff --git a/docs/programming/power-board.md b/docs/programming/power-board.md new file mode 100644 index 00000000..07c031f8 --- /dev/null +++ b/docs/programming/power-board.md @@ -0,0 +1,99 @@ +# Power Board API + +The power board can be accessed using the `power_board` property of +the `Robot` object. + +```python +my_power_board = robot.power_board +``` + +## Power outputs + +The six outputs of the power board are grouped together as `power_board.outputs`. + +The power board's six outputs can be turned on and off using the +`power_on` and `power_off` functions of the group respectively. + +!!! tip + `power_on` is called when you set up your robot, so + this doesn't need to be called manually. The ports will come on + automatically as soon as your robot is ready, before the start button is + pressed. + +```python +robot.power_board.outputs.power_off() +robot.power_board.outputs.power_on() +``` + +You can also get information about and control each output in the group. +An output is indexed using the appropriate `PowerOutputPosition`. + +```python +from sbot import PowerOutputPosition + +robot.power_board.outputs[PowerOutputPosition.H0].is_enabled = True +robot.power_board.outputs[PowerOutputPosition.L3].is_enabled = False + +boolean_value = robot.power_board.outputs[PowerOutputPosition.L2].is_enabled + +current_amps = robot.power_board.outputs[PowerOutputPosition.H1].current +``` + +!!! warning + The motor and servo boards are powered through these + power outputs, whilst the power is off, you won't be able to control + your motors or servos. They will register as a missing board and your code will + break if you try and control them. + +## Battery Sensor + +The power board has some sensors that can monitor the status of your battery. +This can be useful for checking the charge status of your battery. + +```python +battery_voltage = robot.power_board.battery_sensor.voltage +battery_current_amps = robot.power_board.battery_sensor.current +``` + +## Buzzing 🐝 + +The power board has a piezo sounder which can buzz. + +The `buzz` function accepts two parameters. The first argument is the duration of the beep, in seconds. +The second argument is either the note you want to play, or the frequency of the buzzer (in Hertz). + +Theoretically, the piezo buzzer will buzz at any provided frequency, +however humans can only hear between [20Hz and +20000Hz](https://en.wikipedia.org/wiki/Hearing_range#Humans). + +The `Note` enum provides notes in [scientific pitch notation](https://en.wikipedia.org/wiki/Scientific_pitch_notation) between +`C6` and `C8`. You can play other tones by providing a frequency. + +!!! tip + Calling `buzz` is non-blocking, which means it doesn't + actually wait for the piezo to stop buzzing before continuing with your + code. If you want to wait for the buzzing to stop, add a + `sleep` afterwards! If you send more than 32 beeps to the robot too + quickly, your power board will crash! + +```python +from sbot import Note + +# Buzz for half a second in D6. +robot.power_board.piezo.buzz(0.5, Note.D6) + +# Buzz for 2 seconds at 400Hz +robot.power_board.piezo.buzz(2, 400) +``` + +## Start Button + +You can manually wait for the start button to be pressed, not only at +the start. + +```python +robot.wait_start() +``` + +This may be useful for debugging, but be sure to remove it in the +competition, as you won't be allowed to touch the start button after a match has begun! diff --git a/docs/programming/servo-board.md b/docs/programming/servo-board.md new file mode 100644 index 00000000..17e0337f --- /dev/null +++ b/docs/programming/servo-board.md @@ -0,0 +1,56 @@ +# Servo Board API + +The kit can control multiple servos simultaneously. One Servo Board can +control up to twelve servos. + +## Accessing the Servo Board + +The servo board can be accessed using the `servo_board` property of +the `Robot` object. + +```python +my_servo_board = robot.servo_board +``` + +This board object has an array containing the servos connected to it, +which can be accessed as `servos[0]`, `servos[1]`, `servos[2]`, etc. +The servo board is labelled so you know which servo is which. + +!!! tip + Remember that lists start counting at 0. + +## Setting servo positions + +The position of servos can range from `-1` to `1` inclusive: + +```python +# set servo 1's position to 0.2 +robot.servo_board.servos[1].position = 0.2 + +# Set servo 2's position to -0.55 +robot.servo_board.servos[2].position = -0.55 +``` + +You can read the last value a servo was set to using similar code: + +```python +last_position = robot.servo_board.servos[11].position +``` + +!!! warning + While it is possible to retrieve the last position a servo was set to, this does not guarantee that the servo is currently in that position. + +## How the set position relates to the servo angle + +!!! danger + You should be careful about forcing a servo to drive past its end stops. Some servos are very strong and it could damage the internal gears. + +The angle of an RC servo is controlled by the width of a pulse supplied +to it periodically. There is no standard for the width of this pulse and +there are differences between manufacturers as to what angle the servo +will turn to for a given pulse width. To be able to handle the widest +range of all servos our hardware outputs a very wide range of pulse +widths which in some cases will force the servo to try and turn past its +internal end-stops. You should experiment and find what the actual limit +of your servos are (it almost certainly won't be -1 and 1) and not +drive them past that. diff --git a/docs/programming/vision/index.md b/docs/programming/vision/index.md new file mode 100644 index 00000000..9c0734ae --- /dev/null +++ b/docs/programming/vision/index.md @@ -0,0 +1,108 @@ +# Vision + + +![An arena with Fiducial Markers](../../assets/img/api/vision/arena_marker.jpg) + +Your robot is able to use a webcam to detect [Fiducial Markers](https://en.wikipedia.org/wiki/Fiducial_marker). +Specifically it will detect [AprilTags](https://april.eecs.umich.edu/software/apriltag), using the `36H11` marker set. + +Using [Pose Estimation](https://en.wikipedia.org/wiki/3D_pose_estimation), it can calculate the orientation and position of +the marker relative to the webcam. Using this data, it is possible to determine the location of your robot and other objects around it. + +You can download the markers from the [resources page](../../resources/index.md). + +## Searching for markers + +Assuming you have a webcam connected, you can use `robot.camera.see()` to take a picture. The software will process the picture +and returns a list of the markers it sees. + +```python +markers = robot.camera.see() +``` + +!!! tip + Your camera will be able to process images better if they are not blurred. + +## Saving camera output + +You can also save a snapshot of what your webcam is currently seeing. This can be useful to debug your code. +Every marker that your robot can see will have a square annotated around it, with a red dot indicating the bottom right +corner of the marker. The ID of every marker is also written next to it. + +Snapshots are saved to your USB drive, and can be viewed on another computer. + +```python +robot.camera.save("snapshot.jpg") +``` + +![An annotated arena with Fiducial Markers.](../../assets/img/api/vision/arena_marker_annotated.jpg){ width="50%" } + +## Markers + +The marker objects in the list expose data that may be useful to your robot. + +### Marker ID + +Every marker has a numeric identifier that can be used to determine what object it represents. + +```python +markers = robot.camera.see() + +for m in markers: + print(m.id) +``` + +### Position + +Each marker has a position in 3D space, relative to your webcam. + +You can access the position using `m.distance`, `m.cartesian` and `m.spherical`. + +```python +markers = robot.camera.see() + +for m in markers: + print(m.distance) # Distance to the marker from the webcam, in metres + print(m.spherical.rot_y) # Bearing to the marker from the webcam, in radians +``` + +!!! note + `m.distance` is equivalent to `m.cartesian.z` or `m.spherical.dist`. + +For more information on position, including how to use `m.cartesian`, `m.spherical`, and the coordinate systems, +see [Position](./position.md). + +It is also possible to look at the [Orientation](./orientation.md) of the marker. + +!!! tip + You can use the [`math.degrees`](https://docs.python.org/3/library/math.html#math.degrees) function to convert from radians to degrees. + +### Size + +Markers can come in different sizes. +You can access the size of a marker using `m.size`. +Check the rules to find out how big the different marker types are. + +```python +markers = robot.camera.see() + +for m in markers: + print(m.size) +``` + +### Pixel Positions + +The positions of various points on the marker within the image are exposed over the API. This is useful +if you would like to perform your own Computer Vision calculations. + +The corners are specified in clockwise order, starting from the top left corner of the +marker. Pixels are counted from the origin of the image, which +conventionally is in the top left corner of the image. + +```python +markers = robot.camera.see() + +for m in markers: + print(m.pixel_corners) # Pixel positions of the marker corners within the image. + print(m.pixel_centre) # Pixel positions of the centre of the marker within the image. +``` diff --git a/docs/programming/vision/orientation.md b/docs/programming/vision/orientation.md new file mode 100644 index 00000000..8fb47627 --- /dev/null +++ b/docs/programming/vision/orientation.md @@ -0,0 +1,47 @@ +# Orientation + +![Yaw Pitch and Roll (Image source: Peking University)](../../assets/img/api/vision/yawpitchroll.png) + +Orientation represents the rotation of a marker around the x, y, and z axes. These can be accessed as follows: + +* `rot_x` / `pitch` - the angle of rotation in radians counter-clockwise about the Cartesian x axis. +* `rot_y` / `yaw` - the angle of rotation in radians counter-clockwise about the Cartesian y axis. +* `rot_z` / `roll` - the angle of rotation in radians counter-clockwise about the Cartesian z axis. + +Rotations are applied in order of z, y, x. + +```python +markers = robot.camera.see() + +for marker in markers: + print(marker.orientation.rot_x) # Angle of rotation about x axis. + print(marker.orientation.rot_y) # Angle of rotation about y axis. + print(marker.orientation.rot_z) # Angle of rotation about z axis. +``` + +!!! note + In our use case the z axis always faces the camera, and thus will appear as a clockwise rotation + +## Examples + +The following table visually explains what positive and negative rotations represent. + +!!! example + 0 in all axes: + + ![m0x0y0z]{ width="35%" } + +| | π/4 | -π/4 | +|---:|:---:|:---:| +| **`rot_x`** | ![m45x0y0z] | ![m-45x0y0z] | +| **`rot_y`** | ![m0x45y0z] | ![m0x-45y0z] | +| **`rot_z`** | ![m0x0y45z] | ![m0x0y-45z] | + +[m0x0y0z]: ../../assets/img/api/vision/m0x0y0z.png +[m-45x0y0z]: ../../assets/img/api/vision/m-45x0y0z.png +[m0x-45y0z]: ../../assets/img/api/vision/m0x-45y0z.png +[m0x0y-45z]: ../../assets/img/api/vision/m0x0y-45z.png +[m0x0y0z]: ../../assets/img/api/vision/m0x0y0z.png +[m0x0y45z]: ../../assets/img/api/vision/m0x0y45z.png +[m0x45y0z]: ../../assets/img/api/vision/m0x45y0z.png +[m45x0y0z]: ../../assets/img/api/vision/m45x0y0z.png diff --git a/docs/programming/vision/position.md b/docs/programming/vision/position.md new file mode 100644 index 00000000..61c7c22a --- /dev/null +++ b/docs/programming/vision/position.md @@ -0,0 +1,56 @@ +# Position + +Your robot supports two different coordinates systems for position: + +* Cartesian +* Spherical + +The latter is a [Polar Coordinates system](https://en.wikipedia.org/wiki/Polar_coordinate_system). + +## Cartesian + +![The cartesian coordinates system](../../assets/img/api/vision/cartesian.svg){ width="40%" } + +The [cartesian coordinates system](https://en.wikipedia.org/wiki/Cartesian_coordinate_system) has three +_principal axes_ that are perpendicular to each other. + +The value of each coordinate indicates the distance travelled along the axis to the point. + +The camera is located at the origin, where the coordinates are ``(0, 0, 0)``. + +```python +markers = robot.camera.see() + +for m in markers: + print(m.cartesian.x) # Displacement from the origin in millimetres, along x axis. + print(m.cartesian.y) # Displacement from the origin in millimetres, along y axis. + print(m.cartesian.z) # Displacement from the origin in millimetres, along z axis. +``` + +!!! tip + The `y` axis decreases as you go up. This matches convention for computer vision systems. + +## Spherical + +![The spherical coordinates system](../../assets/img/api/vision/spherical.svg){ width="40%" } + +The [spherical coordinates system](https://en.wikipedia.org/wiki/Spherical_coordinate_system) has +three values to specify a specific point in space. + +* `distance` - The _radial distance_, the distance from the origin to the point, in millimetres. +* `rot_x` - Rotation around the X-axis, in radians, corresponding to "theta" on the diagram. +* `rot_y` - Rotation around the Y-axis, in radians, corresponding to "phi" on the diagram. + +The camera is located at the origin, where the coordinates are `(0, 0, 0)`. + +```python +markers = robot.camera.see() + +for m in markers: + print(m.spherical.distance) # Distance from the origin in millimetres + print(m.spherical.rot_x) # The angle from the azimuth to the point, in radians. + print(m.spherical.rot_y) # The polar angle from the plane of the camera to the point, in radians. +``` + +!!! tip + You can use the [`math.degrees`](https://docs.python.org/3/library/math.html#math.degrees) function to convert from radians to degrees. diff --git a/docs/resources/index.md b/docs/resources/index.md new file mode 100644 index 00000000..f3b31163 --- /dev/null +++ b/docs/resources/index.md @@ -0,0 +1,24 @@ +--- +hide: + - navigation +--- + +# Resources + +Here you can find links to some useful resources. + +## Game Rules + +The game rules can be found on the [Rules](../rules/index.md) page. + +## Markers + +Some parts of the arena are labelled with markers. These can be downloaded below: + +[Download markers :fontawesome-solid-download:](https://drive.google.com/file/d/1OoQpvLmXecamn488gyRKmpgX-fy5ClpZ/view?usp=drive_link){ .md-button } + +Each PDF contains a single marker, which when printed on a single page will be the correct size. + +## Labs + +- [Python Lab](../tutorials/python-lab.md) diff --git a/docs/rules/index.md b/docs/rules/index.md new file mode 100644 index 00000000..074f4e40 --- /dev/null +++ b/docs/rules/index.md @@ -0,0 +1,7 @@ +--- +title: Rules +--- + +You can find the rules for Smallpeice 2021 competition here!: + +[Download the rules :fontawesome-solid-download:](../assets/rules.pdf){ .md-button .md-button--primary } diff --git a/docs/tutorials/.pages b/docs/tutorials/.pages new file mode 100644 index 00000000..990f2a79 --- /dev/null +++ b/docs/tutorials/.pages @@ -0,0 +1,7 @@ +nav: + - index.md + - python-whirlwind-tour.md + - python-lab.md + - getting-code-on-the-robot.md + - basic-movement.md + - ... diff --git a/docs/tutorials/basic-movement.md b/docs/tutorials/basic-movement.md new file mode 100644 index 00000000..c0752cf9 --- /dev/null +++ b/docs/tutorials/basic-movement.md @@ -0,0 +1,115 @@ +# Basic movement + +The example program we'll write will do a number of things with the motor: forwards and backwards, and different power settings, for example. Let's begin. To start off, we'll just make a motor move forwards, then backwards, and then repeat. + +## Forwards & backwards + +Doing this is actually very easy; the only thing you need to realise is that a positive number is forwards and a negative number is backwards. + +!!! tip + The actual direction of travel of a motor, when mounted on a robot, will depend on its orientation and the way in which the wires are connected to the motor board. If the motor appears to be going in the wrong direction, just swap the motor's positive and negative wires over. + +Here's the code: + +```python +from sbot import Robot + +robot = Robot() + +while True: + r.motor_board.motors[0].power = 0.5 + r.motor_board.motors[1].power = 0.5 + r.sleep(3) + + r.motor_board.motors[0].power = 0 + r.motor_board.motors[1].power = 0 + r.sleep(1.4) + + r.motor_board.motors[0].power = -0.5 + r.motor_board.motors[1].power = -0.5 + r.sleep(1) + + r.motor_board.motors[0].power = 0 + r.motor_board.motors[1].power = 0 + + r.sleep(4) +``` + +You're familiar with the first few lines; in fact, the only lines you may not be familiar with are the `r.motor_board...` lines. For a comprehensive reference to the `motor` object, see [`motor` API](../programming/motor-board.md) page. + +But, to summarise: + +`r.motor_board.motors[0].power = 0.5` sets the target power of the motor connected to output 0 on the first [motor board](../kit/motor-board.md) to half speed forwards (i.e. a duty-cycle of 50% forwards). As you would expect, then, `-0.5` will put this motor into reverse at half power. +`r.motor_board.motors[0].power = 0` will brake the motor and stop it. + +So, if you put the above code on your robot, you should be able to see a motor spin forwards, stop, spin backwards, stop, and then repeat... + +!!! info + If you find that the motor doesn't turn when you run the above code, check that you've got all the cables connected to the right places, in particular note that the motor board has _two_ outputs. + +## Changing the speed + +Now we're going to modify the program to vary the speed of the motor. Our aim is to do the forwards and backwards bit (as above), but, before we loop round again, ramp the power up to 70%, then down to -70%, and then back to 0 (all in steps of 10%). Here's the code: + +```python +from sbot import Robot + +robot = Robot() + +while True: + r.motor_board.motors[0].power = 0.5 + r.motor_board.motors[1].power = 0.5 + r.sleep(3) + + r.motor_board.motors[0].power = 0 + r.motor_board.motors[1].power = 0 + r.sleep(1.4) + + r.motor_board.motors[0].power = -0.5 + r.motor_board.motors[1].power = -0.5 + r.sleep(1) + + r.motor_board.motors[0].power = 0 + r.motor_board.motors[1].power = 0 + r.sleep(4) + + # ^^ code from before ^^ + + # power up to 0.7 (from 0.1) + for pwr in range(10, 80, 10): + r.motor_board.motors[0].power = pwr / 100 + r.motor_board.motors[1].power = pwr / 100 + r.sleep(0.1) + + # power down from 0.7 (to 0.1) + for pwr in range(70, 0, -10): + r.motor_board.motors[0].power = pwr / 100 + r.motor_board.motors[1].power = pwr / 100 + r.sleep(0.1) + + # set power to 0 for a second + r.motor_board.motors[0].power = 0 + r.motor_board.motors[1].power = 0 + r.sleep(1) + + # power up to -0.7 (from -0.1) + for pwr in range(-10, -80, -10): + r.motor_board.motors[0].power = pwr / 100 + r.motor_board.motors[1].power = pwr / 100 + r.sleep(0.1) + + # power down to -0.1 (from -0.7) + for pwr in range(-70, 0, 10): + r.motor_board.motors[0].power = pwr / 100 + r.motor_board.motors[1].power = pwr / 100 + r.sleep(0.1) + + # set power to 0 for a second + r.motor_board.motors[0].power = 0 + r.motor_board.motors[1].power = 0 + r.sleep(1) +``` + +## Next steps + +From here, you should be able to make your robot move about in a controlled manner. See if you can make your robot drive forwards to a given point, stop, turn around and then return to its starting point. diff --git a/docs/tutorials/getting-code-on-the-robot.md b/docs/tutorials/getting-code-on-the-robot.md new file mode 100644 index 00000000..d4340c2f --- /dev/null +++ b/docs/tutorials/getting-code-on-the-robot.md @@ -0,0 +1,25 @@ +# Getting code on the robot + +Getting your code on to the robot is quite simple. You will need to put your code on a USB drive which will need to be formatted with either FAT32, exFAT or ext 2-4. Upon plugging in the drive or starting up, the robot will run the `robot.py` file found in the root of the drive. + +To re-run your program, simply remove the USB stick from the robot and plug it back in again and it will restart automatically. + +## Windows + +1. Open your code in File Explorer +2. Select all of your code files (++ctrl+a++ to select all files) +3. Right-click the files and click "Copy" +4. Open your USB drive in File Explorer +5. Right-click in the directory and click "Paste" + +## macOS + +1. Open your code in Finder +2. Select all of your code files (++cmd+a++ to select all files) +3. Right-click (or Control-click) the files and click "Copy" +4. Open your USB drive in Finder +5. Right-click in the directory and click "Paste N items" + +## Robot logs + +When your program runs on the robot, the output of `print(...)` statements and any errors which occur are written to a log file on the USB stick as `log.txt`. diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md new file mode 100644 index 00000000..a3f9a174 --- /dev/null +++ b/docs/tutorials/index.md @@ -0,0 +1,5 @@ +--- +title: Tutorials +--- + +This part of the docs contains some practical guides for getting starting with both the physical kit and Python API. diff --git a/docs/tutorials/python-lab.md b/docs/tutorials/python-lab.md new file mode 100644 index 00000000..cf97dcc6 --- /dev/null +++ b/docs/tutorials/python-lab.md @@ -0,0 +1,8 @@ +# Python Lab + +The Python Lab is used in the general Python programming workshop. It's designed to help develop your Python skills through a series of tasks to add features to an existing application. + +!!! info + This lab assumes a basic knowledge of Python. If you're not familiar with Python, check out the [Whirlwind Tour](./python-whirlwind-tour.md). + +[View Python Lab :material-file-document:](https://sourcebots.github.io/python-lab/){ .md-button .md-button--primary target="_blank" } diff --git a/content/tutorials/python-whirlwind-tour.md b/docs/tutorials/python-whirlwind-tour.md similarity index 96% rename from content/tutorials/python-whirlwind-tour.md rename to docs/tutorials/python-whirlwind-tour.md index 47680b8d..9f8d789c 100644 --- a/content/tutorials/python-whirlwind-tour.md +++ b/docs/tutorials/python-whirlwind-tour.md @@ -1,10 +1,8 @@ ---- -title: "Python: A Whirlwind Tour" ---- +# Python: A Whirlwind Tour -# The Basics +## Installation -## Installing Python on Windows +### Installing Python on Windows Below are step-by-step instructions for installing Python 3.9.6 (which is required for the competition): @@ -14,15 +12,15 @@ Below are step-by-step instructions for installing Python 3.9.6 (which is requir 3. Click “save file” and wait for the installer to download. 4. Find your downloads folder and open the Python installer. You should get this window: - ![A window with the heading "Install Python 3.9.6 (64-bit)". Two buttons say "Install Now" and "Customise installation". Two checkboxes at the bottom; one says "Install launcher for all users (recommended)" and the other says "Add Python 3.9 to PATH".](/img/tutorials/whrl-win-1.png) + ![A window with the heading "Install Python 3.9.6 (64-bit)". Two buttons say "Install Now" and "Customise installation". Two checkboxes at the bottom; one says "Install launcher for all users (recommended)" and the other says "Add Python 3.9 to PATH".](../assets/img/tutorials/whrl-win-1.png) 5. Tick the **“Add Python 3.9 to PATH”** checkbox and click “Install Now” (important) 6. Windows will warn you on whether you want to make changes to this device. Click “yes”. 7. If the Python install was successful then you will get this window: - ![A window with the heading "Setup was successful" and a 'close' button in the bottom right.](/img/tutorials/whrl-win-2.png) + ![A window with the heading "Setup was successful" and a 'close' button in the bottom right.](../assets/img/tutorials/whrl-win-2.png) -## Installing Python on Mac +### Installing Python on Mac Below are step-by-step instruction for installing Python 3.9.6 (which is required for the competition): @@ -30,7 +28,7 @@ Below are step-by-step instruction for installing Python 3.9.6 (which is require 2. Scroll down “Files” and download the relevant Mac installer for your device. 3. Find your downloads folder and open the Python installer. You should get this window: - ![A window with the heading "Welcome to the Python installer" and a pair of buttons in the bottom right that say "Go Back" and "Continue".](/img/tutorials/whrl-mac-1.png) + ![A window with the heading "Welcome to the Python installer" and a pair of buttons in the bottom right that say "Go Back" and "Continue".](../assets/img/tutorials/whrl-mac-1.png) 4. Follow the rest of the instructions as given by the installer. @@ -349,11 +347,11 @@ Below is a list of mathematical operators that you can use: | Operator Name | in Python | Operator in mathematical form | | ------------- | --------- | ----------------------------- | -| Add | `a + b` | ![A plus B](/img/tutorials/add.png) | -| Subtract | `a - b` | ![A minus B](/img/tutorials/subtract.png) | -| Divide | `a / b` | ![A divided by B](/img/tutorials/divide.png) | -| Multiply | `a * b` | ![A times B](/img/tutorials/multiply.png) | -| Powers | `a ** b` | ![A to the power of B](/img/tutorials/powers.png) | +| Add | `a + b` | ![A plus B](../assets/img/tutorials/add.png) | +| Subtract | `a - b` | ![A minus B](../assets/img/tutorials/subtract.png) | +| Divide | `a / b` | ![A divided by B](../assets/img/tutorials/divide.png) | +| Multiply | `a * b` | ![A times B](../assets/img/tutorials/multiply.png) | +| Powers | `a ** b` | ![A to the power of B](../assets/img/tutorials/powers.png) | #### Additional Resources - Basic Operators diff --git a/layouts/partials/custom-header.html b/layouts/partials/custom-header.html deleted file mode 100644 index c37a1bb8..00000000 --- a/layouts/partials/custom-header.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/layouts/partials/favicon.html b/layouts/partials/favicon.html deleted file mode 100644 index 7261e9dd..00000000 --- a/layouts/partials/favicon.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/layouts/partials/logo.html b/layouts/partials/logo.html deleted file mode 100644 index 59b50605..00000000 --- a/layouts/partials/logo.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/layouts/partials/menu-footer.html b/layouts/partials/menu-footer.html deleted file mode 100644 index 8696e6c5..00000000 --- a/layouts/partials/menu-footer.html +++ /dev/null @@ -1 +0,0 @@ -

Built with with Learn and Hugo.

diff --git a/layouts/shortcodes/added_in.html b/layouts/shortcodes/added_in.html deleted file mode 100644 index 272d9764..00000000 --- a/layouts/shortcodes/added_in.html +++ /dev/null @@ -1,21 +0,0 @@ -{{ $feature := .Get "feature" }} -{{ $update := .Get "update" }} - -{{ with $.Site.GetPage "page" "updates" $update }} -
-

- Support for {{ $feature }} was added in the - {{ .Title }} - update. You need to be running at least that version of the kit software - in order to use this feature. -

-
-{{ else }} - -
-

- ERROR: - {{ errorf "Invalid update specified: '%s' does not exist." $update }} -

-
-{{ end }} diff --git a/layouts/shortcodes/center.html b/layouts/shortcodes/center.html deleted file mode 100644 index d4a64a97..00000000 --- a/layouts/shortcodes/center.html +++ /dev/null @@ -1,3 +0,0 @@ -
- {{ .Inner }} -
diff --git a/layouts/shortcodes/python_minor_version.html b/layouts/shortcodes/python_minor_version.html deleted file mode 100644 index 2620cd9a..00000000 --- a/layouts/shortcodes/python_minor_version.html +++ /dev/null @@ -1 +0,0 @@ -{{ delimit (first 2 (split .Site.Params.pythonVersion ".")) "." -}} diff --git a/layouts/shortcodes/python_patch_version.html b/layouts/shortcodes/python_patch_version.html deleted file mode 100644 index 0359a524..00000000 --- a/layouts/shortcodes/python_patch_version.html +++ /dev/null @@ -1 +0,0 @@ -{{ .Site.Params.pythonVersion -}} diff --git a/layouts/updates/list.html b/layouts/updates/list.html deleted file mode 100644 index 9c9e1236..00000000 --- a/layouts/updates/list.html +++ /dev/null @@ -1,28 +0,0 @@ -{{ partial "header.html" . }} - -{{ .Content }} - - - - - - - - - {{ range .Pages.ByDate.Reverse }} - - - - - - - {{ end }} -
Version numberRelease DateImage Download
{{ .Title }}{{ default "N/A" .Params.version }}{{ .Date.Format "2006-01-02" }} - {{ if .Params.image }} - Download pi-image.img.xz - {{ else }} - No SD card image available - {{ end }} -
- -{{ partial "footer.html" . }} diff --git a/layouts/updates/single.html b/layouts/updates/single.html deleted file mode 100644 index 4e0a9db0..00000000 --- a/layouts/updates/single.html +++ /dev/null @@ -1,17 +0,0 @@ -{{ partial "header.html" . }} - -{{ .Content }} - - - - {{ if .Params.image }} - - {{ end }} - - {{ if .Params.update }} - - {{ end }} - -
Download SD Card ImageDownload Update File
- -{{ partial "footer.html" . }} diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 00000000..2b6732a9 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,61 @@ +site_name: SourceBots Docs +site_url: https://docs.sourcebots.co.uk +strict: true +theme: + logo: assets/favicon.ico + favicon: assets/favicon.ico + name: material + features: + - navigation.tabs + - navigation.tabs.sticky + - toc.follow + - navigation.top + palette: + primary: deep purple + accent: purple + +copyright: "© SourceBots" + +extra: + generator: false + social: + - icon: fontawesome/solid/globe + link: https://sourcebots.co.uk + - icon: fontawesome/brands/github-alt + link: https://github.com/sourcebots + +# Extensions +markdown_extensions: + - attr_list + - abbr + - pymdownx.highlight + - pymdownx.superfences + - footnotes + - markdown.extensions.admonition + - markdown.extensions.def_list + - markdown.extensions.toc: + permalink: true + - pymdownx.betterem: + smart_enable: all + - pymdownx.caret + - pymdownx.details + - pymdownx.emoji: + emoji_index: !!python/name:materialx.emoji.twemoji + emoji_generator: !!python/name:materialx.emoji.to_svg + - pymdownx.inlinehilite + - pymdownx.keys + - pymdownx.magiclink + - pymdownx.mark + - pymdownx.progressbar + - pymdownx.smartsymbols + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.tilde + - mdx_include: + base_path: docs + + +plugins: + - search + - awesome-pages + - glightbox diff --git a/netlify.toml b/netlify.toml deleted file mode 100644 index f56b9fa8..00000000 --- a/netlify.toml +++ /dev/null @@ -1,13 +0,0 @@ -[build] - publish = "public/" - command = "./scripts/build.sh" - -[context.production.environment] - HUGO_VERSION = "0.87.0" - HUGO_ENV = "production" - -[context.deploy-preview.environment] - HUGO_VERSION = "0.87.0" - -[context.branch-deploy.environment] - HUGO_VERSION = "0.87.0" diff --git a/package-lock.json b/package-lock.json index fbbccff8..3031b983 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,444 @@ "license": "ISC", "dependencies": { "broken-link-checker-local": "0.2.1", - "markdown-spellcheck": "1.3.1" + "cspell": "^6.31.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "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/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/@cspell/cspell-bundled-dicts": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.31.1.tgz", + "integrity": "sha512-rsIev+dk1Vd8H1OKZhNhXycIVsMfeWJaeW3QUi1l4oIoGwQfJVbs1ZPZPHE5cglzyHOW1jQNStXf34UKaC6siA==", + "dependencies": { + "@cspell/dict-ada": "^4.0.1", + "@cspell/dict-aws": "^3.0.0", + "@cspell/dict-bash": "^4.1.1", + "@cspell/dict-companies": "^3.0.9", + "@cspell/dict-cpp": "^5.0.2", + "@cspell/dict-cryptocurrencies": "^3.0.1", + "@cspell/dict-csharp": "^4.0.2", + "@cspell/dict-css": "^4.0.5", + "@cspell/dict-dart": "^2.0.2", + "@cspell/dict-django": "^4.0.2", + "@cspell/dict-docker": "^1.1.6", + "@cspell/dict-dotnet": "^5.0.0", + "@cspell/dict-elixir": "^4.0.2", + "@cspell/dict-en_us": "^4.3.2", + "@cspell/dict-en-common-misspellings": "^1.0.2", + "@cspell/dict-en-gb": "1.1.33", + "@cspell/dict-filetypes": "^3.0.0", + "@cspell/dict-fonts": "^3.0.1", + "@cspell/dict-fullstack": "^3.1.5", + "@cspell/dict-gaming-terms": "^1.0.4", + "@cspell/dict-git": "^2.0.0", + "@cspell/dict-golang": "^6.0.1", + "@cspell/dict-haskell": "^4.0.1", + "@cspell/dict-html": "^4.0.3", + "@cspell/dict-html-symbol-entities": "^4.0.0", + "@cspell/dict-java": "^5.0.5", + "@cspell/dict-k8s": "^1.0.1", + "@cspell/dict-latex": "^4.0.0", + "@cspell/dict-lorem-ipsum": "^3.0.0", + "@cspell/dict-lua": "^4.0.1", + "@cspell/dict-node": "^4.0.2", + "@cspell/dict-npm": "^5.0.5", + "@cspell/dict-php": "^4.0.1", + "@cspell/dict-powershell": "^5.0.1", + "@cspell/dict-public-licenses": "^2.0.2", + "@cspell/dict-python": "^4.0.2", + "@cspell/dict-r": "^2.0.1", + "@cspell/dict-ruby": "^5.0.0", + "@cspell/dict-rust": "^4.0.1", + "@cspell/dict-scala": "^5.0.0", + "@cspell/dict-software-terms": "^3.1.6", + "@cspell/dict-sql": "^2.1.0", + "@cspell/dict-svelte": "^1.0.2", + "@cspell/dict-swift": "^2.0.1", + "@cspell/dict-typescript": "^3.1.1", + "@cspell/dict-vue": "^3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@cspell/cspell-pipe": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.31.1.tgz", + "integrity": "sha512-zk1olZi4dr6GLm5PAjvsiZ01HURNSruUYFl1qSicGnTwYN8GaN4RhAwannAytcJ7zJPIcyXlid0YsB58nJf3wQ==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@cspell/cspell-service-bus": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.31.1.tgz", + "integrity": "sha512-YyBicmJyZ1uwKVxujXw7sgs9x+Eps43OkWmCtDZmZlnq489HdTSuhF1kTbVi2yeFSeaXIS87+uHo12z97KkQpg==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@cspell/cspell-types": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.31.1.tgz", + "integrity": "sha512-1KeTQFiHMssW1eRoF2NZIEg4gPVIfXLsL2+VSD/AV6YN7lBcuf6gRRgV5KWYarhxtEfjxhDdDTmu26l/iJEUtw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@cspell/dict-ada": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.0.1.tgz", + "integrity": "sha512-/E9o3nHrXOhYmQE43deKbxZcR3MIJAsa+66IzP9TXGHheKEx8b9dVMVVqydDDH8oom1H0U20NRPtu6KRVbT9xw==" + }, + "node_modules/@cspell/dict-aws": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-3.0.0.tgz", + "integrity": "sha512-O1W6nd5y3Z00AMXQMzfiYrIJ1sTd9fB1oLr+xf/UD7b3xeHeMeYE2OtcWbt9uyeHim4tk+vkSTcmYEBKJgS5bQ==" + }, + "node_modules/@cspell/dict-bash": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.1.tgz", + "integrity": "sha512-8czAa/Mh96wu2xr0RXQEGMTBUGkTvYn/Pb0o+gqOO1YW+poXGQc3gx0YPqILDryP/KCERrNvkWUJz3iGbvwC2A==" + }, + "node_modules/@cspell/dict-companies": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.15.tgz", + "integrity": "sha512-SbSy8/YjRHNqAx8H+r5C2FxYbmW5bTDa1acqWIJxUkwACJIzwwOrtK9WWQVhiTtOGo7BVYXydXDgCBFf2H8+9A==" + }, + "node_modules/@cspell/dict-cpp": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.3.tgz", + "integrity": "sha512-7sx/RFsf0hB3q8chx8OHYl9Kd+g0pqA1laphwaAQ+/jPwoAreYT3kNQWbJ3bIt/rMoORetFSQxckSbaJXwwqpw==" + }, + "node_modules/@cspell/dict-cryptocurrencies": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-3.0.1.tgz", + "integrity": "sha512-Tdlr0Ahpp5yxtwM0ukC13V6+uYCI0p9fCRGMGZt36rWv8JQZHIuHfehNl7FB/Qc09NCF7p5ep0GXbL+sVTd/+w==" + }, + "node_modules/@cspell/dict-csharp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.2.tgz", + "integrity": "sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==" + }, + "node_modules/@cspell/dict-css": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.6.tgz", + "integrity": "sha512-2Lo8W2ezHmGgY8cWFr4RUwnjbndna5mokpCK/DuxGILQnuajR0J31ANQOXj/8iZM2phFB93ZzMNk/0c04TDfSQ==" + }, + "node_modules/@cspell/dict-dart": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.0.2.tgz", + "integrity": "sha512-jigcODm7Z4IFZ4vParwwP3IT0fIgRq/9VoxkXfrxBMsLBGGM2QltHBj7pl+joX+c4cOHxfyZktGJK1B1wFtR4Q==" + }, + "node_modules/@cspell/dict-data-science": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-1.0.3.tgz", + "integrity": "sha512-rnm9dCvqNDacSWB6V6S6o1fHd4jkUI0oNwI2D9HCA2PgsI8I00d7hAWyOXiwTYpbkSdUjElEk8wvEMJDRhttnQ==" + }, + "node_modules/@cspell/dict-django": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.0.2.tgz", + "integrity": "sha512-L0Yw6+Yh2bE9/FAMG4gy9m752G4V8HEBjEAGeRIQ9qvxDLR9yD6dPOtgEFTjv7SWlKSrLb9wA/W3Q2GKCOusSg==" + }, + "node_modules/@cspell/dict-docker": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.6.tgz", + "integrity": "sha512-zCCiRTZ6EOQpBnSOm0/3rnKW1kCcAUDUA7SxJG3SuH6iZvKi3I8FEg8+O83WQUeXg0SyPNerD9F40JLnnJjJig==" + }, + "node_modules/@cspell/dict-dotnet": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.0.tgz", + "integrity": "sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==" + }, + "node_modules/@cspell/dict-elixir": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.3.tgz", + "integrity": "sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==" + }, + "node_modules/@cspell/dict-en_us": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.3.tgz", + "integrity": "sha512-Csjm8zWo1YzLrQSdVZsRMfwHXoqqKR41pA8RpRGy2ODPjFeSteslyTW7jv1+R5V/E/IUI97Cxu+Nobm8MBy4MA==" + }, + "node_modules/@cspell/dict-en-common-misspellings": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-1.0.2.tgz", + "integrity": "sha512-jg7ZQZpZH7+aAxNBlcAG4tGhYF6Ksy+QS5Df73Oo+XyckBjC9QS+PrRwLTeYoFIgXy5j3ICParK5r3MSSoL4gw==" + }, + "node_modules/@cspell/dict-en-gb": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz", + "integrity": "sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==" + }, + "node_modules/@cspell/dict-filetypes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.0.tgz", + "integrity": "sha512-Fiyp0z5uWaK0d2TfR9GMUGDKmUMAsOhGD5A0kHoqnNGswL2iw0KB0mFBONEquxU65fEnQv4R+jdM2d9oucujuA==" + }, + "node_modules/@cspell/dict-fonts": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-3.0.2.tgz", + "integrity": "sha512-Z5QdbgEI7DV+KPXrAeDA6dDm/vTzyaW53SGlKqz6PI5VhkOjgkBXv3YtZjnxMZ4dY2ZIqq+RUK6qa9Pi8rQdGQ==" + }, + "node_modules/@cspell/dict-fullstack": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.1.5.tgz", + "integrity": "sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==" + }, + "node_modules/@cspell/dict-gaming-terms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.0.4.tgz", + "integrity": "sha512-hbDduNXlk4AOY0wFxcDMWBPpm34rpqJBeqaySeoUH70eKxpxm+dvjpoRLJgyu0TmymEICCQSl6lAHTHSDiWKZg==" + }, + "node_modules/@cspell/dict-git": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-2.0.0.tgz", + "integrity": "sha512-n1AxyX5Kgxij/sZFkxFJlzn3K9y/sCcgVPg/vz4WNJ4K9YeTsUmyGLA2OQI7d10GJeiuAo2AP1iZf2A8j9aj2w==" + }, + "node_modules/@cspell/dict-golang": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.2.tgz", + "integrity": "sha512-5pyZn4AAiYukAW+gVMIMVmUSkIERFrDX2vtPDjg8PLQUhAHWiVeQSDjuOhq9/C5GCCEZU/zWSONkGiwLBBvV9A==" + }, + "node_modules/@cspell/dict-haskell": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.1.tgz", + "integrity": "sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==" + }, + "node_modules/@cspell/dict-html": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.3.tgz", + "integrity": "sha512-Gae8i8rrArT0UyG1I6DHDK62b7Be6QEcBSIeWOm4VIIW1CASkN9B0qFgSVnkmfvnu1Y3H7SSaaEynKjdj3cs8w==" + }, + "node_modules/@cspell/dict-html-symbol-entities": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.0.tgz", + "integrity": "sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==" + }, + "node_modules/@cspell/dict-java": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.5.tgz", + "integrity": "sha512-X19AoJgWIBwJBSWGFqSgHaBR/FEykBHTMjL6EqOnhIGEyE9nvuo32tsSHjXNJ230fQxQptEvRZoaldNLtKxsRg==" + }, + "node_modules/@cspell/dict-k8s": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.1.tgz", + "integrity": "sha512-gc5y4Nm3hVdMZNBZfU2M1AsAmObZsRWjCUk01NFPfGhFBXyVne41T7E62rpnzu5330FV/6b/TnFcPgRmak9lLw==" + }, + "node_modules/@cspell/dict-latex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.0.tgz", + "integrity": "sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==" + }, + "node_modules/@cspell/dict-lorem-ipsum": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-3.0.0.tgz", + "integrity": "sha512-msEV24qEpzWZs2kcEicqYlhyBpR0amfDkJOs+iffC07si9ftqtQ+yP3lf1VFLpgqw3SQh1M1vtU7RD4sPrNlcQ==" + }, + "node_modules/@cspell/dict-lua": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.1.tgz", + "integrity": "sha512-j0MFmeCouSoC6EdZTbvGe1sJ9V+ruwKSeF+zRkNNNload7R72Co5kX1haW2xLHGdlq0kqSy1ODRZKdVl0e+7hg==" + }, + "node_modules/@cspell/dict-node": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.2.tgz", + "integrity": "sha512-FEQJ4TnMcXEFslqBQkXa5HposMoCGsiBv2ux4IZuIXgadXeHKHUHk60iarWpjhzNzQLyN2GD7NoRMd12bK3Llw==" + }, + "node_modules/@cspell/dict-npm": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.5.tgz", + "integrity": "sha512-eirZm4XpJNEcbmLGIwI2qXdRRlCKwEsH9mT3qCUytmbj6S6yn63F+8bShMW/yQBedV7+GXq9Td+cJdqiVutOiA==" + }, + "node_modules/@cspell/dict-php": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.1.tgz", + "integrity": "sha512-XaQ/JkSyq2c07MfRG54DjLi2CV+HHwS99DDCAao9Fq2JfkWroTQsUeek7wYZXJATrJVOULoV3HKih12x905AtQ==" + }, + "node_modules/@cspell/dict-powershell": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.1.tgz", + "integrity": "sha512-lLl+syWFgfv2xdsoxHfPIB2FGkn//XahCIKcRaf52AOlm1/aXeaJN579B9HCpvM7wawHzMqJ33VJuL/vb6Lc4g==" + }, + "node_modules/@cspell/dict-public-licenses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.2.tgz", + "integrity": "sha512-baKkbs/WGEV2lCWZoL0KBPh3uiPcul5GSDwmXEBAsR5McEW52LF94/b7xWM0EmSAc/y8ODc5LnPYC7RDRLi6LQ==" + }, + "node_modules/@cspell/dict-python": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.1.tgz", + "integrity": "sha512-gllGfnunCC3HhNuiF/e8OHq+EZG3bErydmnE1TlvSSngChLo/0O46hD7U+chHyTakZ6z4ancH5O+0cQ78e8XDA==", + "dependencies": { + "@cspell/dict-data-science": "^1.0.0" + } + }, + "node_modules/@cspell/dict-r": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.0.1.tgz", + "integrity": "sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==" + }, + "node_modules/@cspell/dict-ruby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.0.tgz", + "integrity": "sha512-ssb96QxLZ76yPqFrikWxItnCbUKhYXJ2owkoIYzUGNFl2CHSoHCb5a6Zetum9mQ/oUA3gNeUhd28ZUlXs0la2A==" + }, + "node_modules/@cspell/dict-rust": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.0.1.tgz", + "integrity": "sha512-xJSSzHDK2z6lSVaOmMxl3PTOtfoffaxMo7fTcbZUF+SCJzfKbO6vnN9TCGX2sx1RHFDz66Js6goz6SAZQdOwaw==" + }, + "node_modules/@cspell/dict-scala": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.0.tgz", + "integrity": "sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==" + }, + "node_modules/@cspell/dict-software-terms": { + "version": "3.1.16", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.1.16.tgz", + "integrity": "sha512-+gsJQlf7YEgLYtAKOxE5q6Xchw3E5xrvd1/5W0WPr1vE/HB/E4YP2YmUlUXV2OBEOudh82ZobX1mwf73c9r6Kw==" + }, + "node_modules/@cspell/dict-sql": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.0.tgz", + "integrity": "sha512-Bb+TNWUrTNNABO0bmfcYXiTlSt0RD6sB2MIY+rNlaMyIwug43jUjeYmkLz2tPkn3+2uvySeFEOMVYhMVfcuDKg==" + }, + "node_modules/@cspell/dict-svelte": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.2.tgz", + "integrity": "sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==" + }, + "node_modules/@cspell/dict-swift": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.1.tgz", + "integrity": "sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==" + }, + "node_modules/@cspell/dict-typescript": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.1.tgz", + "integrity": "sha512-N9vNJZoOXmmrFPR4ir3rGvnqqwmQGgOYoL1+y6D4oIhyr7FhaYiyF/d7QT61RmjZQcATMa6PSL+ZisCeRLx9+A==" + }, + "node_modules/@cspell/dict-vue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.0.tgz", + "integrity": "sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==" + }, + "node_modules/@cspell/dynamic-import": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-6.31.1.tgz", + "integrity": "sha512-uliIUv9uZlnyYmjUlcw/Dm3p0xJOEnWJNczHAfqAl4Ytg6QZktw0GtUA9b1umbRXLv0KRTPtSC6nMq3cR7rRmQ==", + "dependencies": { + "import-meta-resolve": "^2.2.2" }, - "devDependencies": {} + "engines": { + "node": ">=14" + } + }, + "node_modules/@cspell/strong-weak-map": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-6.31.1.tgz", + "integrity": "sha512-z8AuWvUuSnugFKJOA9Ke0aiFuehcqLFqia9bk8XaQNEWr44ahPVn3sEWnAncTxPbpWuUw5UajoJa0egRAE1CCg==", + "engines": { + "node": ">=14.6" + } + }, + "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/@types/node": { "version": "9.4.0", @@ -36,14 +471,6 @@ "node": ">= 0.6" } }, - "node_modules/ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -61,49 +488,24 @@ } }, "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" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { + "node_modules/array-timsort": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", - "dependencies": { - "lodash": "^4.14.0" - } + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==" }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/bhttp": { "version": "1.2.8", @@ -157,14 +559,25 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "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": "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/broken-link-checker": { "version": "0.7.8", "resolved": "https://registry.npmjs.org/broken-link-checker/-/broken-link-checker-0.7.8.tgz", @@ -243,14 +656,6 @@ "node": ">=4" } }, - "node_modules/broken-link-checker-local/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, "node_modules/broken-link-checker-local/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -323,15 +728,19 @@ "resolved": "https://registry.npmjs.org/char-spinner/-/char-spinner-1.0.1.tgz", "integrity": "sha1-5upnvSR+EHESmDt6sEee02KAAIE=" }, - "node_modules/cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "node_modules/clear-module": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/clear-module/-/clear-module-4.1.2.tgz", + "integrity": "sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==", "dependencies": { - "restore-cursor": "^1.0.1" + "parent-module": "^2.0.0", + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-table": { @@ -345,11 +754,6 @@ "node": ">= 0.2.0" } }, - "node_modules/cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, "node_modules/cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", @@ -416,9 +820,9 @@ } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "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/colors": { "version": "1.0.3", @@ -439,14 +843,32 @@ } }, "node_modules/commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha1-aWS8pnaF33wfFDDFhPB9dZeIW5w=" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/comment-json": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", + "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1", + "has-own-prop": "^2.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">= 6" + } }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.0", @@ -469,6 +891,22 @@ "node": ">=0.10.0" } }, + "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/content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -499,20 +937,22 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "node_modules/create-thenable": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/create-thenable/-/create-thenable-1.0.2.tgz", - "integrity": "sha1-4gMXIMzJV12M+jH1wUbnYqgMBTQ=", + "node_modules/cosmiconfig": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", "dependencies": { - "object.omit": "~2.0.0", - "unique-concat": "~0.2.2" + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=14" } }, "node_modules/cross-spawn": { @@ -530,6 +970,397 @@ "node": ">=4.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/cspell": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.31.1.tgz", + "integrity": "sha512-gyCtpkOpwI/TGibbtIgMBFnAUUp2hnYdvW/9Ky4RcneHtLH0+V/jUEbZD8HbRKz0GVZ6mhKWbNRSEyP9p3Cejw==", + "dependencies": { + "@cspell/cspell-pipe": "6.31.1", + "@cspell/dynamic-import": "6.31.1", + "chalk": "^4.1.2", + "commander": "^10.0.0", + "cspell-gitignore": "6.31.1", + "cspell-glob": "6.31.1", + "cspell-io": "6.31.1", + "cspell-lib": "6.31.1", + "fast-glob": "^3.2.12", + "fast-json-stable-stringify": "^2.1.0", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "imurmurhash": "^0.1.4", + "semver": "^7.3.8", + "strip-ansi": "^6.0.1", + "vscode-uri": "^3.0.7" + }, + "bin": { + "cspell": "bin.js", + "cspell-esm": "bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" + } + }, + "node_modules/cspell-dictionary": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-6.31.1.tgz", + "integrity": "sha512-7+K7aQGarqbpucky26wled7QSCJeg6VkLUWS+hLjyf0Cqc9Zew5xsLa4QjReExWUJx+a97jbiflITZNuWxgMrg==", + "dependencies": { + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "cspell-trie-lib": "6.31.1", + "fast-equals": "^4.0.3", + "gensequence": "^5.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cspell-gitignore": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.31.1.tgz", + "integrity": "sha512-PAcmjN6X89Z8qgjem6HYb+VmvVtKuc+fWs4sk21+jv2MiLk23Bkp+8slSaIDVR//58fxJkMx17PHyo2cDO/69A==", + "dependencies": { + "cspell-glob": "6.31.1", + "find-up": "^5.0.0" + }, + "bin": { + "cspell-gitignore": "bin.mjs" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cspell-gitignore/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/cspell-gitignore/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/cspell-gitignore/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/cspell-gitignore/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/cspell-gitignore/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/cspell-glob": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.31.1.tgz", + "integrity": "sha512-ygEmr5hgE4QtO5+L3/ihfMKBhPipbapfS22ilksFSChKMc15Regds0z+z/1ZBoe+OFAPneQfIuBxMwQ/fB00GQ==", + "dependencies": { + "micromatch": "^4.0.5" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cspell-grammar": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.31.1.tgz", + "integrity": "sha512-AsRVP0idcNFVSb9+p9XjMumFj3BUV67WIPWApaAzJl/dYyiIygQObRE+si0/QtFWGNw873b7hNhWZiKjqIdoaQ==", + "dependencies": { + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1" + }, + "bin": { + "cspell-grammar": "bin.mjs" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cspell-io": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.31.1.tgz", + "integrity": "sha512-deZcpvTYY/NmLfOdOtzcm+nDvJZozKmj4TY3pPpX0HquPX0A/w42bFRT/zZNmRslFl8vvrCZZUog7SOc6ha3uA==", + "dependencies": { + "@cspell/cspell-service-bus": "6.31.1", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cspell-lib": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.31.1.tgz", + "integrity": "sha512-KgSiulbLExY+z2jGwkO77+aAkyugsPAw7y07j3hTQLpd+0esPCZqrmbo2ItnkvkDNd/c34PqQCr7/044/rz8gw==", + "dependencies": { + "@cspell/cspell-bundled-dicts": "6.31.1", + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "@cspell/strong-weak-map": "6.31.1", + "clear-module": "^4.1.2", + "comment-json": "^4.2.3", + "configstore": "^5.0.1", + "cosmiconfig": "8.0.0", + "cspell-dictionary": "6.31.1", + "cspell-glob": "6.31.1", + "cspell-grammar": "6.31.1", + "cspell-io": "6.31.1", + "cspell-trie-lib": "6.31.1", + "fast-equals": "^4.0.3", + "find-up": "^5.0.0", + "gensequence": "^5.0.2", + "import-fresh": "^3.3.0", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0", + "vscode-languageserver-textdocument": "^1.0.8", + "vscode-uri": "^3.0.7" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/cspell-lib/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/cspell-lib/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/cspell-lib/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/cspell-lib/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/cspell-lib/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/cspell-trie-lib": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.31.1.tgz", + "integrity": "sha512-MtYh7s4Sbr1rKT31P2BK6KY+YfOy3dWsuusq9HnqCXmq6aZ1HyFgjH/9p9uvqGi/TboMqn1KOV8nifhXK3l3jg==", + "dependencies": { + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "gensequence": "^5.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cspell/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/cspell/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/cspell/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/cspell/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/cspell/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/cspell/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/cspell/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cspell/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/cspell/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/cspell/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/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -575,6 +1406,17 @@ "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz", "integrity": "sha1-WiBc48Ky73e2I41roXnrdMag6Bg=" }, + "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/duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", @@ -617,6 +1459,14 @@ "errno": "cli.js" } }, + "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/errors": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/errors/-/errors-0.2.0.tgz", @@ -675,14 +1525,6 @@ "node": ">=6" } }, - "node_modules/exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/express": { "version": "4.16.2", "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", @@ -728,45 +1570,59 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "node_modules/external-editor": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz", - "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=", - "dependencies": { - "extend": "^3.0.0", - "spawn-sync": "^1.0.15", - "tmp": "^0.0.29" - } + "node_modules/fast-equals": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==" }, - "node_modules/external-editor/node_modules/tmp": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", - "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "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": { - "os-tmpdir": "~1.0.1" + "@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": ">=0.4.0" + "node": ">=8.6.0" } }, - "node_modules/figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "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/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dependencies": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "reusify": "^1.0.4" + } + }, + "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": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/figures/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "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": ">=0.10.0" + "node": ">=8" } }, "node_modules/finalhandler": { @@ -797,25 +1653,23 @@ "node": ">=4" } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "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": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "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": { - "for-in": "^1.0.1" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" } }, + "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/form-data2": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/form-data2/-/form-data2-1.0.4.tgz", @@ -852,7 +1706,15 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/gensequence": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-5.0.2.tgz", + "integrity": "sha512-JlKEZnFc6neaeSVlkzBGGgkIoIaSxMgvdamRoPN8r3ozm2r9dusqxeKqYQ7lhzmj2UhFQP8nkyfCaiLQxiLrDA==", + "engines": { + "node": ">=14" + } }, "node_modules/get-caller-file": { "version": "1.0.3", @@ -867,6 +1729,17 @@ "node": ">=4" } }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -879,44 +1752,51 @@ } }, "node_modules/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "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.0.4", + "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/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "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": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/globby/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dependencies": { + "ini": "^1.3.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -929,11 +1809,19 @@ } }, "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/has-own-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/http-equiv-refresh": { @@ -976,14 +1864,6 @@ "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.12.1.tgz", "integrity": "sha1-6aUxUZ0AHuYAtkAPw1P+1Po7I18=" }, - "node_modules/hunspell-spellchecker": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hunspell-spellchecker/-/hunspell-spellchecker-1.0.2.tgz", - "integrity": "sha1-oQsL0voAplq2Kkxrc0zkltMYkQ4=", - "bin": { - "hunspell-tojson": "bin/hunspell-tojson.js" - } - }, "node_modules/iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", @@ -992,10 +1872,69 @@ "node": ">=0.10.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/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/import-fresh/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/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-meta-resolve": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.2.tgz", + "integrity": "sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -1006,26 +1945,10 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "node_modules/inquirer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz", - "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=", - "dependencies": { - "ansi-escapes": "^1.1.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", - "cli-width": "^2.0.0", - "external-editor": "^1.1.0", - "figures": "^1.3.5", - "lodash": "^4.3.0", - "mute-stream": "0.0.6", - "pinkie-promise": "^2.0.0", - "run-async": "^2.2.0", - "rx": "^4.1.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" - } + "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/invert-kv": { "version": "2.0.0", @@ -1043,15 +1966,20 @@ "node": ">= 0.10" } }, + "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-browser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.0.1.tgz", "integrity": "sha1-i/C695mpxi/Z3lvO5M8zl8PnUpo=" }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "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" } @@ -1067,6 +1995,33 @@ "node": ">=0.10.0" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/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-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", @@ -1075,11 +2030,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -1099,6 +2049,11 @@ "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/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -1114,18 +2069,27 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, + "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/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==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, + "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/lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -1149,6 +2113,11 @@ "node": ">= 0.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/link-types": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/link-types/-/link-types-1.1.0.tgz", @@ -1169,11 +2138,6 @@ "node": ">=4" } }, - "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.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -1193,83 +2157,37 @@ "yallist": "^2.1.2" } }, - "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==", + "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": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/markdown-spellcheck": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/markdown-spellcheck/-/markdown-spellcheck-1.3.1.tgz", - "integrity": "sha512-9uyovbDg3Kh2H89VDtqOkXKS9wuRgpLvOHXzPYWMR71tHQZWt2CAf28EIpXNhkFqqoEjXYAx+fXLuKufApYHRQ==", - "dependencies": { - "async": "^2.1.4", - "chalk": "^2.0.1", - "commander": "^2.8.1", - "globby": "^6.1.0", - "hunspell-spellchecker": "^1.0.2", - "inquirer": "^1.0.0", - "js-yaml": "^3.10.0", - "marked": "^0.3.5", - "sinon-as-promised": "^4.0.0" - }, - "bin": { - "mdspell": "bin/mdspell" + "semver": "^6.0.0" }, "engines": { - "node": ">= 4" - } - }, - "node_modules/markdown-spellcheck/node_modules/ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", - "dependencies": { - "color-convert": "^1.9.0" + "node": ">=8" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/markdown-spellcheck/node_modules/chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", - "dependencies": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - }, - "engines": { - "node": ">=4" + "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/markdown-spellcheck/node_modules/supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "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": { - "has-flag": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/marked": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", - "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", - "bin": { - "marked": "bin/marked" + "p-defer": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/maybe-callback": { @@ -1303,6 +2221,14 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "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", @@ -1311,6 +2237,18 @@ "node": ">= 0.6" } }, + "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/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -1350,9 +2288,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "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" }, @@ -1370,16 +2308,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "node_modules/mute-stream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", - "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=" - }, - "node_modules/native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" - }, "node_modules/negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -1393,6 +2321,25 @@ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, + "node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -1520,18 +2467,6 @@ "node": ">=0.10.0" } }, - "node_modules/object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dependencies": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -1551,14 +2486,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", @@ -1587,14 +2514,6 @@ "node": ">=0.10.0" } }, - "node_modules/os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -1671,11 +2590,47 @@ "node": ">=4" } }, + "node_modules/parent-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", + "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", + "dependencies": { + "callsites": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-module/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/parse-domain": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/parse-domain/-/parse-domain-0.2.2.tgz", "integrity": "sha1-GImJseLnOYv/PE9P19yhV+tR+sE=" }, + "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/parse5": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", @@ -1703,7 +2658,7 @@ "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } @@ -1721,31 +2676,23 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "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": ">=0.10.0" + "node": ">=8" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dependencies": { - "pinkie": "^2.0.0" + "node": ">=8.6" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/process-nextick-args": { @@ -1797,6 +2744,25 @@ "node": ">=0.6" } }, + "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/range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -1833,6 +2799,14 @@ "util-deprecate": "~1.0.1" } }, + "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/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -1846,18 +2820,48 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, - "node_modules/restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "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-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dependencies": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "global-dirs": "^0.1.1" }, "engines": { + "node": ">=8" + } + }, + "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/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/robot-directives": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/robot-directives/-/robot-directives-0.3.0.tgz", @@ -1886,22 +2890,28 @@ "through": "^2.3.4" } }, - "node_modules/run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "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": { - "is-promise": "^2.1.0" - }, - "engines": { - "node": ">=0.12.0" + "queue-microtask": "^1.2.2" } }, - "node_modules/rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" - }, "node_modules/safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -1994,28 +3004,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, - "node_modules/sinon-as-promised": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/sinon-as-promised/-/sinon-as-promised-4.0.3.tgz", - "integrity": "sha1-wFRbFoX9gTWIpO1pcBJIftEdFRs=", - "dependencies": { - "create-thenable": "~1.0.0", - "native-promise-only": "~0.8.1" - }, - "peerDependencies": { - "sinon": "1" - } - }, - "node_modules/spawn-sync": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", - "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", - "hasInstallScript": true, - "dependencies": { - "concat-stream": "^1.4.7", - "os-shim": "^0.1.2" - } - }, "node_modules/split": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", @@ -2032,11 +3020,6 @@ "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", "integrity": "sha1-/p965lc3GzOxDLgNoUPPgknPazs=" }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, "node_modules/statuses": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", @@ -2174,6 +3157,17 @@ "node": ">=0.6.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/tough-cookie": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", @@ -2185,6 +3179,11 @@ "node": ">=0.8" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/type-is": { "version": "1.6.15", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", @@ -2202,10 +3201,24 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, - "node_modules/unique-concat": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/unique-concat/-/unique-concat-0.2.2.tgz", - "integrity": "sha1-khD5vcqsxeHjkpSQ18AZ35bxhxI=" + "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/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/unpipe": { "version": "1.0.0", @@ -2284,6 +3297,30 @@ "node": ">= 0.8" } }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" + }, + "node_modules/vscode-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" + }, + "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/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": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -2328,6 +3365,25 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "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/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/xtend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", @@ -2419,9 +3475,413 @@ "engines": { "node": ">=4" } + }, + "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" + } } }, "dependencies": { + "@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "requires": { + "@babel/highlight": "^7.22.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" + }, + "@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "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" + } + }, + "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" + } + } + } + }, + "@cspell/cspell-bundled-dicts": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.31.1.tgz", + "integrity": "sha512-rsIev+dk1Vd8H1OKZhNhXycIVsMfeWJaeW3QUi1l4oIoGwQfJVbs1ZPZPHE5cglzyHOW1jQNStXf34UKaC6siA==", + "requires": { + "@cspell/dict-ada": "^4.0.1", + "@cspell/dict-aws": "^3.0.0", + "@cspell/dict-bash": "^4.1.1", + "@cspell/dict-companies": "^3.0.9", + "@cspell/dict-cpp": "^5.0.2", + "@cspell/dict-cryptocurrencies": "^3.0.1", + "@cspell/dict-csharp": "^4.0.2", + "@cspell/dict-css": "^4.0.5", + "@cspell/dict-dart": "^2.0.2", + "@cspell/dict-django": "^4.0.2", + "@cspell/dict-docker": "^1.1.6", + "@cspell/dict-dotnet": "^5.0.0", + "@cspell/dict-elixir": "^4.0.2", + "@cspell/dict-en_us": "^4.3.2", + "@cspell/dict-en-common-misspellings": "^1.0.2", + "@cspell/dict-en-gb": "1.1.33", + "@cspell/dict-filetypes": "^3.0.0", + "@cspell/dict-fonts": "^3.0.1", + "@cspell/dict-fullstack": "^3.1.5", + "@cspell/dict-gaming-terms": "^1.0.4", + "@cspell/dict-git": "^2.0.0", + "@cspell/dict-golang": "^6.0.1", + "@cspell/dict-haskell": "^4.0.1", + "@cspell/dict-html": "^4.0.3", + "@cspell/dict-html-symbol-entities": "^4.0.0", + "@cspell/dict-java": "^5.0.5", + "@cspell/dict-k8s": "^1.0.1", + "@cspell/dict-latex": "^4.0.0", + "@cspell/dict-lorem-ipsum": "^3.0.0", + "@cspell/dict-lua": "^4.0.1", + "@cspell/dict-node": "^4.0.2", + "@cspell/dict-npm": "^5.0.5", + "@cspell/dict-php": "^4.0.1", + "@cspell/dict-powershell": "^5.0.1", + "@cspell/dict-public-licenses": "^2.0.2", + "@cspell/dict-python": "^4.0.2", + "@cspell/dict-r": "^2.0.1", + "@cspell/dict-ruby": "^5.0.0", + "@cspell/dict-rust": "^4.0.1", + "@cspell/dict-scala": "^5.0.0", + "@cspell/dict-software-terms": "^3.1.6", + "@cspell/dict-sql": "^2.1.0", + "@cspell/dict-svelte": "^1.0.2", + "@cspell/dict-swift": "^2.0.1", + "@cspell/dict-typescript": "^3.1.1", + "@cspell/dict-vue": "^3.0.0" + } + }, + "@cspell/cspell-pipe": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.31.1.tgz", + "integrity": "sha512-zk1olZi4dr6GLm5PAjvsiZ01HURNSruUYFl1qSicGnTwYN8GaN4RhAwannAytcJ7zJPIcyXlid0YsB58nJf3wQ==" + }, + "@cspell/cspell-service-bus": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.31.1.tgz", + "integrity": "sha512-YyBicmJyZ1uwKVxujXw7sgs9x+Eps43OkWmCtDZmZlnq489HdTSuhF1kTbVi2yeFSeaXIS87+uHo12z97KkQpg==" + }, + "@cspell/cspell-types": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.31.1.tgz", + "integrity": "sha512-1KeTQFiHMssW1eRoF2NZIEg4gPVIfXLsL2+VSD/AV6YN7lBcuf6gRRgV5KWYarhxtEfjxhDdDTmu26l/iJEUtw==" + }, + "@cspell/dict-ada": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.0.1.tgz", + "integrity": "sha512-/E9o3nHrXOhYmQE43deKbxZcR3MIJAsa+66IzP9TXGHheKEx8b9dVMVVqydDDH8oom1H0U20NRPtu6KRVbT9xw==" + }, + "@cspell/dict-aws": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-3.0.0.tgz", + "integrity": "sha512-O1W6nd5y3Z00AMXQMzfiYrIJ1sTd9fB1oLr+xf/UD7b3xeHeMeYE2OtcWbt9uyeHim4tk+vkSTcmYEBKJgS5bQ==" + }, + "@cspell/dict-bash": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.1.tgz", + "integrity": "sha512-8czAa/Mh96wu2xr0RXQEGMTBUGkTvYn/Pb0o+gqOO1YW+poXGQc3gx0YPqILDryP/KCERrNvkWUJz3iGbvwC2A==" + }, + "@cspell/dict-companies": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.15.tgz", + "integrity": "sha512-SbSy8/YjRHNqAx8H+r5C2FxYbmW5bTDa1acqWIJxUkwACJIzwwOrtK9WWQVhiTtOGo7BVYXydXDgCBFf2H8+9A==" + }, + "@cspell/dict-cpp": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.3.tgz", + "integrity": "sha512-7sx/RFsf0hB3q8chx8OHYl9Kd+g0pqA1laphwaAQ+/jPwoAreYT3kNQWbJ3bIt/rMoORetFSQxckSbaJXwwqpw==" + }, + "@cspell/dict-cryptocurrencies": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-3.0.1.tgz", + "integrity": "sha512-Tdlr0Ahpp5yxtwM0ukC13V6+uYCI0p9fCRGMGZt36rWv8JQZHIuHfehNl7FB/Qc09NCF7p5ep0GXbL+sVTd/+w==" + }, + "@cspell/dict-csharp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.2.tgz", + "integrity": "sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==" + }, + "@cspell/dict-css": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.6.tgz", + "integrity": "sha512-2Lo8W2ezHmGgY8cWFr4RUwnjbndna5mokpCK/DuxGILQnuajR0J31ANQOXj/8iZM2phFB93ZzMNk/0c04TDfSQ==" + }, + "@cspell/dict-dart": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.0.2.tgz", + "integrity": "sha512-jigcODm7Z4IFZ4vParwwP3IT0fIgRq/9VoxkXfrxBMsLBGGM2QltHBj7pl+joX+c4cOHxfyZktGJK1B1wFtR4Q==" + }, + "@cspell/dict-data-science": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-1.0.3.tgz", + "integrity": "sha512-rnm9dCvqNDacSWB6V6S6o1fHd4jkUI0oNwI2D9HCA2PgsI8I00d7hAWyOXiwTYpbkSdUjElEk8wvEMJDRhttnQ==" + }, + "@cspell/dict-django": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.0.2.tgz", + "integrity": "sha512-L0Yw6+Yh2bE9/FAMG4gy9m752G4V8HEBjEAGeRIQ9qvxDLR9yD6dPOtgEFTjv7SWlKSrLb9wA/W3Q2GKCOusSg==" + }, + "@cspell/dict-docker": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.6.tgz", + "integrity": "sha512-zCCiRTZ6EOQpBnSOm0/3rnKW1kCcAUDUA7SxJG3SuH6iZvKi3I8FEg8+O83WQUeXg0SyPNerD9F40JLnnJjJig==" + }, + "@cspell/dict-dotnet": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.0.tgz", + "integrity": "sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==" + }, + "@cspell/dict-elixir": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.3.tgz", + "integrity": "sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==" + }, + "@cspell/dict-en_us": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.3.tgz", + "integrity": "sha512-Csjm8zWo1YzLrQSdVZsRMfwHXoqqKR41pA8RpRGy2ODPjFeSteslyTW7jv1+R5V/E/IUI97Cxu+Nobm8MBy4MA==" + }, + "@cspell/dict-en-common-misspellings": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-1.0.2.tgz", + "integrity": "sha512-jg7ZQZpZH7+aAxNBlcAG4tGhYF6Ksy+QS5Df73Oo+XyckBjC9QS+PrRwLTeYoFIgXy5j3ICParK5r3MSSoL4gw==" + }, + "@cspell/dict-en-gb": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz", + "integrity": "sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==" + }, + "@cspell/dict-filetypes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.0.tgz", + "integrity": "sha512-Fiyp0z5uWaK0d2TfR9GMUGDKmUMAsOhGD5A0kHoqnNGswL2iw0KB0mFBONEquxU65fEnQv4R+jdM2d9oucujuA==" + }, + "@cspell/dict-fonts": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-3.0.2.tgz", + "integrity": "sha512-Z5QdbgEI7DV+KPXrAeDA6dDm/vTzyaW53SGlKqz6PI5VhkOjgkBXv3YtZjnxMZ4dY2ZIqq+RUK6qa9Pi8rQdGQ==" + }, + "@cspell/dict-fullstack": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.1.5.tgz", + "integrity": "sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==" + }, + "@cspell/dict-gaming-terms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.0.4.tgz", + "integrity": "sha512-hbDduNXlk4AOY0wFxcDMWBPpm34rpqJBeqaySeoUH70eKxpxm+dvjpoRLJgyu0TmymEICCQSl6lAHTHSDiWKZg==" + }, + "@cspell/dict-git": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-2.0.0.tgz", + "integrity": "sha512-n1AxyX5Kgxij/sZFkxFJlzn3K9y/sCcgVPg/vz4WNJ4K9YeTsUmyGLA2OQI7d10GJeiuAo2AP1iZf2A8j9aj2w==" + }, + "@cspell/dict-golang": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.2.tgz", + "integrity": "sha512-5pyZn4AAiYukAW+gVMIMVmUSkIERFrDX2vtPDjg8PLQUhAHWiVeQSDjuOhq9/C5GCCEZU/zWSONkGiwLBBvV9A==" + }, + "@cspell/dict-haskell": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.1.tgz", + "integrity": "sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==" + }, + "@cspell/dict-html": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.3.tgz", + "integrity": "sha512-Gae8i8rrArT0UyG1I6DHDK62b7Be6QEcBSIeWOm4VIIW1CASkN9B0qFgSVnkmfvnu1Y3H7SSaaEynKjdj3cs8w==" + }, + "@cspell/dict-html-symbol-entities": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.0.tgz", + "integrity": "sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==" + }, + "@cspell/dict-java": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.5.tgz", + "integrity": "sha512-X19AoJgWIBwJBSWGFqSgHaBR/FEykBHTMjL6EqOnhIGEyE9nvuo32tsSHjXNJ230fQxQptEvRZoaldNLtKxsRg==" + }, + "@cspell/dict-k8s": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.1.tgz", + "integrity": "sha512-gc5y4Nm3hVdMZNBZfU2M1AsAmObZsRWjCUk01NFPfGhFBXyVne41T7E62rpnzu5330FV/6b/TnFcPgRmak9lLw==" + }, + "@cspell/dict-latex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.0.tgz", + "integrity": "sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==" + }, + "@cspell/dict-lorem-ipsum": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-3.0.0.tgz", + "integrity": "sha512-msEV24qEpzWZs2kcEicqYlhyBpR0amfDkJOs+iffC07si9ftqtQ+yP3lf1VFLpgqw3SQh1M1vtU7RD4sPrNlcQ==" + }, + "@cspell/dict-lua": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.1.tgz", + "integrity": "sha512-j0MFmeCouSoC6EdZTbvGe1sJ9V+ruwKSeF+zRkNNNload7R72Co5kX1haW2xLHGdlq0kqSy1ODRZKdVl0e+7hg==" + }, + "@cspell/dict-node": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.2.tgz", + "integrity": "sha512-FEQJ4TnMcXEFslqBQkXa5HposMoCGsiBv2ux4IZuIXgadXeHKHUHk60iarWpjhzNzQLyN2GD7NoRMd12bK3Llw==" + }, + "@cspell/dict-npm": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.5.tgz", + "integrity": "sha512-eirZm4XpJNEcbmLGIwI2qXdRRlCKwEsH9mT3qCUytmbj6S6yn63F+8bShMW/yQBedV7+GXq9Td+cJdqiVutOiA==" + }, + "@cspell/dict-php": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.1.tgz", + "integrity": "sha512-XaQ/JkSyq2c07MfRG54DjLi2CV+HHwS99DDCAao9Fq2JfkWroTQsUeek7wYZXJATrJVOULoV3HKih12x905AtQ==" + }, + "@cspell/dict-powershell": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.1.tgz", + "integrity": "sha512-lLl+syWFgfv2xdsoxHfPIB2FGkn//XahCIKcRaf52AOlm1/aXeaJN579B9HCpvM7wawHzMqJ33VJuL/vb6Lc4g==" + }, + "@cspell/dict-public-licenses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.2.tgz", + "integrity": "sha512-baKkbs/WGEV2lCWZoL0KBPh3uiPcul5GSDwmXEBAsR5McEW52LF94/b7xWM0EmSAc/y8ODc5LnPYC7RDRLi6LQ==" + }, + "@cspell/dict-python": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.1.tgz", + "integrity": "sha512-gllGfnunCC3HhNuiF/e8OHq+EZG3bErydmnE1TlvSSngChLo/0O46hD7U+chHyTakZ6z4ancH5O+0cQ78e8XDA==", + "requires": { + "@cspell/dict-data-science": "^1.0.0" + } + }, + "@cspell/dict-r": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.0.1.tgz", + "integrity": "sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==" + }, + "@cspell/dict-ruby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.0.tgz", + "integrity": "sha512-ssb96QxLZ76yPqFrikWxItnCbUKhYXJ2owkoIYzUGNFl2CHSoHCb5a6Zetum9mQ/oUA3gNeUhd28ZUlXs0la2A==" + }, + "@cspell/dict-rust": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.0.1.tgz", + "integrity": "sha512-xJSSzHDK2z6lSVaOmMxl3PTOtfoffaxMo7fTcbZUF+SCJzfKbO6vnN9TCGX2sx1RHFDz66Js6goz6SAZQdOwaw==" + }, + "@cspell/dict-scala": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.0.tgz", + "integrity": "sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==" + }, + "@cspell/dict-software-terms": { + "version": "3.1.16", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.1.16.tgz", + "integrity": "sha512-+gsJQlf7YEgLYtAKOxE5q6Xchw3E5xrvd1/5W0WPr1vE/HB/E4YP2YmUlUXV2OBEOudh82ZobX1mwf73c9r6Kw==" + }, + "@cspell/dict-sql": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.0.tgz", + "integrity": "sha512-Bb+TNWUrTNNABO0bmfcYXiTlSt0RD6sB2MIY+rNlaMyIwug43jUjeYmkLz2tPkn3+2uvySeFEOMVYhMVfcuDKg==" + }, + "@cspell/dict-svelte": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.2.tgz", + "integrity": "sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==" + }, + "@cspell/dict-swift": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.1.tgz", + "integrity": "sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==" + }, + "@cspell/dict-typescript": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.1.tgz", + "integrity": "sha512-N9vNJZoOXmmrFPR4ir3rGvnqqwmQGgOYoL1+y6D4oIhyr7FhaYiyF/d7QT61RmjZQcATMa6PSL+ZisCeRLx9+A==" + }, + "@cspell/dict-vue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.0.tgz", + "integrity": "sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==" + }, + "@cspell/dynamic-import": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-6.31.1.tgz", + "integrity": "sha512-uliIUv9uZlnyYmjUlcw/Dm3p0xJOEnWJNczHAfqAl4Ytg6QZktw0GtUA9b1umbRXLv0KRTPtSC6nMq3cR7rRmQ==", + "requires": { + "import-meta-resolve": "^2.2.2" + } + }, + "@cspell/strong-weak-map": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-6.31.1.tgz", + "integrity": "sha512-z8AuWvUuSnugFKJOA9Ke0aiFuehcqLFqia9bk8XaQNEWr44ahPVn3sEWnAncTxPbpWuUw5UajoJa0egRAE1CCg==" + }, + "@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" + } + }, "@types/node": { "version": "9.4.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.0.tgz", @@ -2441,11 +3901,6 @@ "negotiator": "0.6.1" } }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" - }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -2457,43 +3912,24 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "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" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { + "array-timsort": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", - "requires": { - "lodash": "^4.14.0" - } + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==" }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "bhttp": { "version": "1.2.8", @@ -2546,14 +3982,22 @@ } }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "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": "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" + } + }, "broken-link-checker": { "version": "0.7.8", "resolved": "https://registry.npmjs.org/broken-link-checker/-/broken-link-checker-0.7.8.tgz", @@ -2613,11 +4057,6 @@ "supports-color": "^5.3.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -2673,12 +4112,13 @@ "resolved": "https://registry.npmjs.org/char-spinner/-/char-spinner-1.0.1.tgz", "integrity": "sha1-5upnvSR+EHESmDt6sEee02KAAIE=" }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "clear-module": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/clear-module/-/clear-module-4.1.2.tgz", + "integrity": "sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==", "requires": { - "restore-cursor": "^1.0.1" + "parent-module": "^2.0.0", + "resolve-from": "^5.0.0" } }, "cli-table": { @@ -2689,11 +4129,6 @@ "colors": "1.0.3" } }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", @@ -2747,9 +4182,9 @@ } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "colors": { "version": "1.0.3", @@ -2767,14 +4202,26 @@ } }, "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha1-aWS8pnaF33wfFDDFhPB9dZeIW5w=" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" + }, + "comment-json": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", + "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", + "requires": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1", + "has-own-prop": "^2.0.0", + "repeat-string": "^1.6.1" + } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "concat-stream": { "version": "1.6.0", @@ -2791,6 +4238,19 @@ "resolved": "https://registry.npmjs.org/condense-whitespace/-/condense-whitespace-1.0.0.tgz", "integrity": "sha1-g3bZjvAo5sss0kaOKM5CxcZasak=" }, + "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" + } + }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -2801,40 +4261,309 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "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==" + }, + "cosmiconfig": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", + "requires": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + } + }, + "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" + } + }, + "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==" + }, + "cspell": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.31.1.tgz", + "integrity": "sha512-gyCtpkOpwI/TGibbtIgMBFnAUUp2hnYdvW/9Ky4RcneHtLH0+V/jUEbZD8HbRKz0GVZ6mhKWbNRSEyP9p3Cejw==", + "requires": { + "@cspell/cspell-pipe": "6.31.1", + "@cspell/dynamic-import": "6.31.1", + "chalk": "^4.1.2", + "commander": "^10.0.0", + "cspell-gitignore": "6.31.1", + "cspell-glob": "6.31.1", + "cspell-io": "6.31.1", + "cspell-lib": "6.31.1", + "fast-glob": "^3.2.12", + "fast-json-stable-stringify": "^2.1.0", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "imurmurhash": "^0.1.4", + "semver": "^7.3.8", + "strip-ansi": "^6.0.1", + "vscode-uri": "^3.0.7" + }, + "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" + } + }, + "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" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "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==" + } + } + }, + "cspell-dictionary": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-6.31.1.tgz", + "integrity": "sha512-7+K7aQGarqbpucky26wled7QSCJeg6VkLUWS+hLjyf0Cqc9Zew5xsLa4QjReExWUJx+a97jbiflITZNuWxgMrg==", + "requires": { + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "cspell-trie-lib": "6.31.1", + "fast-equals": "^4.0.3", + "gensequence": "^5.0.2" + } + }, + "cspell-gitignore": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.31.1.tgz", + "integrity": "sha512-PAcmjN6X89Z8qgjem6HYb+VmvVtKuc+fWs4sk21+jv2MiLk23Bkp+8slSaIDVR//58fxJkMx17PHyo2cDO/69A==", + "requires": { + "cspell-glob": "6.31.1", + "find-up": "^5.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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==" + } + } + }, + "cspell-glob": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.31.1.tgz", + "integrity": "sha512-ygEmr5hgE4QtO5+L3/ihfMKBhPipbapfS22ilksFSChKMc15Regds0z+z/1ZBoe+OFAPneQfIuBxMwQ/fB00GQ==", + "requires": { + "micromatch": "^4.0.5" + } }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "cspell-grammar": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.31.1.tgz", + "integrity": "sha512-AsRVP0idcNFVSb9+p9XjMumFj3BUV67WIPWApaAzJl/dYyiIygQObRE+si0/QtFWGNw873b7hNhWZiKjqIdoaQ==", + "requires": { + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1" + } }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "cspell-io": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.31.1.tgz", + "integrity": "sha512-deZcpvTYY/NmLfOdOtzcm+nDvJZozKmj4TY3pPpX0HquPX0A/w42bFRT/zZNmRslFl8vvrCZZUog7SOc6ha3uA==", + "requires": { + "@cspell/cspell-service-bus": "6.31.1", + "node-fetch": "^2.6.9" + } }, - "create-thenable": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/create-thenable/-/create-thenable-1.0.2.tgz", - "integrity": "sha1-4gMXIMzJV12M+jH1wUbnYqgMBTQ=", + "cspell-lib": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.31.1.tgz", + "integrity": "sha512-KgSiulbLExY+z2jGwkO77+aAkyugsPAw7y07j3hTQLpd+0esPCZqrmbo2ItnkvkDNd/c34PqQCr7/044/rz8gw==", "requires": { - "object.omit": "~2.0.0", - "unique-concat": "~0.2.2" + "@cspell/cspell-bundled-dicts": "6.31.1", + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "@cspell/strong-weak-map": "6.31.1", + "clear-module": "^4.1.2", + "comment-json": "^4.2.3", + "configstore": "^5.0.1", + "cosmiconfig": "8.0.0", + "cspell-dictionary": "6.31.1", + "cspell-glob": "6.31.1", + "cspell-grammar": "6.31.1", + "cspell-io": "6.31.1", + "cspell-trie-lib": "6.31.1", + "fast-equals": "^4.0.3", + "find-up": "^5.0.0", + "gensequence": "^5.0.2", + "import-fresh": "^3.3.0", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0", + "vscode-languageserver-textdocument": "^1.0.8", + "vscode-uri": "^3.0.7" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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==" + } } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "cspell-trie-lib": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.31.1.tgz", + "integrity": "sha512-MtYh7s4Sbr1rKT31P2BK6KY+YfOy3dWsuusq9HnqCXmq6aZ1HyFgjH/9p9uvqGi/TboMqn1KOV8nifhXK3l3jg==", "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "gensequence": "^5.0.2" } }, "debug": { @@ -2873,6 +4602,14 @@ "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz", "integrity": "sha1-WiBc48Ky73e2I41roXnrdMag6Bg=" }, + "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" + } + }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", @@ -2909,6 +4646,14 @@ "prr": "~1.0.1" } }, + "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" + } + }, "errors": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/errors/-/errors-0.2.0.tgz", @@ -2948,11 +4693,6 @@ "strip-eof": "^1.0.0" } }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" - }, "express": { "version": "4.16.2", "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", @@ -2995,40 +4735,50 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "external-editor": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz", - "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=", + "fast-equals": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==" + }, + "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": { - "extend": "^3.0.0", - "spawn-sync": "^1.0.15", - "tmp": "^0.0.29" - }, - "dependencies": { - "tmp": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", - "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", - "requires": { - "os-tmpdir": "~1.0.1" - } - } + "@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" + } + }, + "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==" + }, + "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" } }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "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": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } + "flat-cache": "^3.0.4" + } + }, + "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" } }, "finalhandler": { @@ -3053,19 +4803,20 @@ "locate-path": "^2.0.0" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "requires": { - "for-in": "^1.0.1" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, "form-data2": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/form-data2/-/form-data2-1.0.4.tgz", @@ -3096,7 +4847,12 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "gensequence": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-5.0.2.tgz", + "integrity": "sha512-JlKEZnFc6neaeSVlkzBGGgkIoIaSxMgvdamRoPN8r3ozm2r9dusqxeKqYQ7lhzmj2UhFQP8nkyfCaiLQxiLrDA==" }, "get-caller-file": { "version": "1.0.3", @@ -3108,6 +4864,11 @@ "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==" + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -3117,37 +4878,39 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "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.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "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": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "requires": { + "ini": "^1.3.4" } }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -3157,9 +4920,14 @@ } }, "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==" + }, + "has-own-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==" }, "http-equiv-refresh": { "version": "1.0.0", @@ -3194,20 +4962,54 @@ "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.12.1.tgz", "integrity": "sha1-6aUxUZ0AHuYAtkAPw1P+1Po7I18=" }, - "hunspell-spellchecker": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hunspell-spellchecker/-/hunspell-spellchecker-1.0.2.tgz", - "integrity": "sha1-oQsL0voAplq2Kkxrc0zkltMYkQ4=" - }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=" }, + "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": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "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" + } + }, + "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-meta-resolve": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.2.tgz", + "integrity": "sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==" + }, + "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": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" @@ -3218,26 +5020,10 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "inquirer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz", - "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=", - "requires": { - "ansi-escapes": "^1.1.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", - "cli-width": "^2.0.0", - "external-editor": "^1.1.0", - "figures": "^1.3.5", - "lodash": "^4.3.0", - "mute-stream": "0.0.6", - "pinkie-promise": "^2.0.0", - "run-async": "^2.2.0", - "rx": "^4.1.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" - } + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "invert-kv": { "version": "2.0.0", @@ -3249,15 +5035,20 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, "is-browser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.0.1.tgz", "integrity": "sha1-i/C695mpxi/Z3lvO5M8zl8PnUpo=" }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-fullwidth-code-point": { "version": "1.0.0", @@ -3267,16 +5058,29 @@ "number-is-nan": "^1.0.0" } }, + "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" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "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-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==" }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3287,6 +5091,11 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -3302,15 +5111,24 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "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==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" } }, + "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==" + }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -3328,6 +5146,11 @@ "parse-domain": "~0.2.0" } }, + "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==" + }, "link-types": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/link-types/-/link-types-1.1.0.tgz", @@ -3342,11 +5165,6 @@ "path-exists": "^3.0.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -3366,6 +5184,21 @@ "yallist": "^2.1.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", @@ -3374,55 +5207,6 @@ "p-defer": "^1.0.0" } }, - "markdown-spellcheck": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/markdown-spellcheck/-/markdown-spellcheck-1.3.1.tgz", - "integrity": "sha512-9uyovbDg3Kh2H89VDtqOkXKS9wuRgpLvOHXzPYWMR71tHQZWt2CAf28EIpXNhkFqqoEjXYAx+fXLuKufApYHRQ==", - "requires": { - "async": "^2.1.4", - "chalk": "^2.0.1", - "commander": "^2.8.1", - "globby": "^6.1.0", - "hunspell-spellchecker": "^1.0.2", - "inquirer": "^1.0.0", - "js-yaml": "^3.10.0", - "marked": "^0.3.5", - "sinon-as-promised": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", - "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "requires": { - "has-flag": "^2.0.0" - } - } - } - }, - "marked": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", - "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==" - }, "maybe-callback": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/maybe-callback/-/maybe-callback-2.1.0.tgz", @@ -3448,11 +5232,25 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "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": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, + "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" + } + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -3477,9 +5275,9 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "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" } @@ -3494,16 +5292,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "mute-stream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", - "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=" - }, - "native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" - }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -3514,6 +5302,14 @@ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, + "node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -3600,15 +5396,6 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -3625,11 +5412,6 @@ "wrappy": "1" } }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" - }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", @@ -3649,11 +5431,6 @@ "win-release": "^1.0.0" } }, - "os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=" - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -3703,11 +5480,37 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, + "parent-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", + "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", + "requires": { + "callsites": "^3.1.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + } + } + }, "parse-domain": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/parse-domain/-/parse-domain-0.2.2.tgz", "integrity": "sha1-GImJseLnOYv/PE9P19yhV+tR+sE=" }, + "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" + } + }, "parse5": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", @@ -3729,7 +5532,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "2.0.1", @@ -3741,23 +5544,15 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "process-nextick-args": { "version": "1.0.7", @@ -3802,6 +5597,11 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -3832,6 +5632,11 @@ "util-deprecate": "~1.0.1" } }, + "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==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3842,13 +5647,30 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "requires": { + "global-dirs": "^0.1.1" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "glob": "^7.1.3" } }, "robot-directives": { @@ -3876,19 +5698,14 @@ "through": "^2.3.4" } }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "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": { - "is-promise": "^2.1.0" + "queue-microtask": "^1.2.2" } }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" - }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -3965,24 +5782,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, - "sinon-as-promised": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/sinon-as-promised/-/sinon-as-promised-4.0.3.tgz", - "integrity": "sha1-wFRbFoX9gTWIpO1pcBJIftEdFRs=", - "requires": { - "create-thenable": "~1.0.0", - "native-promise-only": "~0.8.1" - } - }, - "spawn-sync": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", - "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", - "requires": { - "concat-stream": "^1.4.7", - "os-shim": "^0.1.2" - } - }, "split": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", @@ -3996,11 +5795,6 @@ "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", "integrity": "sha1-/p965lc3GzOxDLgNoUPPgknPazs=" }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, "statuses": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", @@ -4122,6 +5916,14 @@ "os-tmpdir": "~1.0.2" } }, + "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" + } + }, "tough-cookie": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", @@ -4130,6 +5932,11 @@ "punycode": "^1.4.1" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "type-is": { "version": "1.6.15", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", @@ -4144,10 +5951,21 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, - "unique-concat": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/unique-concat/-/unique-concat-0.2.2.tgz", - "integrity": "sha1-khD5vcqsxeHjkpSQ18AZ35bxhxI=" + "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" + } + }, + "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" + } }, "unpipe": { "version": "1.0.0", @@ -4208,6 +6026,30 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" + }, + "vscode-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" + }, + "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==" + }, + "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": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -4243,6 +6085,22 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "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" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + }, "xtend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", @@ -4320,6 +6178,11 @@ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" } } + }, + "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==" } } } diff --git a/package.json b/package.json index c8d8fe82..61461fb9 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "version": "1.0.0", "description": "", "scripts": { - "spellcheck": "mdspell --en-gb --report --ignore-acronyms --ignore-numbers --no-suggestions 'content/**/*.md'", - "broken-link-local": "blcl --recursive --ordered --exclude-external ./public/", - "broken-link-all": "blcl --recursive --exclude farnell --exclude microsoft --exclude https://github.com/sourcebots/docs/tree/master/content/* --ordered ./public/", + "spellcheck": "cspell 'docs/**/*.md'", + "broken-link-local": "blcl --recursive --ordered --exclude-external ./site/", + "broken-link-all": "blcl --recursive --exclude farnell --exclude microsoft --exclude https://github.com/sourcebots/docs/tree/master/docs/* --ordered ./site/", "test": "npm run spellcheck && npm run broken-link-local", "ci-test": "npm run spellcheck && npm run broken-link-local" }, @@ -19,9 +19,8 @@ "url": "https://github.com/sourcebots/docs/issues" }, "homepage": "https://github.com/sourcebots/docs#readme", - "devDependencies": {}, "dependencies": { "broken-link-checker-local": "0.2.1", - "markdown-spellcheck": "1.3.1" + "cspell": "^6.31.1" } } diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..22505fc5 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +mkdocs==1.4.3 +mkdocs-material==9.1.16 +mdx-include==1.4.2 +mkdocs-awesome-pages-plugin==2.9.1 +mkdocs-glightbox==0.3.4 diff --git a/scripts/build.sh b/scripts/build.sh deleted file mode 100755 index 4931be6d..00000000 --- a/scripts/build.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -set -e - -export PATH=node_modules/.bin:${PATH} - -rm -rf public/ -rm -rf content/tutorials/kit-assembly.files -cp -r static/img/assembly content/tutorials/kit-assembly.files - -hugo -v diff --git a/scripts/server.sh b/scripts/server.sh deleted file mode 100755 index e308fc63..00000000 --- a/scripts/server.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -set -e - -bash ./scripts/build.sh - -hugo server --noHTTPCache --disableFastRender diff --git a/shell.nix b/shell.nix deleted file mode 100644 index c90f0cf7..00000000 --- a/shell.nix +++ /dev/null @@ -1,13 +0,0 @@ -{ pkgs ? import {}, withTestSupport ? true }: - -with pkgs; - -# Require hugo >= 0.87. -assert (builtins.compareVersions hugo.version "0.87.0") >= 0; - -stdenv.mkDerivation { - name = "docs-env"; - buildInputs = [ - hugo - ] ++ lib.optional withTestSupport nodejs; -} diff --git a/static/css/style.css b/static/css/style.css deleted file mode 100644 index 5f51f451..00000000 --- a/static/css/style.css +++ /dev/null @@ -1,4 +0,0 @@ -code, kbd, pre, samp { - /* Replace the default font as it is too difficult to distinguish between l and 1 */ - font-family: "Courier New", Courier, "Lucida Sans Typewriter", "Lucida Typewriter", monospace; -} diff --git a/static/img/api/coordinate-spaces.svg b/static/img/api/coordinate-spaces.svg deleted file mode 100644 index 13420ab2..00000000 --- a/static/img/api/coordinate-spaces.svg +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - z - y - - - - - z - x - View from above - View from left side - - rot_x - - rot_y - - diff --git a/static/img/kit/servo-assembly.jpg b/static/img/kit/servo-assembly.jpg deleted file mode 100644 index 8dd47bc4..00000000 Binary files a/static/img/kit/servo-assembly.jpg and /dev/null differ diff --git a/static/img/kit/servo-assembly.png b/static/img/kit/servo-assembly.png deleted file mode 100644 index 3a915796..00000000 Binary files a/static/img/kit/servo-assembly.png and /dev/null differ diff --git a/static/img/robots/crane-isolated.png b/static/img/robots/crane-isolated.png deleted file mode 100644 index 919f5e46..00000000 Binary files a/static/img/robots/crane-isolated.png and /dev/null differ diff --git a/static/img/robots/forklift-isolated.png b/static/img/robots/forklift-isolated.png deleted file mode 100644 index fb700039..00000000 Binary files a/static/img/robots/forklift-isolated.png and /dev/null differ diff --git a/themes/learn b/themes/learn deleted file mode 160000 index d198cbe6..00000000 --- a/themes/learn +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d198cbe65f064575df1ab02415980d6e44363bf9