diff --git a/include/thirdparty/css-crush/.github/workflows/php.yml b/include/thirdparty/css-crush/.github/workflows/php.yml
new file mode 100644
index 0000000..edd94f4
--- /dev/null
+++ b/include/thirdparty/css-crush/.github/workflows/php.yml
@@ -0,0 +1,29 @@
+name: CI
+
+on: [push]
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Validate composer.json and composer.lock
+ run: composer validate --strict
+
+ - name: Cache Composer packages
+ id: composer-cache
+ uses: actions/cache@v2
+ with:
+ path: vendor
+ key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-php-
+
+ - name: Install dependencies
+ run: composer install --prefer-dist --no-progress
+
+ - name: Run test suite
+ run: composer run-script test
diff --git a/include/thirdparty/css-crush/composer.json b/include/thirdparty/css-crush/composer.json
new file mode 100644
index 0000000..246f7b4
--- /dev/null
+++ b/include/thirdparty/css-crush/composer.json
@@ -0,0 +1,36 @@
+{
+ "name": "css-crush/css-crush",
+ "type": "library",
+ "description": "CSS preprocessor",
+ "keywords": ["css", "preprocessor"],
+ "homepage": "http://the-echoplex.net/csscrush",
+ "license": "MIT",
+ "scripts": {
+ "test": "vendor/bin/phpunit tests"
+ },
+ "authors": [
+ {
+ "name": "Pete Boere",
+ "email": "pete@the-echoplex.net"
+ },
+ {
+ "name": "GitHub contributors",
+ "homepage": "https://github.com/peteboere/css-crush/contributors"
+ }
+ ],
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "8.*",
+ "psr/log": "1.0.*@dev",
+ "twig/twig": "1.*"
+ },
+ "bin": [
+ "bin/csscrush"
+ ],
+ "autoload": {
+ "psr-0": { "CssCrush": "lib/" },
+ "files": [ "lib/functions.php" ]
+ }
+}
diff --git a/include/thirdparty/css-crush/docs/README.md b/include/thirdparty/css-crush/docs/README.md
new file mode 100644
index 0000000..9c284db
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/README.md
@@ -0,0 +1,3 @@
+# CSS-Crush Documentation
+
+Rendered online at http://the-echoplex.net/csscrush
diff --git a/include/thirdparty/css-crush/docs/api/functions.md b/include/thirdparty/css-crush/docs/api/functions.md
new file mode 100644
index 0000000..639f9fb
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/api/functions.md
@@ -0,0 +1,84 @@
+
+
+## csscrush_file()
+
+Process CSS file and return the compiled file URL.
+
+csscrush_file( string $file [, array [$options](#api--options) ] )
+
+
+***************
+
+## csscrush_tag()
+
+Process CSS file and return an html `link` tag with populated href.
+
+csscrush_tag( string $file [, array [$options](#api--options) [, array $tag\_attributes ]] )
+
+
+***************
+
+## csscrush_inline()
+
+Process CSS file and return CSS as text wrapped in html `style` tags.
+
+csscrush_inline( string $file [, array [$options](#api--options) [, array $tag\_attributes ]] )
+
+
+***************
+
+## csscrush_string()
+
+Compile a raw string of CSS string and return it.
+
+csscrush_string( string $string [, array [$options](#api--options) ] )
+
+
+***************
+
+## csscrush_get()
+
+Retrieve a config setting or option default.
+
+`csscrush_get( string $object_name, string $property )`
+
+### Parameters
+
+ * `$object_name` Name of object you want to inspect: 'config' or 'options'.
+ * `$property`
+
+
+***************
+
+## csscrush_set()
+
+Set a config setting or option default.
+
+`csscrush_set( string $object_name, mixed $settings )`
+
+### Parameters
+
+ * `$object_name` Name of object you want to modify: 'config' or 'options'.
+ * `$settings` Associative array of keys and values to set, or callable which argument is the object specified in `$object_name`.
+
+
+***************
+
+## csscrush_plugin()
+
+Register a plugin.
+
+`csscrush_plugin( string $name, callable $callback )`
+
+
+***************
+
+## csscrush_stat()
+
+Get compilation stats from the most recent compiled file.
+
+`csscrush_stat()`
diff --git a/include/thirdparty/css-crush/docs/api/options.md b/include/thirdparty/css-crush/docs/api/options.md
new file mode 100644
index 0000000..1aa3fb2
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/api/options.md
@@ -0,0 +1,103 @@
+
+
+
+
+ Option
+ | Values (default in bold)
+ | Description
+ |
+
+ minify
+ | true | false | Array
+ | Enable or disable minification. Optionally specify an array of advanced minification parameters. Currently the only advanced option is 'colors', which will compress all color values in any notation.
+ |
+
+ formatter
+ | block | single-line | padded
+ | Set the formatting mode. Overrides minify option if both are set.
+ |
+
+ newlines
+ | use-platform | windows/win | unix
+ | Set the output style of newlines
+ |
+
+ boilerplate
+ | true | false | Path
+ | Prepend a boilerplate to the output file
+ |
+
+ versioning
+ | true | false
+ | Append a timestamped querystring to the output filename
+ |
+
+ vars
+ | Array
+ | An associative array of CSS variables to be applied at runtime. These will override variables declared globally or in the CSS.
+ |
+
+ cache
+ | true | false
+ | Turn caching on or off.
+ |
+
+ output_dir
+ | Path
+ | Specify an output directory for compiled files. Defaults to the same directory as the host file.
+ |
+
+ output_file
+ | Output filename
+ | Specify an output filename (suffix is added).
+ |
+
+ asset_dir
+ | Path
+ | Directory for SVG and image files generated by plugins (defaults to the main file output directory).
+ |
+
+ stat_dump
+ | false | true | Path
+ | Save compile stats and variables to a file in json format.
+ |
+
+ vendor_target
+ | "all" | "moz", "webkit", ... | Array
+ | Limit aliasing to a specific vendor, or an array of vendors.
+ |
+
+ rewrite_import_urls
+ | true | false | "absolute"
+ | Rewrite relative URLs inside inlined imported files.
+ |
+
+ import_paths
+ | Array
+ | Additional paths to search when resolving relative import URLs.
+ |
+
+ plugins
+ | Array
+ | An array of plugin names to enable.
+ |
+
+ source_map
+ | true | false
+ | Output a source map (compliant with the Source Map v3 proposal).
+ |
+
+ context
+ | Path
+ | Context for importing resources from relative urls (Only applies to `csscrush_string()` and command line utility).
+ |
+
+ doc_root
+ | Path
+ | Specify an alternative server document root for situations where the CSS is being served behind an alias or url rewritten path.
+ |
+
diff --git a/include/thirdparty/css-crush/docs/core/abstract.md b/include/thirdparty/css-crush/docs/core/abstract.md
new file mode 100644
index 0000000..4936aa8
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/abstract.md
@@ -0,0 +1,44 @@
+
+
+Abstract rules are generic rules that can be [extended](#core--inheritance) with the `@extend` directive or mixed in (without arguments) like regular [mixins](#core--mixins) with the `@include` directive.
+
+```crush
+@abstract ellipsis {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+@abstract heading {
+ font: bold 1rem serif;
+ letter-spacing: .1em;
+}
+
+.foo {
+ @extend ellipsis;
+ display: block;
+}
+.bar {
+ @extend ellipsis;
+ @include heading;
+}
+```
+
+```css
+.foo,
+.bar {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.foo {
+ display: block;
+}
+.bar {
+ font: bold 1rem serif;
+ letter-spacing: .1em;
+}
+```
diff --git a/include/thirdparty/css-crush/docs/core/auto-prefixing.md b/include/thirdparty/css-crush/docs/core/auto-prefixing.md
new file mode 100644
index 0000000..02c67b6
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/auto-prefixing.md
@@ -0,0 +1,39 @@
+
+
+Vendor prefixes for properties, functions, @-rules and declarations are **automatically generated** – based on [trusted](http://caniuse.com) [sources](http://developer.mozilla.org/en-US/docs/CSS/CSS_Reference) – so you can maintain cross-browser support while keeping your source code clean and easy to maintain.
+
+
+```crush
+.foo {
+ background: linear-gradient(to right, red, white);
+}
+```
+
+```css
+.foo {
+ background: -webkit-linear-gradient(to right, red, white);
+ background: linear-gradient(to right, red, white);
+}
+```
+
+
+```crush
+@keyframes bounce {
+ 50% { transform: scale(1.4); }
+}
+```
+
+```css
+@-webkit-keyframes bounce {
+ 50% {-webkit-transform: scale(1.4);
+ transform: scale(1.4);}
+}
+@keyframes bounce {
+ 50% {-webkit-transform: scale(1.4);
+ transform: scale(1.4);}
+}
+```
diff --git a/include/thirdparty/css-crush/docs/core/direct-import.md b/include/thirdparty/css-crush/docs/core/direct-import.md
new file mode 100644
index 0000000..fea9d69
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/direct-import.md
@@ -0,0 +1,25 @@
+
+
+Files referenced with the `@import` directive are inlined directly to save on http requests. Relative URL paths in the CSS are also updated if necessary.
+
+If you specify a media designation following the import URL — as per the CSS standard — the imported file content is wrapped in a `@media` block.
+
+
+```crush
+/* Standard CSS @import statements */
+@import "print.css" print;
+@import url( "small-screen.css" ) screen and ( max-width: 500px );
+```
+
+```css
+@media print {
+ /* Contents of print.css */
+}
+@media screen and ( max-width: 500px ) {
+ /* Contents of small-screen.css */
+}
+```
diff --git a/include/thirdparty/css-crush/docs/core/fragments.md b/include/thirdparty/css-crush/docs/core/fragments.md
new file mode 100644
index 0000000..2d3d693
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/fragments.md
@@ -0,0 +1,25 @@
+
+
+Fragments – defined and invoked with the @fragment
directive – work in a similar way to [mixins](#core--mixins), except that they work at block level:
+
+```crush
+@fragment input-placeholder {
+ #(1)::-webkit-input-placeholder { color: #(0); }
+ #(1):-moz-placeholder { color: #(0); }
+ #(1)::placeholder { color: #(0); }
+ #(1).placeholder-state { color: #(0); }
+}
+
+@fragment input-placeholder(#777, textarea);
+```
+
+```css
+textarea::-webkit-input-placeholder { color: #777; }
+textarea:-moz-placeholder { color: #777; }
+textarea::placeholder { color: #777; }
+textarea.placeholder-state { color: #777; }
+```
diff --git a/include/thirdparty/css-crush/docs/core/functions/a-adjust.md b/include/thirdparty/css-crush/docs/core/functions/a-adjust.md
new file mode 100644
index 0000000..59d2c93
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/functions/a-adjust.md
@@ -0,0 +1,26 @@
+
+
+Manipulate the opacity (alpha channel) of a color value.
+
+a-adjust( *color*, *offset* )
+
+## Parameters
+
+* *`color`* Any valid CSS color value
+* *`offset`* The percentage to offset the color opacity
+
+## Returns
+
+The modified color value
+
+
+## Examples
+
+```css
+/* Reduce color opacity by 10% */
+color: a-adjust( rgb(50,50,0) -10 );
+```
diff --git a/include/thirdparty/css-crush/docs/core/functions/data-uri.md b/include/thirdparty/css-crush/docs/core/functions/data-uri.md
new file mode 100644
index 0000000..32b0459
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/functions/data-uri.md
@@ -0,0 +1,33 @@
+
+
+Create a data-uri.
+
+data-uri( *url* )
+
+## Parameters
+
+* *`url`* URL of an asset
+
+`url` cannot be external, and must not be written with an http protocol prefix.
+
+The following file extensions are supported: jpg, jpeg, gif, png, svg, svgz, ttf, woff
+
+
+## Returns
+
+The created data-uri as a string inside a CSS url().
+
+
+## Examples
+
+```crush
+background: silver data-uri(../images/stripe.png);
+```
+
+```css
+background: silver url(data:);
+```
diff --git a/include/thirdparty/css-crush/docs/core/functions/h-adjust.md b/include/thirdparty/css-crush/docs/core/functions/h-adjust.md
new file mode 100644
index 0000000..98605c9
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/functions/h-adjust.md
@@ -0,0 +1,24 @@
+
+
+Adjust the hue of a color value.
+
+h-adjust( *color*, *offset* )
+
+## Parameters
+
+* *`color`* Any valid CSS color value
+* *`offset`* The percentage to offset the color hue (percent mark optional)
+
+## Returns
+
+The modified color value.
+
+## Examples
+
+```css
+color: h-adjust( deepskyblue -10 );
+```
diff --git a/include/thirdparty/css-crush/docs/core/functions/hsl-adjust.md b/include/thirdparty/css-crush/docs/core/functions/hsl-adjust.md
new file mode 100644
index 0000000..bdee0fd
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/functions/hsl-adjust.md
@@ -0,0 +1,27 @@
+
+
+Manipulate the hue, saturation and lightness of a color value
+
+hsl-adjust( *color*, *hue-offset*, *saturation-offset*, *lightness-offset* )
+
+## Parameters
+
+* *`color`* Any valid CSS color value
+* *`hue-offset`* The percentage to offset the color hue
+* *`saturation-offset`* The percentage to offset the color saturation
+* *`lightness-offset`* The percentage to offset the color lightness
+
+## Returns
+
+The modified color value
+
+## Examples
+
+```css
+/* Lighten and increase saturation */
+color: hsl-adjust( red 0 5 5 );
+```
diff --git a/include/thirdparty/css-crush/docs/core/functions/hsla-adjust.md b/include/thirdparty/css-crush/docs/core/functions/hsla-adjust.md
new file mode 100644
index 0000000..cc05b4b
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/functions/hsla-adjust.md
@@ -0,0 +1,27 @@
+
+
+Manipulate the hue, saturation, lightness and opacity of a color value.
+
+hsla-adjust( *color*, *hue-offset*, *saturation-offset*, *lightness-offset*, *alpha-offset* )
+
+## Parameters
+
+* *`color`* Any valid CSS color value
+* *`hue-offset`* The percentage to offset the color hue
+* *`saturation-offset`* The percentage to offset the color saturation
+* *`lightness-offset`* The percentage to offset the color lightness
+* *`alpha-offset`* The percentage to offset the color opacity
+
+## Returns
+
+The modified color value.
+
+## Examples
+
+```css
+color: hsla-adjust( #f00 0 5 5 -10 );
+```
\ No newline at end of file
diff --git a/include/thirdparty/css-crush/docs/core/functions/l-adjust.md b/include/thirdparty/css-crush/docs/core/functions/l-adjust.md
new file mode 100644
index 0000000..28ac701
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/functions/l-adjust.md
@@ -0,0 +1,24 @@
+
+
+Adjust the lightness of a color value.
+
+l-adjust( *color*, *offset* )
+
+## Parameters
+
+* *`color`* Any valid CSS color value
+* *`offset`* The percentage to offset the color hue (percent mark optional)
+
+## Returns
+
+The modified color value.
+
+## Examples
+
+```css
+color: l-adjust( deepskyblue 10 );
+```
diff --git a/include/thirdparty/css-crush/docs/core/functions/math.md b/include/thirdparty/css-crush/docs/core/functions/math.md
new file mode 100644
index 0000000..2d65b40
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/functions/math.md
@@ -0,0 +1,19 @@
+
+
+Evaluate a raw mathematical expression.
+
+math( *expression* [, *unit*] )
+
+## Examples
+
+```crush
+font-size: math( 12 / 16, em );
+```
+
+```css
+font-size: 0.75em;
+```
diff --git a/include/thirdparty/css-crush/docs/core/functions/query.md b/include/thirdparty/css-crush/docs/core/functions/query.md
new file mode 100644
index 0000000..c9d5240
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/functions/query.md
@@ -0,0 +1,54 @@
+
+
+Copy a value from another rule.
+
+query( *target* [, *property-name* = default] [, *fallback*] )
+
+## Parameters
+
+* *`target`* A rule selector, an abstract rule name or context keyword: `previous`, `next` (also `parent` and `top` within nested structures)
+* *`property-name`* The CSS property name to copy, or just `default` to pass over. Defaults to the calling property
+* *`fallback`* A CSS value to use if the target property does not exist
+
+
+## Returns
+
+The referenced property value, or the fallback if it has not been set.
+
+
+## Examples
+
+
+```css
+.foo {
+ width: 40em;
+ height: 100em;
+}
+
+.bar {
+ width: query( .foo ); /* 40em */
+ margin-top: query( .foo, height ); /* 100em */
+ margin-bottom: query( .foo, default, 3em ); /* 3em */
+}
+```
+
+Using context keywords:
+
+```css
+.foo {
+ width: 40em;
+ .bar {
+ width: 30em;
+ .baz: {
+ width: query( parent ); /* 30em */
+ .qux {
+ width: query( top ); /* 40em */
+ }
+ }
+ }
+}
+```
diff --git a/include/thirdparty/css-crush/docs/core/functions/s-adjust.md b/include/thirdparty/css-crush/docs/core/functions/s-adjust.md
new file mode 100644
index 0000000..8d2cce1
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/functions/s-adjust.md
@@ -0,0 +1,25 @@
+
+
+Adjust the saturation of a color value.
+
+s-adjust( *color*, *offset* )
+
+## Parameters
+
+* *`color`* Any valid CSS color value
+* *`offset`* The percentage to offset the color hue (percent mark optional)
+
+## Returns
+
+The modified color value.
+
+## Examples
+
+```css
+/* Desaturate */
+color: s-adjust( deepskyblue -100 );
+```
diff --git a/include/thirdparty/css-crush/docs/core/functions/this.md b/include/thirdparty/css-crush/docs/core/functions/this.md
new file mode 100644
index 0000000..12029b6
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/functions/this.md
@@ -0,0 +1,39 @@
+
+
+Reference another property value from the same containing block.
+
+Restricted to referencing properties that don't already reference other properties.
+
+this( *property-name*, *fallback* )
+
+## Parameters
+
+* *`property-name`* Property name
+* *`fallback`* A CSS value
+
+## Returns
+
+The referenced property value, or the fallback if it has not been set.
+
+## Examples
+
+```css
+.foo {
+ width: this( height );
+ height: 100em;
+}
+```
+
+********
+
+```css
+/* The following both fail because they create circular references. */
+.bar {
+ height: this( width );
+ width: this( height );
+}
+```
diff --git a/include/thirdparty/css-crush/docs/core/inheritance.md b/include/thirdparty/css-crush/docs/core/inheritance.md
new file mode 100644
index 0000000..4473813
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/inheritance.md
@@ -0,0 +1,127 @@
+
+
+By using the `@extend` directive and passing it a named ruleset or selector from any other rule you can share styles more effectively across a stylesheet.
+
+[Abstract rules](#core--abstract) can be used if you just need to extend a generic set of declarations.
+
+```crush
+.negative-text {
+ overflow: hidden;
+ text-indent: -9999px;
+}
+
+.sidebar-headline {
+ @extend .negative-text;
+ background: url( headline.png ) no-repeat;
+}
+```
+
+```css
+.negative-text,
+.sidebar-headline {
+ overflow: hidden;
+ text-indent: -9999px;
+}
+
+.sidebar-headline {
+ background: url( headline.png ) no-repeat;
+}
+```
+
+Inheritance is recursive:
+
+```crush
+.one { color: pink; }
+.two { @extend .one; }
+.three { @extend .two; }
+.four { @extend .three; }
+```
+
+```css
+.one, .two, .three, .four { color: pink; }
+```
+
+## Referencing by name
+
+If you want to reference a rule without being concerned about later changes to the identifying selector use the `@name` directive:
+
+```crush
+.foo123 {
+ @name foo;
+ text-decoration: underline;
+}
+
+.bar {
+ @include foo;
+}
+.baz {
+ @extend foo;
+}
+```
+
+
+## Extending with pseudo classes/elements
+
+`@extend` arguments can adopt pseudo classes/elements by appending an exclamation mark:
+
+```crush
+.link-base {
+ color: #bada55;
+ text-decoration: underline;
+}
+.link-base:hover,
+.link-base:focus {
+ text-decoration: none;
+}
+
+.link-footer {
+ @extend .link-base, .link-base:hover!, .link-base:focus!;
+ color: blue;
+}
+```
+
+```css
+.link-base,
+.link-footer {
+ color: #bada55;
+ text-decoration: underline;
+}
+
+.link-base:hover,
+.link-base:focus,
+.link-footer:hover,
+.link-footer:focus {
+ text-decoration: none;
+}
+
+.link-footer {
+ color: blue;
+}
+```
+
+The same outcome can also be achieved with an [Abstract rule](#core--abstract) wrapper to simplify repeated use:
+
+```crush
+.link-base {
+ color: #bada55;
+ text-decoration: underline;
+}
+.link-base:hover,
+.link-base:focus {
+ text-decoration: none;
+}
+
+@abstract link-base {
+ @extend .link-base, .link-base:hover!, .link-base:focus!;
+}
+
+.link-footer {
+ @extend link-base;
+ color: blue;
+}
+```
+
diff --git a/include/thirdparty/css-crush/docs/core/loop.md b/include/thirdparty/css-crush/docs/core/loop.md
new file mode 100644
index 0000000..66ae6f7
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/loop.md
@@ -0,0 +1,41 @@
+
+
+For...in loops with lists and generator functions.
+
+```crush
+@for fruit in apple, orange, pear {
+ .#(fruit) {
+ background-image: url("images/#(fruit).jpg");
+ }
+}
+```
+
+```css
+.apple { background-image: url(images/apple.jpg); }
+.orange { background-image: url(images/orange.jpg); }
+.pear { background-image: url(images/pear.jpg); }
+```
+
+```crush
+@for base in range(2, 24) {
+ @for i in range(1, #(base)) {
+ .grid-#(i)-of-#(base) {
+ width: math(#(i) / #(base) * 100, %);
+ }
+ }
+}
+```
+
+```css
+.grid-1-of-2 { width: 50%; }
+.grid-2-of-2 { width: 100%; }
+/*
+ Intermediate steps ommited.
+*/
+.grid-23-of-24 { width: 95.83333%; }
+.grid-24-of-24 { width: 100%; }
+```
diff --git a/include/thirdparty/css-crush/docs/core/mixins.md b/include/thirdparty/css-crush/docs/core/mixins.md
new file mode 100644
index 0000000..1348ff8
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/mixins.md
@@ -0,0 +1,95 @@
+
+
+Mixins make reusing small snippets of CSS much simpler. You define them with the `@mixin` directive.
+
+Positional arguments via the argument function `#()` extend the capability of mixins for repurposing in different contexts.
+
+```crush
+@mixin display-font {
+ font-family: "Arial Black", sans-serif;
+ font-size: #(0);
+ letter-spacing: #(1);
+}
+
+/* Another mixin with default arguments */
+@mixin blue-theme {
+ color: #(0 navy);
+ background-image: url("images/#(1 cross-hatch).png");
+}
+
+/* Applying the mixins */
+.foo {
+ @include display-font(100%, .1em), blue-theme;
+}
+```
+
+```css
+.foo {
+ font-family: "Arial Black", sans-serif;
+ font-size: 100%;
+ letter-spacing: .1em;
+ color: navy;
+ background-image: url("images/cross-hatch.png");
+}
+```
+
+## Skipping arguments
+
+Mixin arguments can be skipped by using the **default** keyword:
+
+```crush
+@mixin display-font {
+ font-size: #(0 100%);
+ letter-spacing: #(1);
+}
+
+/* Applying the mixin skipping the first argument so the
+ default value is used instead */
+#foo {
+ @include display-font(default, .3em);
+}
+```
+
+Sometimes you may need to use the same positional argument more than once. In this case the default value only needs to be specified once:
+
+```crush
+@mixin square {
+ width: #(0 10px);
+ height: #(0);
+}
+
+.foo {
+ @include square;
+}
+```
+
+```css
+#foo {
+ width: 10px;
+ height: 10px;
+}
+```
+
+
+## Mixing-in from other sources
+
+Normal rules and [abstract rules](#core--abstract) can also be used as static mixins without arguments:
+
+```crush
+@abstract negative-text {
+ text-indent: -9999px;
+ overflow: hidden;
+}
+
+#main-content .theme-border {
+ border: 1px solid maroon;
+}
+
+.foo {
+ @include negative-text, #main-content .theme-border;
+}
+```
diff --git a/include/thirdparty/css-crush/docs/core/nesting.md b/include/thirdparty/css-crush/docs/core/nesting.md
new file mode 100644
index 0000000..999be4f
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/nesting.md
@@ -0,0 +1,49 @@
+
+
+Rules can be nested to avoid repetitive typing when scoping to a common parent selector.
+
+```crush
+.homepage {
+ color: #333;
+ background: white;
+ .content {
+ p {
+ font-size: 110%;
+ }
+ }
+}
+```
+
+```css
+.homepage {
+ color: #333;
+ background: white;
+}
+.homepage .content p {
+ font-size: 110%;
+}
+```
+
+## Parent referencing
+
+You can use the parent reference symbol `&` for placing the parent selector explicitly.
+
+```crush
+.homepage {
+ .no-js & {
+ p {
+ font-size: 110%;
+ }
+ }
+}
+```
+
+```css
+.no-js .homepage p {
+ font-size: 110%;
+}
+```
diff --git a/include/thirdparty/css-crush/docs/core/selector-aliases.md b/include/thirdparty/css-crush/docs/core/selector-aliases.md
new file mode 100644
index 0000000..ea9296d
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/selector-aliases.md
@@ -0,0 +1,80 @@
+
+
+Selector aliases can be useful for grouping together common selector chains for reuse.
+
+They're defined with the `@selector` directive, and can be used anywhere you might use a pseudo class.
+
+
+```crush
+@selector heading :any(h1, h2, h3, h4, h5, h6);
+@selector radio input[type="radio"];
+@selector hocus :any(:hover, :focus);
+
+/* Selector aliases with arguments */
+@selector class-prefix :any([class^="#(0)"], [class*=" #(0)"]);
+@selector col :class-prefix(-col);
+
+.sidebar :heading {
+ color: honeydew;
+}
+
+:radio {
+ margin-right: 4px;
+}
+
+:col {
+ float: left;
+}
+
+p a:hocus {
+ text-decoration: none;
+}
+```
+
+```css
+.sidebar h1, .sidebar h2,
+.sidebar h3, .sidebar h4,
+.sidebar h5, .sidebar h6 {
+ color: honeydew;
+}
+
+input[type="radio"] {
+ margin-right: 4px;
+}
+
+[class^="col-"],
+[class*=" col-"] {
+ border: 1px solid rgba(0,0,0,.5);
+}
+
+p a:hover,
+p a:focus {
+ text-decoration: none;
+}
+```
+
+## Selector splatting
+
+Selector splats are a special kind of selector alias that expand using passed arguments.
+
+```crush
+@selector-splat input input[type="#(text)"];
+
+form :input(time, text, url, email, number) {
+ border: 1px solid;
+}
+```
+
+```css
+form input[type="time"],
+form input[type="text"],
+form input[type="url"],
+form input[type="email"],
+form input[type="number"] {
+ border: 1px solid;
+}
+```
diff --git a/include/thirdparty/css-crush/docs/core/selector-grouping.md b/include/thirdparty/css-crush/docs/core/selector-grouping.md
new file mode 100644
index 0000000..0cafa1f
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/selector-grouping.md
@@ -0,0 +1,22 @@
+
+
+Selector grouping with the `:any` pseudo class (modelled after CSS4 :matches) simplifies the creation of complex selector chains.
+
+```crush
+:any( .sidebar, .block ) a:any( :hover, :focus ) {
+ color: lemonchiffon;
+}
+```
+
+```css
+.block a:hover,
+.block a:focus,
+.sidebar a:hover,
+.sidebar a:focus {
+ color: lemonchiffon;
+}
+```
diff --git a/include/thirdparty/css-crush/docs/core/variables.md b/include/thirdparty/css-crush/docs/core/variables.md
new file mode 100644
index 0000000..117f53f
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/core/variables.md
@@ -0,0 +1,62 @@
+
+
+Declare variables in your CSS with a `@set` directive and use them with the `$()` function.
+
+Variables can also be injected at runtime with the [vars option](#api--options).
+
+
+```crush
+/* Defining variables */
+@set {
+ dark: #333;
+ light: #F4F2E2;
+ smaller-screen: screen and (max-width: 800px);
+}
+
+/* Using variables */
+@media $(smaller-screen) {
+ ul, p {
+ color: $(dark);
+ /* Using a fallback value with an undefined variable */
+ background-color: $(accent-color, #ff0);
+ }
+}
+```
+
+*******
+
+```css
+/* Interpolation */
+.username::before {
+ content: "$(greeting)";
+}
+```
+
+## Conditionals
+
+Sections of CSS can be included and excluded on the basis of variable existence with the `@ifset` directive:
+
+```crush
+@set foo #f00;
+@set bar true;
+
+@ifset foo {
+ p {
+ color: $(foo);
+ }
+}
+
+p {
+ font-size: 12px;
+ @ifset not foo {
+ line-height: 1.5;
+ }
+ @ifset bar(true) {
+ margin-bottom: 5px;
+ }
+}
+```
diff --git a/include/thirdparty/css-crush/docs/getting-started/js.md b/include/thirdparty/css-crush/docs/getting-started/js.md
new file mode 100644
index 0000000..605727f
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/getting-started/js.md
@@ -0,0 +1,26 @@
+
+
+This preprocessor is written in PHP, so as prerequisite you will need to have PHP installed on your system to use the JS api.
+
+```shell
+npm install csscrush
+```
+
+All methods can take the standard options (camelCase) as the second argument.
+
+```php
+const csscrush = require('csscrush');
+
+// Compile. Returns promise.
+csscrush.file('./styles.css', {sourceMap: true});
+
+// Compile string of CSS. Returns promise.
+csscrush.string('* {box-sizing: border-box;}');
+
+// Compile and watch file. Returns event emitter (triggers 'data' on compile).
+csscrush.watch('./styles.css');
+```
diff --git a/include/thirdparty/css-crush/docs/getting-started/php.md b/include/thirdparty/css-crush/docs/getting-started/php.md
new file mode 100644
index 0000000..1c6f836
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/getting-started/php.md
@@ -0,0 +1,17 @@
+
+
+If you're using [Composer](http://getcomposer.org) you can use Crush in your project with the following line in your terminal:
+
+```shell
+composer require css-crush/css-crush
+```
+
+If you're not using Composer yet just download the library ([zip](http://github.com/peteboere/css-crush/zipball/master) or [tar](http://github.com/peteboere/css-crush/tarball/master)) into a convenient location and require the bootstrap file:
+
+```php
+
+```
diff --git a/include/thirdparty/css-crush/docs/plugins/aria.md b/include/thirdparty/css-crush/docs/plugins/aria.md
new file mode 100644
index 0000000..c00608d
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/plugins/aria.md
@@ -0,0 +1,21 @@
+
+Pseudo classes for working with ARIA roles, states and properties.
+
+ * [ARIA roles spec](http://www.w3.org/TR/wai-aria/roles)
+ * [ARIA states and properties spec](http://www.w3.org/TR/wai-aria/states_and_properties)
+
+````crush
+:role(tablist) {...}
+:aria-expanded {...}
+:aria-expanded(false) {...}
+:aria-label {...}
+:aria-label(foobarbaz) {...}
+````
+
+````css
+[role="tablist"] {...}
+[aria-expanded="true"] {...}
+[aria-expanded="false"] {...}
+[aria-label] {...}
+[aria-label="foobarbaz"] {...}
+````
diff --git a/include/thirdparty/css-crush/docs/plugins/canvas.md b/include/thirdparty/css-crush/docs/plugins/canvas.md
new file mode 100644
index 0000000..df6994d
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/plugins/canvas.md
@@ -0,0 +1,55 @@
+
+Bitmap image generator.
+
+Requires the GD image library bundled with PHP.
+
+```crush
+/* Create square semi-opaque png. */
+@canvas foo {
+ width: 50;
+ height: 50;
+ fill: rgba(255, 0, 0, .5);
+}
+
+body {
+ background: white canvas(foo);
+}
+```
+
+*****
+
+```crush
+/* White to transparent east facing gradient with 10px
+ margin and background fill. */
+@canvas horz-gradient {
+ width: #(0);
+ height: 150;
+ fill: canvas-linear-gradient(to right, #(1 white), #(2 rgba(255,255,255,0)));
+ background-fill: powderblue;
+ margin: 10;
+}
+
+/* Rectangle 300x150. */
+body {
+ background: canvas(horz-gradient, 300);
+}
+/* Flipped gradient, using canvas-data() to generate a data URI. */
+.bar {
+ background: canvas-data(horz-gradient, 100, rgba(255,255,255,0), white);
+}
+```
+
+*****
+
+```crush
+/* Google logo resized to 400px width and given a sepia effect. */
+@canvas sepia {
+ src: url(http://www.google.com/images/logo.png);
+ width: 400;
+ canvas-filter: greyscale() colorize(45, 45, 0);
+}
+
+.bar {
+ background: canvas(sepia);
+}
+```
diff --git a/include/thirdparty/css-crush/docs/plugins/ease.md b/include/thirdparty/css-crush/docs/plugins/ease.md
new file mode 100644
index 0000000..37ce5f9
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/plugins/ease.md
@@ -0,0 +1,37 @@
+
+Expanded easing keywords for transitions.
+
+* ease-in-out-back
+* ease-in-out-circ
+* ease-in-out-expo
+* ease-in-out-sine
+* ease-in-out-quint
+* ease-in-out-quart
+* ease-in-out-cubic
+* ease-in-out-quad
+* ease-out-back
+* ease-out-circ
+* ease-out-expo
+* ease-out-sine
+* ease-out-quint
+* ease-out-quart
+* ease-out-cubic
+* ease-out-quad
+* ease-in-back
+* ease-in-circ
+* ease-in-expo
+* ease-in-sine
+* ease-in-quint
+* ease-in-quart
+* ease-in-cubic
+* ease-in-quad
+
+See [easing demos](http://easings.net) for live examples.
+
+```crush
+transition: .2s ease-in-quad;
+```
+
+```css
+transition: .2s cubic-bezier(.550,.085,.680,.530);
+```
diff --git a/include/thirdparty/css-crush/docs/plugins/forms.md b/include/thirdparty/css-crush/docs/plugins/forms.md
new file mode 100644
index 0000000..3f4fcbc
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/plugins/forms.md
@@ -0,0 +1,16 @@
+
+Pseudo classes for working with forms.
+
+```crush
+:input(date, search, email) {...}
+:checkbox {...}
+:radio {...}
+:text {...}
+```
+
+```css
+input[type="date"], input[type="search"], input[type="email"] {...}
+input[type="checkbox"] {...}
+input[type="radio"] {...}
+input[type="text"] {...}
+```
diff --git a/include/thirdparty/css-crush/docs/plugins/hocus-pocus.md b/include/thirdparty/css-crush/docs/plugins/hocus-pocus.md
new file mode 100644
index 0000000..b8f3efa
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/plugins/hocus-pocus.md
@@ -0,0 +1,12 @@
+
+Composite :hover/:focus/:active pseudo classes.
+
+```crush
+a:hocus { color: red; }
+a:pocus { color: red; }
+```
+
+```css
+a:hover, a:focus { color: red; }
+a:hover, a:focus, a:active { color: red; }
+```
diff --git a/include/thirdparty/css-crush/docs/plugins/property-sorter.md b/include/thirdparty/css-crush/docs/plugins/property-sorter.md
new file mode 100644
index 0000000..cd17817
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/plugins/property-sorter.md
@@ -0,0 +1,21 @@
+
+Property sorting.
+
+Examples use the predefined property sorting table. To define a custom sorting order pass an array to `csscrush_set_property_sort_order()`
+
+
+```crush
+color: red;
+background: #000;
+opacity: .5;
+display: block;
+position: absolute;
+```
+
+```css
+position: absolute;
+display: block;
+opacity: .5;
+color: red;
+background: #000;
+```
diff --git a/include/thirdparty/css-crush/docs/plugins/svg-gradients.md b/include/thirdparty/css-crush/docs/plugins/svg-gradients.md
new file mode 100644
index 0000000..66ff410
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/plugins/svg-gradients.md
@@ -0,0 +1,48 @@
+
+Functions for creating SVG gradients with a CSS gradient like syntax.
+
+Primarily useful for supporting Internet Explorer 9.
+
+## svg-linear-gradent()
+
+Syntax is the same as [linear-gradient()](http://dev.w3.org/csswg/css3-images/#linear-gradient)
+
+```syntax
+svg-linear-gradent( [ | to ,]? [, ]+ )
+```
+
+### Returns
+
+A base64 encoded svg data-uri.
+
+### Known issues
+
+Color stops can only take percentage value offsets.
+
+```css
+background-image: svg-linear-gradient( to top left, #fff, rgba(255,255,255,0) 80% );
+background-image: svg-linear-gradient( 35deg, red, gold 20%, powderblue );
+```
+
+
+## svg-radial-gradent()
+
+Syntax is similar to but more limited than [radial-gradient()](http://dev.w3.org/csswg/css3-images/#radial-gradient)
+
+```syntax
+svg-radial-gradent( [ | at ,]? [, ]+ )
+```
+
+### Returns
+
+A base64 encoded svg data-uri.
+
+### Known issues
+
+Color stops can only take percentage value offsets.
+No control over shape - only circular gradients - however, the generated image can be stretched with background-size.
+
+```css
+background-image: svg-radial-gradient( at center, red, blue 50%, yellow );
+background-image: svg-radial-gradient( 100% 50%, rgba(255,255,255,.5), rgba(255,255,255,0) );
+```
diff --git a/include/thirdparty/css-crush/docs/plugins/svg.md b/include/thirdparty/css-crush/docs/plugins/svg.md
new file mode 100644
index 0000000..facec0d
--- /dev/null
+++ b/include/thirdparty/css-crush/docs/plugins/svg.md
@@ -0,0 +1,74 @@
+
+Define and embed simple SVG elements, paths and effects inside CSS
+
+
+```crush
+@svg foo {
+ type: star;
+ star-points: #(0 5);
+ radius: 100 50;
+ margin: 20;
+ stroke: black;
+ fill: red;
+ fill-opacity: .5;
+}
+
+/* Embed SVG with svg() function (generates an svg file). */
+body {
+ background: svg(foo);
+}
+/* As above but a 3 point star creating a data URI instead of a file. */
+body {
+ background: svg-data(foo, 3);
+}
+```
+
+*******
+
+```crush
+/* Using path data and stroke styles to create a plus sign. */
+@svg plus {
+ d: "M0,5 h10 M5,0 v10";
+ width: 10;
+ height: 10;
+ stroke: white;
+ stroke-linecap: round;
+ stroke-width: 2;
+}
+```
+
+
+*******
+
+```crush
+/* Skewed circle with radial gradient fill and drop shadow. */
+@svg circle {
+ type: circle;
+ transform: skewX(30);
+ diameter: 60;
+ margin: 20;
+ fill: svg-radial-gradient(at top right, gold 50%, red);
+ drop-shadow: 2 2 0 rgba(0,0,0,1);
+}
+```
+
+*******
+
+```crush
+/* 8-sided polygon with an image fill.
+ Note: images usually have to be converted to data URIs, see known issues below. */
+@svg pattern {
+ type: polygon;
+ sides: 8;
+ diameter: 180;
+ margin: 20;
+ fill: pattern(data-uri(kitten.jpg), scale(1) translate(-100 0));
+ fill-opacity: .8;
+}
+```
+
+
+### Known issues
+
+Firefox [does not allow linked images](https://bugzilla.mozilla.org/show_bug.cgi?id=628747#c0) (or other svg) when svg is in "svg as image" mode.
+
diff --git a/include/thirdparty/css-crush/index.js b/include/thirdparty/css-crush/index.js
index c12c671..07afb0b 100644
--- a/include/thirdparty/css-crush/index.js
+++ b/include/thirdparty/css-crush/index.js
@@ -160,7 +160,7 @@ export default {
};
export function watch(file, options={}) {
- ({file: options.input, context: options.context} = resolveFile(file));
+ ({file: options.input, context: options.context} = resolveFile(file, {watch: true}));
return (new Process()).watch(options);
}
@@ -174,7 +174,7 @@ export function string(string, options={}) {
return (new Process()).exec(options);
}
-const resolveFile = input => {
+const resolveFile = (input, {watch}={}) => {
if (Array.isArray(input)) {
@@ -197,7 +197,9 @@ const resolveFile = input => {
initial ||= result;
previous = result;
- setTimeout(poller, 2000);
+ if (watch) {
+ setTimeout(poller, 2000);
+ }
return result;
};
diff --git a/include/thirdparty/css-crush/lib/CssCrush/Process.php b/include/thirdparty/css-crush/lib/CssCrush/Process.php
index 26079a3..e7c0641 100644
--- a/include/thirdparty/css-crush/lib/CssCrush/Process.php
+++ b/include/thirdparty/css-crush/lib/CssCrush/Process.php
@@ -5,7 +5,7 @@
*
*/
namespace CssCrush;
-
+#[\AllowDynamicProperties]
class Process
{
use EventEmitter;
@@ -630,8 +630,8 @@ class Process
preg_match($rulePatt, $this->string->raw, $ruleMatch, PREG_UNMATCHED_AS_NULL, $traceOffset);
- $selector = trim($ruleMatch['selector']);
- $block = trim($ruleMatch['block_content']);
+ $selector = trim($ruleMatch['selector'] ?? null);
+ $block = trim($ruleMatch['block_content'] ?? null);
$replace = '';
// If rules are nested inside we set their parent property.
@@ -651,12 +651,12 @@ class Process
}
}
else {
- $rule = new Rule($selector, $block, $ruleMatch['trace_token']);
+ $rule = new Rule($selector, $block, $ruleMatch['trace_token'] ?? null);
}
$replace = $tokens->add($rule, 'r', $rule->label) . $replace;
- $this->string->splice($replace, $traceOffset, strlen($ruleMatch[0]));
+ $this->string->splice($replace, $traceOffset, strlen($ruleMatch[0]) ?? null);
}
// Flip, since we just captured rules in reverse order.
diff --git a/include/thirdparty/css-crush/package-lock.json b/include/thirdparty/css-crush/package-lock.json
new file mode 100644
index 0000000..c4ff45d
--- /dev/null
+++ b/include/thirdparty/css-crush/package-lock.json
@@ -0,0 +1,1664 @@
+{
+ "name": "csscrush",
+ "version": "4.1.3",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "csscrush",
+ "version": "4.1.3",
+ "license": "MIT",
+ "dependencies": {
+ "glob": "~8.0.3"
+ },
+ "bin": {
+ "csscrush": "bin/csscrush"
+ },
+ "devDependencies": {
+ "eslint": "~8.16.0",
+ "normalize.css": "7.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
+ "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.3.2",
+ "globals": "^13.15.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.9.5",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
+ "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "node_modules/acorn": {
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
+ "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "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/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==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz",
+ "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/eslintrc": "^1.3.0",
+ "@humanwhocodes/config-array": "^0.9.2",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.2",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^6.0.1",
+ "globals": "^13.15.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
+ "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.7.1",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
+ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
+ "dev": true
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "node_modules/glob": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz",
+ "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
+ "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
+ "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true,
+ "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=",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true,
+ "engines": {
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node_modules/normalize.css": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-7.0.0.tgz",
+ "integrity": "sha1-q/sd2CRwZ04DIrU86xqvQSk45L8=",
+ "dev": true
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/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==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ }
+ },
+ "dependencies": {
+ "@eslint/eslintrc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
+ "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.3.2",
+ "globals": "^13.15.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ }
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.9.5",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
+ "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+ "dev": true,
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "acorn": {
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
+ "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ },
+ "eslint": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz",
+ "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==",
+ "dev": true,
+ "requires": {
+ "@eslint/eslintrc": "^1.3.0",
+ "@humanwhocodes/config-array": "^0.9.2",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.2",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^6.0.1",
+ "globals": "^13.15.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ }
+ },
+ "eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ },
+ "espree": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
+ "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.7.1",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "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==",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
+ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "glob": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz",
+ "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
+ "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
+ "globals": {
+ "version": "13.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
+ "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "normalize.css": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-7.0.0.tgz",
+ "integrity": "sha1-q/sd2CRwZ04DIrU86xqvQSk45L8=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "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=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true
+ },
+ "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==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ }
+ }
+}
diff --git a/include/thirdparty/css-crush/package.json b/include/thirdparty/css-crush/package.json
new file mode 100644
index 0000000..a94376e
--- /dev/null
+++ b/include/thirdparty/css-crush/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "csscrush",
+ "version": "4.1.3",
+ "description": "CSS-Crush, CSS preprocessor",
+ "main": "./index.js",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/peteboere/css-crush.git"
+ },
+ "bugs": {
+ "url": "https://github.com/peteboere/css-crush/issues"
+ },
+ "bin": {
+ "csscrush": "./bin/csscrush"
+ },
+ "scripts": {
+ "lint": "eslint --fix index.js"
+ },
+ "homepage": "http://the-echoplex.net/csscrush",
+ "license": "MIT",
+ "devDependencies": {
+ "eslint": "~8.16.0",
+ "normalize.css": "7.0.0"
+ },
+ "dependencies": {
+ "glob": "~8.0.3"
+ },
+ "type": "module",
+ "engines": {
+ "node": ">=16"
+ }
+}