From 6cbdd26ad9e546556867135a8923e468fa0400d7 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Tue, 1 Dec 2020 10:25:48 +0100 Subject: [PATCH 001/110] feat: set up repo --- .eslintrc | 3 + .github/workflows/test.yaml | 27 + .gitignore | 3 + .mergify.yml | 16 + .prettierignore | 2 + .prettierrc.js | 3 + .snyk | 4 + LICENSE | 29 + README.md | 13 + commitlint.config.js | 1 + lib/loader.ts | 16 + package-lock.json | 8273 +++++++++++++++++++++++++++++++++++ package.json | 75 + renovate.json | 3 + tsconfig.json | 7 + 15 files changed, 8475 insertions(+) create mode 100644 .eslintrc create mode 100644 .github/workflows/test.yaml create mode 100644 .gitignore create mode 100644 .mergify.yml create mode 100644 .prettierignore create mode 100644 .prettierrc.js create mode 100644 .snyk create mode 100644 LICENSE create mode 100644 README.md create mode 100644 commitlint.config.js create mode 100644 lib/loader.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 renovate.json create mode 100644 tsconfig.json diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..5a80290 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "@bifravst/eslint-config-typescript" +} diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..74df5c9 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,27 @@ +name: Test + +on: push + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + +jobs: + tests: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: "14.x" + - name: Keep npm cache around to speed up installs + uses: actions/cache@v2 + with: + path: ~/.npm + key: ${{ runner.OS }}-build-${{ hashFiles('**/package-lock.json') }} + - name: Install dependencies + run: npm ci --no-audit + - name: Compile + run: npx tsc + - name: Test + run: npm test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c6d8012 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +npm-debug.log +dist/ diff --git a/.mergify.yml b/.mergify.yml new file mode 100644 index 0000000..3cd0df4 --- /dev/null +++ b/.mergify.yml @@ -0,0 +1,16 @@ +pull_request_rules: + - name: Automatic merge security PRs when all status checks pass + conditions: + - author~=^(snyk-bot|dependabot\[bot\])$ + - status-success=security/snyk (coderbyheart) + - status-success=tests + actions: + merge: + method: rebase + rebase_fallback: squash + bot_account: coderbyheart + label: + add: + - mergify + rebase: + bot_account: coderbyheart diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..3ad4c84 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +dist/ +package-lock.json diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..ff901ec --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,3 @@ +module.exports = { + ...require('@bifravst/code-style/.prettierrc'), +} diff --git a/.snyk b/.snyk new file mode 100644 index 0000000..8cb541f --- /dev/null +++ b/.snyk @@ -0,0 +1,4 @@ +# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. +version: v1.14.1 +ignore: {} +patch: {} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..19cdfa1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2020, Nordic Semiconductor ASA | nordicsemi.no +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..3b0e78e --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# Advent of Code 2020 solutions in TypeScript + +[![GitHub Actions](https://github.com/coderbyheart/aoc/workflows/Test/badge.svg)](https://github.com/coderbyheart/aoc/actions) +[![Known Vulnerabilities](https://snyk.io/test/github/coderbyheart/aoc/badge.svg)](https://snyk.io/test/github/coderbyheart/aoc) +[![Renovate](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com) +[![Mergify Status](https://img.shields.io/endpoint.svg?url=https://dashboard.mergify.io/badges/coderbyheart/aoc&style=flat)](https://mergify.io) +[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) +[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier/) +[![ESLint: TypeScript](https://img.shields.io/badge/ESLint-TypeScript-blue.svg)](https://github.com/typescript-eslint/typescript-eslint) + + git clone https://github.com/coderbyheart/aoc + npm ci + npm test diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..29cfa50 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1 @@ +module.exports = { extends: ["@commitlint/config-angular"] }; diff --git a/lib/loader.ts b/lib/loader.ts new file mode 100644 index 0000000..5dfe393 --- /dev/null +++ b/lib/loader.ts @@ -0,0 +1,16 @@ +import * as fs from 'fs' +import * as path from 'path' + +export const loader = (day: number) => (file: string): string[] => + fs + .readFileSync( + path.resolve( + process.cwd(), + `day${day.toString().padStart(2, '0')}`, + `${file}.txt`, + ), + 'utf-8', + ) + .split('\n') + .map((s) => s.trim()) + .filter((s) => s.length > 0) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..29b86d3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8273 @@ +{ + "name": "@coderbyheart/advent-of-code", + "version": "0.0.0-development", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.5.tgz", + "integrity": "sha512-gyTcvz7JFa4V45C0Zklv//GmFOAal5fL23OWpBLqc4nZ4Yrz67s4kCNwSK1Gu0MXGTU8mRY3zJYtacLdKXlzig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@bifravst/code-style": { + "version": "8.0.134", + "resolved": "https://registry.npmjs.org/@bifravst/code-style/-/code-style-8.0.134.tgz", + "integrity": "sha512-3MqjsPoE/GzFa34rZ/bU7Qq8G+kGESikMdaZopa47wEo9NgvMtfdu4RivgLvNqMPcxqBZdR4eN1un3G4Laj10Q==", + "dev": true + }, + "@bifravst/eslint-config-typescript": { + "version": "5.0.79", + "resolved": "https://registry.npmjs.org/@bifravst/eslint-config-typescript/-/eslint-config-typescript-5.0.79.tgz", + "integrity": "sha512-IJTuwuaBq90LMhyMzf74cPa8YBklMVorqlJtYGT9M7s7js1yjmTdVK42BuvpnuhW6FShVoZZrObSqfE/EPpyvw==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "4.9.0", + "@typescript-eslint/parser": "4.9.0", + "eslint-config-prettier": "6.15.0" + } + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@commitlint/cli": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-11.0.0.tgz", + "integrity": "sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g==", + "dev": true, + "requires": { + "@babel/runtime": "^7.11.2", + "@commitlint/format": "^11.0.0", + "@commitlint/lint": "^11.0.0", + "@commitlint/load": "^11.0.0", + "@commitlint/read": "^11.0.0", + "chalk": "4.1.0", + "core-js": "^3.6.1", + "get-stdin": "8.0.0", + "lodash": "^4.17.19", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^15.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true + }, + "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 + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "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" + } + } + } + }, + "@commitlint/config-angular": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-angular/-/config-angular-11.0.0.tgz", + "integrity": "sha512-H8QSEOmfRsPW0Iehid5fY7NZ2HXmyKC6Q83MLFf9KRnmCcbgJtH+faECtqlvPntayO3CYbA4UenIerOaQ0vOAg==", + "dev": true, + "requires": { + "@commitlint/config-angular-type-enum": "^11.0.0" + } + }, + "@commitlint/config-angular-type-enum": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-angular-type-enum/-/config-angular-type-enum-11.0.0.tgz", + "integrity": "sha512-dSyxdkU36aEgDUWBSiM5lsZ/h2K7uCyKf+A5Sf3+Z5JhcLD9GzTo5W+c8KgwTBdL39dkL7sN+EVgsXNjW99pJg==", + "dev": true + }, + "@commitlint/ensure": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-11.0.0.tgz", + "integrity": "sha512-/T4tjseSwlirKZdnx4AuICMNNlFvRyPQimbZIOYujp9DSO6XRtOy9NrmvWujwHsq9F5Wb80QWi4WMW6HMaENug==", + "dev": true, + "requires": { + "@commitlint/types": "^11.0.0", + "lodash": "^4.17.19" + } + }, + "@commitlint/execute-rule": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz", + "integrity": "sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ==", + "dev": true + }, + "@commitlint/format": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-11.0.0.tgz", + "integrity": "sha512-bpBLWmG0wfZH/svzqD1hsGTpm79TKJWcf6EXZllh2J/LSSYKxGlv967lpw0hNojme0sZd4a/97R3qA2QHWWSLg==", + "dev": true, + "requires": { + "@commitlint/types": "^11.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "@commitlint/is-ignored": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz", + "integrity": "sha512-VLHOUBN+sOlkYC4tGuzE41yNPO2w09sQnOpfS+pSPnBFkNUUHawEuA44PLHtDvQgVuYrMAmSWFQpWabMoP5/Xg==", + "dev": true, + "requires": { + "@commitlint/types": "^11.0.0", + "semver": "7.3.2" + } + }, + "@commitlint/lint": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-11.0.0.tgz", + "integrity": "sha512-Q8IIqGIHfwKr8ecVZyYh6NtXFmKw4YSEWEr2GJTB/fTZXgaOGtGFZDWOesCZllQ63f1s/oWJYtVv5RAEuwN8BQ==", + "dev": true, + "requires": { + "@commitlint/is-ignored": "^11.0.0", + "@commitlint/parse": "^11.0.0", + "@commitlint/rules": "^11.0.0", + "@commitlint/types": "^11.0.0" + } + }, + "@commitlint/load": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-11.0.0.tgz", + "integrity": "sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg==", + "dev": true, + "requires": { + "@commitlint/execute-rule": "^11.0.0", + "@commitlint/resolve-extends": "^11.0.0", + "@commitlint/types": "^11.0.0", + "chalk": "4.1.0", + "cosmiconfig": "^7.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "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" + } + } + } + }, + "@commitlint/message": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-11.0.0.tgz", + "integrity": "sha512-01ObK/18JL7PEIE3dBRtoMmU6S3ecPYDTQWWhcO+ErA3Ai0KDYqV5VWWEijdcVafNpdeUNrEMigRkxXHQLbyJA==", + "dev": true + }, + "@commitlint/parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-11.0.0.tgz", + "integrity": "sha512-DekKQAIYWAXIcyAZ6/PDBJylWJ1BROTfDIzr9PMVxZRxBPc1gW2TG8fLgjZfBP5mc0cuthPkVi91KQQKGri/7A==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-parser": "^3.0.0" + } + }, + "@commitlint/read": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-11.0.0.tgz", + "integrity": "sha512-37V0V91GSv0aDzMzJioKpCoZw6l0shk7+tRG8RkW1GfZzUIytdg3XqJmM+IaIYpaop0m6BbZtfq+idzUwJnw7g==", + "dev": true, + "requires": { + "@commitlint/top-level": "^11.0.0", + "fs-extra": "^9.0.0", + "git-raw-commits": "^2.0.0" + } + }, + "@commitlint/resolve-extends": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz", + "integrity": "sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw==", + "dev": true, + "requires": { + "import-fresh": "^3.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@commitlint/rules": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-11.0.0.tgz", + "integrity": "sha512-2hD9y9Ep5ZfoNxDDPkQadd2jJeocrwC4vJ98I0g8pNYn/W8hS9+/FuNpolREHN8PhmexXbkjrwyQrWbuC0DVaA==", + "dev": true, + "requires": { + "@commitlint/ensure": "^11.0.0", + "@commitlint/message": "^11.0.0", + "@commitlint/to-lines": "^11.0.0", + "@commitlint/types": "^11.0.0" + } + }, + "@commitlint/to-lines": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-11.0.0.tgz", + "integrity": "sha512-TIDTB0Y23jlCNubDROUVokbJk6860idYB5cZkLWcRS9tlb6YSoeLn1NLafPlrhhkkkZzTYnlKYzCVrBNVes1iw==", + "dev": true + }, + "@commitlint/top-level": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-11.0.0.tgz", + "integrity": "sha512-O0nFU8o+Ws+py5pfMQIuyxOtfR/kwtr5ybqTvR+C2lUPer2x6lnQU+OnfD7hPM+A+COIUZWx10mYQvkR3MmtAA==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + } + } + }, + "@commitlint/types": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz", + "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", + "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + } + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + } + }, + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@types/babel__core": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", + "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", + "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", + "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/graceful-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.15", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.15.tgz", + "integrity": "sha512-s2VMReFXRg9XXxV+CW9e5Nz8fH2K1aEhwgjUqPPbQd7g95T0laAcvLv032EhFHIa5GHsZ8W7iJEQVaJq6k3Gog==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "dev": true + }, + "@types/node": { + "version": "14.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz", + "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/prettier": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", + "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "@types/yargs": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.9.0.tgz", + "integrity": "sha512-WrVzGMzzCrgrpnQMQm4Tnf+dk+wdl/YbgIgd5hKGa2P+lnJ2MON+nQnbwgbxtN9QDLi8HO+JAq0/krMnjQK6Cw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.9.0", + "@typescript-eslint/scope-manager": "4.9.0", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.9.0.tgz", + "integrity": "sha512-0p8GnDWB3R2oGhmRXlEnCvYOtaBCijtA5uBfH5GxQKsukdSQyI4opC4NGTUb88CagsoNQ4rb/hId2JuMbzWKFQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.9.0", + "@typescript-eslint/types": "4.9.0", + "@typescript-eslint/typescript-estree": "4.9.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.9.0.tgz", + "integrity": "sha512-QRSDAV8tGZoQye/ogp28ypb8qpsZPV6FOLD+tbN4ohKUWHD2n/u0Q2tIBnCsGwQCiD94RdtLkcqpdK4vKcLCCw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.9.0", + "@typescript-eslint/types": "4.9.0", + "@typescript-eslint/typescript-estree": "4.9.0", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.9.0.tgz", + "integrity": "sha512-q/81jtmcDtMRE+nfFt5pWqO0R41k46gpVLnuefqVOXl4QV1GdQoBWfk5REcipoJNQH9+F5l+dwa9Li5fbALjzg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.9.0", + "@typescript-eslint/visitor-keys": "4.9.0" + } + }, + "@typescript-eslint/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.9.0.tgz", + "integrity": "sha512-luzLKmowfiM/IoJL/rus1K9iZpSJK6GlOS/1ezKplb7MkORt2dDcfi8g9B0bsF6JoRGhqn0D3Va55b+vredFHA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.9.0.tgz", + "integrity": "sha512-rmDR++PGrIyQzAtt3pPcmKWLr7MA+u/Cmq9b/rON3//t5WofNR4m/Ybft2vOLj0WtUzjn018ekHjTsnIyBsQug==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.9.0", + "@typescript-eslint/visitor-keys": "4.9.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.9.0.tgz", + "integrity": "sha512-sV45zfdRqQo1A97pOSx3fsjR+3blmwtdCt8LDrXgCX36v4Vmz4KHrhpV6Fo2cRdXmyumxx11AHw0pNJqCNpDyg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.9.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "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-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "requires": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz", + "integrity": "sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "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" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + } + } + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "dev": true + }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "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 + }, + "conventional-changelog-angular": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.11.tgz", + "integrity": "sha512-nSLypht/1yEflhuTogC03i7DX7sOrXGsRn14g131Potqi6cbGbGEE9PSDEHKldabB6N76HiSyw9Ph+kLmC04Qw==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-commits-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz", + "integrity": "sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.1", + "lodash": "^4.17.15", + "meow": "^7.0.0", + "split2": "^2.0.0", + "through2": "^3.0.0", + "trim-off-newlines": "^1.0.0" + }, + "dependencies": { + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "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" + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "eslint": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.14.0.tgz", + "integrity": "sha512-5YubdnPXrlrYAFCKybPuHIAH++PINe1pmKNc5wQRB9HSbqIK1ywAnntE3Wwua4giKu0bjligf1gLF6qxMGOYRA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.1", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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" + } + } + } + }, + "eslint-config-prettier": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "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 + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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 + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "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-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "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 + }, + "fastq": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", + "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.0.tgz", + "integrity": "sha512-pKnaUh2TNvk+/egJdBw1h46LwyLx8BzEq+MGCf/RMCVfEHHsGOCWG00dqk91kUPPArIIwMBg9T/virxwzP03cA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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 + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-raw-commits": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.7.tgz", + "integrity": "sha512-SkwrTqrDxw8y0G1uGJ9Zw13F7qu3LF8V4BifyDeiJCxSnjRGZD9SaoMiMqUvvXMXh6S3sOQ1DsBN7L2fMUZW/g==", + "dev": true, + "requires": { + "dargs": "^7.0.0", + "lodash.template": "^4.0.2", + "meow": "^7.0.0", + "split2": "^2.0.0", + "through2": "^3.0.0" + }, + "dependencies": { + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "husky": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", + "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "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==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", + "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true, + "optional": true + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "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-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "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 + }, + "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" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + } + }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + } + }, + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + } + }, + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + } + }, + "jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "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" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "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 + }, + "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" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "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 + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "lint-staged": { + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.2.tgz", + "integrity": "sha512-e8AYR1TDlzwB8VVd38Xu2lXDZf6BcshVqKVuBQThDJRaJLobqKnpbm4dkwJ2puypQNbLr9KF/9mfA649mAGvjA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "commander": "^6.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.2.0", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^4.1.0", + "listr2": "^3.2.2", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "listr2": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.3.tgz", + "integrity": "sha512-vUb80S2dSUi8YxXahO8/I/s29GqnOL8ozgHVLjfWQXa03BNEeS1TpBLjh2ruaqq5ufx46BRGvfymdBSuoXET5w==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "figures": "^3.2.0", + "indent-string": "^4.0.0", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.3", + "through": "^2.3.8" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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 + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "meow": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", + "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + }, + "dependencies": { + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "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 + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "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 + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", + "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + }, + "dependencies": { + "uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "dev": true, + "optional": true + } + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "p-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "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" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "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 + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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 + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "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 + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "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 + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "dev": true, + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "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 + }, + "resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "requires": { + "global-dirs": "^0.1.1" + }, + "dependencies": { + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + } + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "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" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "run-parallel": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", + "dev": true + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "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 + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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 + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "^2.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, + "string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "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": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "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 + }, + "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" + } + } + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, + "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 + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "dependencies": { + "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 + } + } + }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + }, + "dependencies": { + "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 + } + } + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, + "ts-jest": { + "version": "26.4.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.4.4.tgz", + "integrity": "sha512-3lFWKbLxJm34QxyVNNCgXX1u4o/RV0myvA2y2Bxm46iGIjKlaY0own9gIckbjZJPn+WaJEnfPPJ20HHGpoq4yg==", + "dev": true, + "requires": { + "@types/jest": "26.x", + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^26.1.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "dependencies": { + "yargs-parser": { + "version": "20.2.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.3.tgz", + "integrity": "sha512-emOFRT9WVHw03QSvN5qor9QQT9+sw5vwxfYweivSMHTcAXPefwVae2FjO7JJjj8hCE4CzPOPeFM83VwT29HCww==", + "dev": true + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", + "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "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 + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "v8-to-istanbul": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz", + "integrity": "sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + } + }, + "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" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "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 + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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 + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..06bc093 --- /dev/null +++ b/package.json @@ -0,0 +1,75 @@ +{ + "name": "@coderbyheart/advent-of-code", + "version": "0.0.0-development", + "description": "Advent of Code 2020 solutions in TypeScript", + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/coderbyheart/aoc.git" + }, + "bugs": { + "url": "https://github.com/coderbyheart/aoc/issues" + }, + "homepage": "https://github.com/coderbyheart/aoc", + "keywords": [ + "Advent of Code", + "TypeScript", + "aoc2020" + ], + "author": "Markus Tacker | https://coderbyheart.com", + "license": "MIT", + "devDependencies": { + "@bifravst/code-style": "8.0.134", + "@bifravst/eslint-config-typescript": "5.0.79", + "@commitlint/cli": "11.0.0", + "@commitlint/config-angular": "11.0.0", + "@types/jest": "26.0.15", + "@types/node": "14.14.10", + "eslint": "^7.14.0", + "husky": "^4.3.0", + "jest": "26.6.3", + "lint-staged": "^10.5.2", + "prettier": "2.2.1", + "ts-jest": "26.4.4", + "typescript": "4.1.2" + }, + "husky": { + "hooks": { + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS", + "pre-commit": "lint-staged && npx jest --onlyChanged" + } + }, + "lint-staged": { + "*.ts": [ + "prettier --write", + "eslint --ext .js,.ts" + ], + "*.{md,json,yaml,yml}": [ + "prettier --write" + ] + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + }, + "jest": { + "testURL": "http://localhost", + "moduleFileExtensions": [ + "ts", + "tsx", + "js", + "json" + ], + "transform": { + "^.+\\.tsx?$": "ts-jest" + }, + "testRegex": ".+\\.spec\\.ts$", + "globals": { + "ts-jest": { + "diagnostics": true + } + } + } +} diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..6e30f5d --- /dev/null +++ b/renovate.json @@ -0,0 +1,3 @@ +{ + "extends": ["github>bifravst/code-style"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..5e2a8bc --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@bifravst/code-style/tsconfig.json", + "include": ["**/*.ts"], + "compilerOptions": { + "outDir": "dist/" + } +} From b39b72afd7f6ca2d7326a6275fad13db6d8bf312 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Tue, 1 Dec 2020 10:29:34 +0100 Subject: [PATCH 002/110] feat(day01): step 1 --- day01/day01.spec.ts | 20 ++++ day01/findEntriesWithSum.ts | 11 ++ day01/sample.txt | 6 ++ day01/step1.txt | 200 ++++++++++++++++++++++++++++++++++++ 4 files changed, 237 insertions(+) create mode 100644 day01/day01.spec.ts create mode 100644 day01/findEntriesWithSum.ts create mode 100644 day01/sample.txt create mode 100644 day01/step1.txt diff --git a/day01/day01.spec.ts b/day01/day01.spec.ts new file mode 100644 index 0000000..d15b4bc --- /dev/null +++ b/day01/day01.spec.ts @@ -0,0 +1,20 @@ +import { loader } from '../lib/loader' +import { findEntriesWithSum } from './findEntriesWithSum' + +const load = loader(1) + +const toInt = (s: string) => parseInt(s, 10) +const mul = (total: number, n: number) => n * total + +describe('Day 01: Expenses Report', () => { + it('should solve the sample', () => { + const sample = load('sample') + expect(findEntriesWithSum(sample.map(toInt), 2020)).toEqual([1721, 299]) + }) + it('should solve part 1', () => { + const part1 = load('step1') + expect(findEntriesWithSum(part1.map(toInt), 2020).reduce(mul, 1)).toEqual( + 982464, + ) + }) +}) diff --git a/day01/findEntriesWithSum.ts b/day01/findEntriesWithSum.ts new file mode 100644 index 0000000..b34fa74 --- /dev/null +++ b/day01/findEntriesWithSum.ts @@ -0,0 +1,11 @@ +export const findEntriesWithSum = ( + entries: number[], + expectedSum: number, +): number[] => { + for (const i of entries) { + for (const j of entries) { + if (i + j === expectedSum) return [i, j] + } + } + return [] +} diff --git a/day01/sample.txt b/day01/sample.txt new file mode 100644 index 0000000..0bb977d --- /dev/null +++ b/day01/sample.txt @@ -0,0 +1,6 @@ +1721 +979 +366 +299 +675 +1456 \ No newline at end of file diff --git a/day01/step1.txt b/day01/step1.txt new file mode 100644 index 0000000..71a40c2 --- /dev/null +++ b/day01/step1.txt @@ -0,0 +1,200 @@ +1864 +1880 +1300 +1961 +1577 +1900 +1307 +1818 +1736 +1846 +1417 +1372 +1351 +1860 +1738 +1525 +1798 +1218 +1723 +1936 +1725 +1998 +1466 +1922 +1782 +1947 +1717 +1914 +1843 +1732 +1918 +814 +1771 +1712 +1804 +1213 +1859 +1820 +1793 +1870 +1993 +1787 +1824 +1849 +1646 +1489 +1348 +1978 +1628 +1781 +2002 +1297 +1829 +1596 +1819 +1313 +1413 +1726 +1449 +1810 +1295 +1679 +1358 +1949 +1644 +1825 +1891 +490 +1962 +1939 +1228 +1889 +1977 +1980 +1763 +1752 +1983 +1785 +1678 +2000 +1857 +1658 +1863 +1330 +1380 +1799 +1789 +1633 +1663 +296 +1985 +1117 +1239 +1854 +1960 +2004 +1940 +1876 +1739 +1858 +1283 +1423 +1982 +1836 +1451 +1840 +1347 +1652 +1695 +1210 +1861 +1199 +1346 +1786 +1814 +1958 +1853 +1974 +1917 +1308 +654 +1743 +1847 +1367 +1559 +1614 +1897 +2003 +1886 +1885 +1682 +1204 +1986 +1816 +1994 +1817 +1751 +1701 +1619 +1970 +816 +1852 +1832 +1631 +703 +1604 +1444 +1842 +1984 +1259 +1948 +1620 +1681 +1822 +1865 +1521 +1741 +1455 +1909 +1764 +261 +1464 +1905 +1325 +1766 +1749 +1292 +1874 +1267 +1269 +1969 +1991 +1219 +1345 +1976 +1369 +1942 +1388 +1776 +1629 +1987 +1684 +1813 +1203 +1965 +1729 +1930 +1609 +1801 +1402 +121 +1833 +1898 +1957 +1051 +1430 +1893 +1784 +1800 +1910 \ No newline at end of file From bf57fc8d9bcfddcd798d74998c16105141781a07 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Tue, 1 Dec 2020 22:36:50 +0100 Subject: [PATCH 003/110] fix: update dependencies --- day01/day01.spec.ts | 32 ++++++++++++++++++++++++-------- day01/findEntriesWithSum.ts | 17 ++++++++--------- day01/{step1.txt => input.txt} | 0 lib/combine.ts | 21 +++++++++++++++++++++ package-lock.json | 6 +++--- package.json | 2 +- 6 files changed, 57 insertions(+), 21 deletions(-) rename day01/{step1.txt => input.txt} (100%) create mode 100644 lib/combine.ts diff --git a/day01/day01.spec.ts b/day01/day01.spec.ts index d15b4bc..b60772d 100644 --- a/day01/day01.spec.ts +++ b/day01/day01.spec.ts @@ -2,19 +2,35 @@ import { loader } from '../lib/loader' import { findEntriesWithSum } from './findEntriesWithSum' const load = loader(1) +const sample = load('sample') +const input = load('input') const toInt = (s: string) => parseInt(s, 10) const mul = (total: number, n: number) => n * total describe('Day 01: Expenses Report', () => { - it('should solve the sample', () => { - const sample = load('sample') - expect(findEntriesWithSum(sample.map(toInt), 2020)).toEqual([1721, 299]) + describe('Part 1', () => { + it('should solve the sample', () => { + expect( + findEntriesWithSum(2)(sample.map(toInt), 2020).reduce(mul, 1), + ).toEqual(1721 * 299) + }) + it('should solve', () => { + expect( + findEntriesWithSum(2)(input.map(toInt), 2020).reduce(mul, 1), + ).toEqual(982464) + }) }) - it('should solve part 1', () => { - const part1 = load('step1') - expect(findEntriesWithSum(part1.map(toInt), 2020).reduce(mul, 1)).toEqual( - 982464, - ) + describe('Part 2', () => { + it('should solve the sample', () => { + expect( + findEntriesWithSum(3)(sample.map(toInt), 2020).reduce(mul, 1), + ).toEqual(979 * 366 * 675) + }) + it('should solve', () => { + expect( + findEntriesWithSum(3)(input.map(toInt), 2020).reduce(mul, 1), + ).toEqual(162292410) + }) }) }) diff --git a/day01/findEntriesWithSum.ts b/day01/findEntriesWithSum.ts index b34fa74..ab94b84 100644 --- a/day01/findEntriesWithSum.ts +++ b/day01/findEntriesWithSum.ts @@ -1,11 +1,10 @@ -export const findEntriesWithSum = ( +import { combine } from '../lib/combine' + +const sum = (total: number, n: number) => n + total + +export const findEntriesWithSum = (numEntries: number) => ( entries: number[], expectedSum: number, -): number[] => { - for (const i of entries) { - for (const j of entries) { - if (i + j === expectedSum) return [i, j] - } - } - return [] -} +): number[] => + combine(entries, numEntries).find((e) => e.reduce(sum, 0) === expectedSum) ?? + [] diff --git a/day01/step1.txt b/day01/input.txt similarity index 100% rename from day01/step1.txt rename to day01/input.txt diff --git a/lib/combine.ts b/lib/combine.ts new file mode 100644 index 0000000..7d9d2cd --- /dev/null +++ b/lib/combine.ts @@ -0,0 +1,21 @@ +/** + * Creates combinations of a with length n + */ +export const combine = ( + arr: number[], + numEntries: number, + combinations: number[][] = [], + remaining: number[] = [], +): number[][] => + arr.reduce((p, c, i, a) => { + numEntries > 1 + ? combine( + a.slice(i + 1), + numEntries - 1, + p, + (remaining.push(c), remaining), + ) + : p.push((remaining.push(c), remaining).slice(0)) + remaining.pop() + return p + }, combinations) diff --git a/package-lock.json b/package-lock.json index 29b86d3..49c1fbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1412,9 +1412,9 @@ } }, "@types/jest": { - "version": "26.0.15", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.15.tgz", - "integrity": "sha512-s2VMReFXRg9XXxV+CW9e5Nz8fH2K1aEhwgjUqPPbQd7g95T0laAcvLv032EhFHIa5GHsZ8W7iJEQVaJq6k3Gog==", + "version": "26.0.16", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.16.tgz", + "integrity": "sha512-Gp12+7tmKCgv9JjtltxUXokohCAEZfpJaEW5tn871SGRp8I+bRWBonQO7vW5NHwnAHe5dd50+Q4zyKuN35i09g==", "dev": true, "requires": { "jest-diff": "^26.0.0", diff --git a/package.json b/package.json index 06bc093..cd9d16d 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@bifravst/eslint-config-typescript": "5.0.79", "@commitlint/cli": "11.0.0", "@commitlint/config-angular": "11.0.0", - "@types/jest": "26.0.15", + "@types/jest": "26.0.16", "@types/node": "14.14.10", "eslint": "^7.14.0", "husky": "^4.3.0", From 51a867f414804f4a95b92fc240298547889640a7 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Tue, 1 Dec 2020 22:45:50 +0100 Subject: [PATCH 004/110] docs: fix repo url --- README.md | 8 ++++---- package.json | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3b0e78e..fb13f81 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # Advent of Code 2020 solutions in TypeScript -[![GitHub Actions](https://github.com/coderbyheart/aoc/workflows/Test/badge.svg)](https://github.com/coderbyheart/aoc/actions) -[![Known Vulnerabilities](https://snyk.io/test/github/coderbyheart/aoc/badge.svg)](https://snyk.io/test/github/coderbyheart/aoc) +[![GitHub Actions](https://github.com/coderbyheart/adventofcode/workflows/Test/badge.svg)](https://github.com/coderbyheart/adventofcode/actions) +[![Known Vulnerabilities](https://snyk.io/test/github/coderbyheart/adventofcode/badge.svg)](https://snyk.io/test/github/coderbyheart/adventofcode) [![Renovate](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com) -[![Mergify Status](https://img.shields.io/endpoint.svg?url=https://dashboard.mergify.io/badges/coderbyheart/aoc&style=flat)](https://mergify.io) +[![Mergify Status](https://img.shields.io/endpoint.svg?url=https://dashboard.mergify.io/badges/coderbyheart/adventofcode&style=flat)](https://mergify.io) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier/) [![ESLint: TypeScript](https://img.shields.io/badge/ESLint-TypeScript-blue.svg)](https://github.com/typescript-eslint/typescript-eslint) - git clone https://github.com/coderbyheart/aoc + git clone https://github.com/coderbyheart/adventofcode npm ci npm test diff --git a/package.json b/package.json index cd9d16d..a60e6fb 100644 --- a/package.json +++ b/package.json @@ -7,12 +7,12 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/coderbyheart/aoc.git" + "url": "git+https://github.com/coderbyheart/adventofcode.git" }, "bugs": { - "url": "https://github.com/coderbyheart/aoc/issues" + "url": "https://github.com/coderbyheart/adventofcode/issues" }, - "homepage": "https://github.com/coderbyheart/aoc", + "homepage": "https://github.com/coderbyheart/adventofcode", "keywords": [ "Advent of Code", "TypeScript", From 13243a70e7f5d48ca4802bd548184a608f5c7e6d Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Tue, 1 Dec 2020 23:53:15 +0100 Subject: [PATCH 005/110] refactor: re-implement combine to improve readability --- day01/findEntriesWithSum.ts | 7 ++++--- lib/combine.ts | 21 -------------------- lib/uniqueCombinations.spec.ts | 35 ++++++++++++++++++++++++++++++++++ lib/uniqueCombinations.ts | 25 ++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 24 deletions(-) delete mode 100644 lib/combine.ts create mode 100644 lib/uniqueCombinations.spec.ts create mode 100644 lib/uniqueCombinations.ts diff --git a/day01/findEntriesWithSum.ts b/day01/findEntriesWithSum.ts index ab94b84..de64179 100644 --- a/day01/findEntriesWithSum.ts +++ b/day01/findEntriesWithSum.ts @@ -1,4 +1,4 @@ -import { combine } from '../lib/combine' +import { uniqueCombinations } from '../lib/uniqueCombinations' const sum = (total: number, n: number) => n + total @@ -6,5 +6,6 @@ export const findEntriesWithSum = (numEntries: number) => ( entries: number[], expectedSum: number, ): number[] => - combine(entries, numEntries).find((e) => e.reduce(sum, 0) === expectedSum) ?? - [] + uniqueCombinations(numEntries)(entries).find( + (e) => e.reduce(sum, 0) === expectedSum, + ) ?? [] diff --git a/lib/combine.ts b/lib/combine.ts deleted file mode 100644 index 7d9d2cd..0000000 --- a/lib/combine.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Creates combinations of a with length n - */ -export const combine = ( - arr: number[], - numEntries: number, - combinations: number[][] = [], - remaining: number[] = [], -): number[][] => - arr.reduce((p, c, i, a) => { - numEntries > 1 - ? combine( - a.slice(i + 1), - numEntries - 1, - p, - (remaining.push(c), remaining), - ) - : p.push((remaining.push(c), remaining).slice(0)) - remaining.pop() - return p - }, combinations) diff --git a/lib/uniqueCombinations.spec.ts b/lib/uniqueCombinations.spec.ts new file mode 100644 index 0000000..c6fa97e --- /dev/null +++ b/lib/uniqueCombinations.spec.ts @@ -0,0 +1,35 @@ +import { uniqueCombinations } from './uniqueCombinations' + +const seq = [2, 3, 5, 7] +describe('uniqueCombinations', () => { + it.each([ + [0, seq, []], + [1, seq, [[2], [3], [5], [7]]], + [ + 2, + seq, + [ + [2, 3], + [2, 5], + [2, 7], + [3, 5], + [3, 7], + [5, 7], + ], + ], + [ + 3, + seq, + [ + [2, 3, 5], + [2, 3, 7], + [2, 5, 7], + [3, 5, 7], + ], + ], + [4, seq, [[2, 3, 5, 7]]], + [5, seq, []], + ])('combinations of length %d', (length, items, expected) => + expect(uniqueCombinations(length)(items)).toEqual(expected), + ) +}) diff --git a/lib/uniqueCombinations.ts b/lib/uniqueCombinations.ts new file mode 100644 index 0000000..4e5f2a5 --- /dev/null +++ b/lib/uniqueCombinations.ts @@ -0,0 +1,25 @@ +/** + * Returns a list of unique combinations of length n of the items + */ +export const uniqueCombinations = (len: number) => (items: T[]): T[][] => { + // Trivial case: only one item per combination + if (len === 1) return items.map((i) => [i]) + // Otherwise: go over all items in the list ... + return items.reduce((combinations, item, i) => { + // ... and combine it with the remaining entries in the list + const pairs = uniqueCombinations( + // which means the list will be one item less + len - 1, + )( + // and starts from the next entry in the list + items.slice(i + 1), + ) + // which is all previous entries + combinations.push( + // and this element, combined with all found pairs + ...pairs.map((p) => [item, ...p]), + ) + // Return the result + return combinations + }, [] as T[][]) +} From 4cefc4c4137f1160c12c97bc21d44a9c850c0bdb Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 2 Dec 2020 09:35:51 +0100 Subject: [PATCH 006/110] refactor: rename files --- day01/{day01.spec.ts => solution.spec.ts} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename day01/{day01.spec.ts => solution.spec.ts} (95%) diff --git a/day01/day01.spec.ts b/day01/solution.spec.ts similarity index 95% rename from day01/day01.spec.ts rename to day01/solution.spec.ts index b60772d..e9b2c2d 100644 --- a/day01/day01.spec.ts +++ b/day01/solution.spec.ts @@ -8,7 +8,7 @@ const input = load('input') const toInt = (s: string) => parseInt(s, 10) const mul = (total: number, n: number) => n * total -describe('Day 01: Expenses Report', () => { +describe('Day 1: Report Repair', () => { describe('Part 1', () => { it('should solve the sample', () => { expect( From 2f8889c5ee56c71f56f529d6413d1f1db31e2f71 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 2 Dec 2020 09:37:00 +0100 Subject: [PATCH 007/110] feat(day02): step 1 --- day02/findValidPasswords.ts | 29 + day02/input.txt | 1000 +++++++++++++++++++++++++++++++++++ day02/sample.txt | 3 + day02/solution.spec.ts | 17 + 4 files changed, 1049 insertions(+) create mode 100644 day02/findValidPasswords.ts create mode 100644 day02/input.txt create mode 100644 day02/sample.txt create mode 100644 day02/solution.spec.ts diff --git a/day02/findValidPasswords.ts b/day02/findValidPasswords.ts new file mode 100644 index 0000000..4da6e29 --- /dev/null +++ b/day02/findValidPasswords.ts @@ -0,0 +1,29 @@ +const policyAndPasswordsLine = new RegExp( + /^(?[0-9]+)-(?[0-9]+) (?[a-z]): (?[a-z]+)$/, +) + +const containsChar = ( + s: string, + char: string, + min: number, + max: number, +): boolean => { + const numChars = s.split('').filter((s) => s === char).length + return numChars >= min && numChars <= max +} + +export const findValidPasswords = (policyAndPasswords: string[]): number => + policyAndPasswords.reduce((count, s) => { + const { minChars, maxChars, char, password } = + policyAndPasswordsLine.exec(s)?.groups ?? {} + if ( + containsChar( + password, + char, + parseInt(minChars, 10), + parseInt(maxChars, 10), + ) + ) + return count + 1 + return count + }, 0) diff --git a/day02/input.txt b/day02/input.txt new file mode 100644 index 0000000..ebd0c1b --- /dev/null +++ b/day02/input.txt @@ -0,0 +1,1000 @@ +15-16 l: klfbblslvjclmlnqklvg +6-13 h: pghjchdxhnjhjd +4-13 n: nnznntzznqnzbtzj +10-16 r: nrrrrkrjtxwrrrwx +1-6 t: rttftttttttttmdttttt +4-12 l: zhllfxlmvqtnhx +6-8 d: wxpwgdbjtffddkb +7-9 q: rqcqxjqhsm +6-8 x: xxxfxdxxx +5-9 d: dwnwnbsddfmc +2-6 j: jvdrrjchml +8-10 x: xxxcxxxzxxxxx +15-16 f: ffffffffffffffnfc +3-12 v: vgvvvvvvvvfqvvvv +2-5 p: tknppm +11-12 r: frrnrfqtshrgw +13-16 f: rfjmkrqkqrxmfnqj +3-5 f: ffffxffn +2-4 f: fffwf +11-13 s: srslssshssssx +1-6 c: cccdcn +2-6 t: tthhnc +12-17 w: wwwwwwwwwwwmwwwwg +5-6 k: kqkksskkp +4-5 p: ppppx +5-12 h: hbjhqhdwnqxhhsh +6-8 p: ppgzpppw +3-4 z: zzcz +6-15 x: hfvxxsqbfxxlhpxtb +4-7 m: qmxzhgt +18-20 b: fvzbbrbcvskxrpkwnmwb +1-11 c: ccccccccccggccc +1-3 p: dppp +2-6 j: fjbmljmdb +2-4 l: slpmqpk +3-5 b: stbpbbndtgzxlsnbdk +6-11 h: hlzkdhhhrhchmhbhl +1-4 w: wwpv +10-12 p: pmpppkpppgph +11-14 f: fbdxffpffffffkfffjvf +4-9 v: vkvfhfvvrvvv +16-17 t: tmtbztrptdlvttvkt +2-6 w: wwwwphwwwwnwwj +6-11 x: xxxxxxxxxxkxx +9-10 t: ttftchttnd +2-9 w: wkwwwwwwlww +2-4 g: ggvcgggggggggg +5-6 d: dldddsddddddd +5-8 j: jddjjnld +9-12 l: xldxlklvlkll +2-3 w: xwnrwdwndlvl +16-18 m: mmmmrmmmmmrvvmmvmm +3-4 t: ctts +11-12 b: ndgjdbppcdbhhssw +2-11 s: nssksssnssxvq +2-5 g: qggwcvf +10-14 l: llxlllrjlmlllwllll +8-9 w: wwwwfpwtvtjwjw +8-10 m: mmmmmmmmmmm +1-11 z: rldjzzzpzzs +16-17 v: qvsrnvvvwxgmvjjcvhcx +14-18 k: kkkkkkkkkkkkkkkkklk +2-3 q: qqrqqqxqqqq +4-9 c: lclckhcgn +2-3 b: nbbbbldlbbb +15-18 v: vtvvrvxvvnvxhvnvvv +4-7 q: qqqnqqqq +3-13 j: svjjdcnkwnbpl +4-11 q: blnqvqsngwj +3-4 j: dxdkj +5-7 c: dzxbsctqwclcgc +3-4 f: jfhffff +3-5 t: sttwk +7-8 t: tnqtvsztqwpvtftknt +1-12 r: grrrrrrrrrrrrrrr +7-8 k: kkkkkkqkk +3-4 l: llls +1-14 h: khhhjhhhhhhhhh +3-5 d: ttcdddd +1-7 w: dqwhwkww +4-5 p: pppqppppp +10-14 l: lqlltwlllllllzjk +15-17 d: ddddddddddddddddcdd +1-8 z: xpbbjxrzlzznxlz +1-2 v: vrvv +7-11 l: llllllclllslll +3-14 h: hhvhhhhhhhhhhhh +6-7 m: mmgpbjmgqmm +9-13 h: hhhhhhhhhhhhfnhhhhwh +12-17 c: cccpfcccccnccccqscc +6-12 x: kqfxbhxbdxxxl +6-8 z: zqkbtzzb +6-8 l: llllllllllllll +6-13 d: wdzdxdddddlzdtbd +3-8 h: gzcknrxkjgtggnqwqjs +1-6 t: tttttvtt +5-8 x: fjxnxrtn +6-9 z: zzzzzzzzszzz +2-4 v: vpvvtv +1-7 w: wcwrxgf +2-3 t: vxftld +1-2 n: nnxmntsqzk +5-11 l: nmvllllnlckl +7-13 c: cwchccjcrfsccc +2-3 z: dzdz +7-8 s: sddgbhws +3-11 w: qqsqrgmwwmwgfdhpsct +16-17 q: qqqqzqqqqqqqqqqqh +7-15 h: thqthdphmbhhjphhh +6-10 k: gcflljjwkk +9-17 f: ffffffffffffffffdf +10-12 q: qqqqbqlpqqfdqq +3-16 x: dbxmwtlqdmvldxlgxdhk +1-2 x: xxjxh +10-11 p: ppqpppkpptp +3-5 w: wwwwwwwww +10-11 j: xjmhqgdznjf +9-11 n: dxnnnnnnnnmnnn +1-5 l: mlllvllwlrblllll +14-16 q: tqqqqqqwqqqqqmqqqqq +2-3 b: nvbbbcf +5-8 x: xmkxxgxq +1-4 x: xxxfx +1-6 n: nnnrnm +9-17 p: pppppppppppppppppp +2-4 d: ddqd +13-14 p: fmpkxpprppppzhpp +5-6 t: tttttgrttt +10-12 r: rrrrrrrrrlrrrrrrrr +4-7 h: gnmqvqrhwhh +4-5 m: smsmmmm +4-5 q: qgzqb +6-12 c: rdnnsccnrjkcnm +4-16 k: gfkxktpwhxzkgcdnb +4-5 f: ffgvf +6-13 n: nfslcrnkksfmnmvcfnnz +15-18 s: sssqsssssmshmsmsss +1-15 v: vvvvwvvxvvvcvvwvvvvv +2-8 h: gphlnhph +4-13 t: vtjvrcxqwbsrk +2-10 t: tvttftzttttqttt +12-13 t: dvsbstlkfpztdqs +7-8 w: rvwncwww +13-16 v: vlqzjlvxljrvvjvvzp +12-13 w: wwwwwwwwnwdwwgwwwx +14-15 d: dcpdddddddddddmdbd +1-3 b: bbdbbbb +11-12 t: rkdtncbtkktzmvtghb +3-7 n: nzbfgbnnx +5-13 v: vsvbkvvvvvvvv +3-8 n: nltdrmbn +14-15 p: mzkmmqdfpcptzbzc +4-6 q: qtqkgqfmqwm +9-10 v: vvdvvxvvxvwd +5-7 m: mmmmmmkm +6-7 k: kkkkkgkk +8-9 h: shhhhhhhh +8-11 p: pppppppppczplbwcpb +11-17 k: kkkkkkkkkkkkkktkc +9-17 w: mwtfbvsfnhwxqqvxw +8-12 j: jhjjjjjrkjnjjjjjjjj +3-5 g: sgfgqgg +12-14 j: jjjjjjjjjjjjjjjjjjjj +1-11 f: jsffffzfffffxffftf +16-17 f: fffffffffftfffffff +2-4 k: klkwkk +5-8 g: gtjngzkhgb +4-7 b: bbbmbbbb +4-5 w: wwwdw +5-15 g: tplhhgmggbhggrllqg +9-13 v: jvvbqvsbvzhxvh +1-3 d: ddsddn +2-5 w: cfwds +7-11 x: xxxxjxvvxvxhxvml +5-6 v: jwqxvb +3-15 s: ssqsssssssssssss +5-9 d: dddddddddddddddd +5-8 l: vklnlclj +10-13 s: sltdlfbssxsss +11-18 j: hxjxjnjcpmkppnpjpjk +4-6 t: ttbzhvt +2-17 v: rzmhrssrjvpncwqwl +2-4 x: mtcxz +11-12 d: dddddddwddbd +2-13 h: whgpdxvkfxrhg +5-7 d: ddddddxdtddddddhdddq +4-8 b: lhcfbkbbdmb +8-15 l: lvtmkgwllqttgplbgjj +3-5 n: nqngjvw +12-19 m: mmmmmmmmmmmmmmmmmmgm +5-9 g: grhgsdcwgmdt +6-9 j: msgrcrfvzksfxxjq +6-10 s: xdssssssssssssssg +8-9 h: hhhnhhnfhh +12-15 f: fffffffffffffffwfff +3-7 p: pzzpbjkfcczbmnpkf +6-7 r: cnjlbhr +2-5 f: dwxcftrbljgstf +5-11 h: hhhhjhhhhhqh +16-18 r: rrrrrrrrrrrrrrrrrmrr +2-4 r: rxmrd +7-9 c: ccccczccccc +7-13 d: ddddddddddddfd +3-11 k: mmkspkltjwm +8-11 c: rvccccgtclc +1-3 v: vvhhv +4-7 t: jttnttgx +4-16 n: nnnjnfnnnnnnnnnnnn +5-6 m: mmmdmqmm +9-10 x: xxxxxxxkxrx +2-4 m: tmcmzjmvtcghlgm +6-7 q: lqqjqqnzqqmq +16-19 k: kjwkhkkjhkskskpnkfk +19-20 b: pbbpsbnbbmnntbnbbbbn +4-5 p: ppppmp +3-4 d: grlqndd +4-7 n: nnnnnnsn +9-12 k: kkkkkkkkfkkkkk +4-10 h: hfhhhxhfhd +4-9 t: ttttxbbbcdmxsrhjj +4-11 l: npxwbsmklbls +17-20 d: dddddwdhdkddjdddtfdd +3-4 s: nldssq +4-8 s: sssdsssgs +5-16 t: ttttprtcttttttzt +9-17 j: tjjtjjjjgljjjcjjfj +7-8 b: bbbbtbkbb +2-13 l: szllllllllxllll +8-11 n: bmpnwrnngnmsfw +1-5 d: jddqtdwddxddjd +10-11 s: hqgnvslssstqdnvs +14-16 p: ppppppppvpplpgpp +2-8 h: khhjfcqp +6-7 d: fxdpdwvdjkd +5-7 n: bnnprnf +9-13 f: vfffwfffffffkfxff +2-10 j: vjhcggzrjqt +5-7 g: gggfggzwgg +5-6 d: ddbsjddfsdnddxfpgdd +12-13 g: gggqjgxgzpgsggxggxk +1-8 l: hlslllllll +12-13 f: sbfftpvbjsmff +6-7 s: hqcthsb +5-11 s: qsstnssssqsrsskdss +2-6 x: hxrfnjfclx +1-2 w: swwwwwwwwwwwjwmwwwww +7-12 s: whsbkgsmvnfjnnkq +10-12 l: fllllllllsllll +8-9 s: lsssssssqs +1-7 p: pdpppghqppxpppppp +1-3 x: jhxmjhkdrxgd +1-7 b: lbxbbbvbwbbbbt +4-5 c: cdckcbcmqcc +5-9 k: kkmklhlmkkgkrld +12-18 x: dvjxqxxxxxdxxxzxhp +5-8 h: nhfhnfqx +15-16 k: kkkkktrkkkkkpkhqxkkd +1-13 j: dcnbwjxllpksj +11-13 v: wvqhznrrfgmnvz +2-5 m: bpjbmbrmfh +10-15 t: mgtttttqspthnttkktt +9-10 n: nnpnnnnpnh +8-10 b: bjbzhbbbcq +4-12 n: nnnvnnnnnnnnnn +13-14 v: zbkchmmvjvsgkvhcz +2-9 j: jdqjgnnjjjvjt +11-16 g: ggggxqglgglfhvgggn +1-2 b: bsbm +8-11 v: lvvvjhvmxvvvv +5-7 x: xxsxxxpr +2-15 t: stwqdkrqcwbmngtd +5-8 r: rcrrvndr +5-6 v: vvvvvr +4-5 x: qpxxr +1-2 k: nkkkkkd +10-13 r: znlqhvwdvrqbrrrfzwc +1-2 h: hwhhhchhhhhhhhhhhh +3-6 b: bbbbbvbbbvbb +13-14 s: ssssssssmssssdss +7-11 x: cwxhmnhzxrxdrzzxbw +5-16 m: rgjtmrqqmfmmckxm +17-18 b: bbbbbbbbbbbbbbbbbk +11-20 k: kppkqkftkgkkknbtglkb +13-14 t: rtcfrkjvtgnrtf +5-6 z: kdzjxzjgmd +2-3 p: rxppj +9-12 b: mtpbbbbbbbbgp +8-9 b: rbbbbbsbbbbxb +13-17 r: rxgbrrnrrrrrrkrrlrrr +8-11 w: pzqswqwcfln +3-4 x: xxxx +6-9 j: fjhkjjklc +6-7 m: ctmzmfm +8-9 l: lllllllgllpts +8-9 t: hgpwblqkvqtb +4-7 d: dddpddd +4-5 c: ccccwcccg +1-7 q: lvvtpqqvnsqbzqpr +8-15 q: qqqqqqqqqqpqqqlqqq +4-8 f: frfffffffxf +7-12 r: rrrrrrrrrrrkprrtrrrp +14-15 j: jsjjjjjjjjjjjjl +6-17 b: khgflbrbrjbgzjtjt +5-7 j: jjknjpw +2-9 h: rhlqbdklh +5-7 j: lrtvccjbzgjh +12-14 t: tltwtxtctttnttttft +8-9 q: qqqqqqqqx +4-15 p: ppppppppppppppc +2-3 v: vvvvv +5-7 h: djvplxb +11-12 g: gjxlvggsgggxsgfgp +5-6 g: gggggfg +1-6 x: wxtxxxxxxxxxx +1-4 r: rqrcrvrzbrxrwjr +9-10 w: wwwmwwwwpww +7-15 z: pzrbrxpzzzzzntzv +4-5 q: qjqwqqnlqhclq +12-16 g: ggccgzggggsggjgg +11-13 b: phbmbsgkvszbbrbb +2-3 l: xhlbhl +1-7 q: qwdqmtv +5-9 x: xxxxjxxxxx +6-8 p: kvpwqbdp +11-13 t: tqttttttttttmt +9-16 l: wzdxdmlxlkfjknnz +1-11 j: vjjjjjjjjjjj +2-18 t: tsttttttttttttttthtt +6-7 n: fnnncnl +3-5 s: lssvgfssgsshsvstsss +3-5 h: hhhbhhh +4-10 x: tsxxxxxxbls +2-4 n: nnjw +17-18 p: bptpftnxjchrwthtppk +14-15 d: dddddddddddddddd +10-14 m: mmmwnmmgmdmmmmmmmmm +8-9 k: pkpqffpkktbgkbk +7-11 l: lllllllllqplllllllll +11-15 n: nnnzngknbnzdnsnnn +2-4 l: vbqm +10-11 w: wwwwwwwwwwq +3-5 x: xxtxxxxx +3-15 b: spbcxjlbbbrbbbbb +4-5 n: nvfsn +13-16 n: bppjnncnbgjndnnntwgs +1-8 t: mttttttttt +6-9 d: jvmssdkdhxsd +9-10 d: gdrllcfdnd +7-11 c: cscxccccnztccccz +15-16 p: pppppkphpppppspg +2-4 n: vnkjlwwsswscmxktnj +9-11 r: rrrrrkrzslr +7-10 t: tttgqtnttttttttt +4-10 b: bbrzbzpbsbnbbjnbsb +7-8 j: jlljxtsj +5-15 z: lzzzfqzzzzzqzzzzzz +10-11 r: rrrrrrrrrrcrrrr +6-8 t: tztpbttttt +2-9 c: vcgtfxfbr +9-16 r: vgjrwcxhrrhbzxnj +17-18 r: bczjtmjwrtzwvmgbrl +5-6 d: dqgddvd +1-2 r: krzrkr +8-9 j: rxjjjjgbj +8-9 c: cjccccccc +13-14 b: bbbbgbbbbbbbbvb +5-6 p: hbhwtp +1-2 w: wfhrfsfbjtpkqcjrwdb +10-13 q: qqqqqqqnqrqqzqq +3-4 m: xcmcz +11-15 d: dldddcddddjddqd +4-10 h: khhlhhhhhhhhhhhh +2-4 d: bdfpmxzqzbzmxmmwg +4-5 l: lgrbl +9-13 s: ssssssssfsssss +7-8 p: pplkpmkppppppxp +3-8 j: jjjjjjjj +7-8 f: jfffffhzfff +2-5 p: pppppppp +8-9 l: tlclllmlz +4-5 m: mtrmx +13-16 x: xxxxsxmxxxxvwxxw +5-8 n: jknnngnv +4-7 p: ppptppgpppp +12-15 r: rrrrrrrrrrrxrrrhr +2-9 s: sssssssssss +5-6 z: zphzzr +13-17 m: mmlmmsmzmsddbxmkb +5-7 g: gggggggg +8-9 f: ndzfvfkfz +2-10 g: wtngwdkcxgrth +6-13 r: rrqrrqrrqrrrcrrrr +1-6 z: hfzzzz +10-13 j: jjjjjjjjjjjjdj +5-11 m: wfqvmhbjhhnmzdlmpjc +6-8 d: clddzxcdghn +8-12 n: qfqbbvkpjbznrz +3-6 r: rrbrrrrrrx +9-10 r: rrrrrrrrrrr +4-5 m: chltmcm +7-8 r: rrrnprrzrhr +3-4 j: jfcj +16-17 n: nnnnnnnnnnnnnnnnwnnn +7-8 r: rrrrrrnfr +4-12 n: nnnnspnlcnmsnnnn +11-12 v: vvvvvvfvvvhvvv +2-8 h: hlhhkhhchhhghh +4-5 t: stntztttmp +3-5 v: vvvmbvhvvvlvn +9-14 x: srxmtbtgxgmqxxxc +4-5 z: zrlgz +10-11 p: phxkvklpmdp +8-15 m: mmmmmmmpmmmmmmm +1-13 h: mzwqkhhhphsgh +17-19 s: qssssmssgfmssmmpssk +6-8 b: bbbbbbbjbb +3-4 l: rllr +2-4 j: kvjj +2-5 n: lnnkrm +15-16 w: wwwkwwwwwwwwwwwc +1-3 c: ccncc +2-5 s: bhppmsttzcscss +1-4 t: tttxtttt +1-9 r: rfrrrbhtxrrbrmrmr +12-13 s: qplrssssmfswrsswss +2-4 h: zrhhhhzhzhch +1-5 g: rgjgg +11-14 t: ttttvftttttqlsttt +3-4 s: sskss +5-15 m: mmmmnmmmmmvmmmm +1-8 j: sjjjjjjj +1-4 c: ccclcc +5-7 d: ddddhdd +2-8 z: tczzjzzzzzzzgz +1-5 s: qsqdz +8-11 z: zhzpzrvzhzkzzgm +5-9 g: nvdfgshgbgltlqggbp +1-12 r: rrrrrrrrrrrrr +3-4 m: xmmb +8-10 j: jjjjdjmjshqjzk +2-4 t: tptttftt +4-13 t: ggqscfggftnxgjpn +4-12 q: hvzjzqsqwqjlqx +7-8 q: qqqlqqqkqq +9-10 f: ffffffffdfff +2-7 k: kgkkkkkk +7-11 t: xbpdkrtplmfbtkwgp +4-7 c: ccccccccc +12-14 d: dddddddddddqdddddd +6-7 k: xhnntkpnbkfwlr +3-5 q: qqxxq +13-17 d: ddddddddddddvddddd +2-3 g: smglpgpflsrbwxcjctb +5-9 z: zjzzznfzf +7-13 l: lmrkvvxtltcnj +15-16 r: vjrrrkzxrrrqrtrpzv +2-7 x: xsxxxxxx +7-14 m: npmnmgdvnqmgrmm +2-4 x: pxxl +7-15 k: nkkkckgwdkffkmb +7-11 n: dznnmcnssmcn +8-10 s: skssgswssmsss +14-16 n: nnnnnnnncdnjnnhwnnn +4-7 g: kggmgggbggggwggcqgng +4-7 g: gggqggggg +1-2 c: cccc +4-8 j: mzzvwjgrbrv +11-12 x: pksjnwlltskxlj +1-9 k: zfkkkksrkkkkkkz +1-6 k: xkkkkknkk +1-6 c: gccccncbccccc +14-15 h: hhhhhrhhgkhhhmhh +7-8 f: qffgnfhf +2-6 m: vmqwxzgsm +5-8 k: kkzjkwkvk +3-4 s: dcsss +2-4 p: jjbps +2-11 z: zjzzzzzzzzzz +4-7 f: bnkhvjfff +13-16 m: mmmmmmmmmmmmjmmmmmm +5-10 t: kdwjmcgtvtdttmtvw +3-12 j: jjljwjfjjjjjnhjjjjc +13-14 f: fffffflffxfffbf +2-6 m: zmhmsm +4-18 n: nnnvnnnnnhnnnfnnnhnn +3-6 n: xznnsnn +7-11 g: ggggpgggggggsg +6-8 l: llllltllll +4-5 s: ssnttsrs +6-14 w: wwwwwwwwwwwpwlwwww +9-12 q: pxqvswnqqbsqvgsd +1-4 j: mjjjjz +9-19 f: fffffffflfffffffffff +2-6 t: rttqtstct +6-9 d: dddddtddddd +7-12 l: lllllllllllllll +1-12 p: gppppppplpppppp +1-4 s: fslssssssfcd +6-7 v: wvvzffggdfvbvvv +2-7 t: kkwgspt +6-16 n: nncbnnnntwrxlzzwdrsj +3-4 z: zzszzhrqwngprjt +4-5 v: vkvvvcfjc +4-5 j: hcjtj +2-4 k: kqkkkkkkkksk +7-9 g: gzgmgpgkv +5-9 s: kjnwsrjrzssssdlnsqs +2-8 j: jtjxxgmjkjx +5-12 r: bfrcrtjkzqffsjtvwj +1-2 v: xvvvmvvvv +5-9 v: vzrgdldfvx +3-5 m: mqsfmmlmvdfj +12-15 v: wswvvbqqhlvqvwx +6-7 b: bbmjdhb +2-4 b: hbjmjr +6-7 n: pnnnnln +13-15 z: zzlgzpmztfzqzzl +5-6 c: pcppscccccc +6-7 z: zzzzzzz +6-14 l: lllllllllllllqllqlll +13-16 r: rrrrrwrrrrrrhrrr +11-12 r: rrrrhrvhqmqrwr +15-19 w: wwwwwwwwwwwwwwwwwwdw +3-6 w: wwqxkw +17-18 z: zzzzzzzzszzzzzzczvz +3-4 g: lgxx +4-5 x: nsdxdskjxtrz +11-12 w: wvdgqppfwwdf +2-3 w: qgrz +7-8 w: wwrppwfwwrcwr +2-6 n: gtspnngz +3-7 j: jjpjjjzjjjjj +1-2 l: pllblvgmfjvv +15-18 r: rrlgctrrrcrqqgldpr +3-6 v: vvvvvt +2-10 s: vslltcxpbg +5-8 j: blvzjtjnfmjnjtsrzmc +9-13 b: bbbbbbbbbbbbsb +3-4 w: wwfjw +6-7 x: xxxxxxmx +7-15 g: ggggggrgggggggfggg +16-18 f: zffffffffffffffwfff +3-4 q: qcqn +3-4 k: kvzqk +4-18 z: wpclkbsxwbmbmkdpzzcm +1-8 z: zkzzzzzgzzzzz +7-16 x: xxxxxxxxxxxxxxjkxxx +3-6 t: xwcjztz +8-9 r: rdrprrtrs +1-7 v: dvvvvvcvvd +6-8 t: tttttkttt +1-5 w: xzwww +6-7 c: ctdjbwcc +3-4 t: ttnttt +9-10 q: qmcqqqsqqqvqqq +11-12 d: dpftdmdmdmld +7-8 j: tbjmbjlj +3-6 t: tttttqtt +6-8 t: tdttthbnqt +2-5 q: qqqqp +1-3 t: ttht +13-17 n: nnnnnnnnnnnnnnnndnn +4-6 j: ftkvjj +5-10 c: hvccfcsccb +7-11 v: vmqvqnnnvzglvvvv +5-8 k: kkkkkksckkk +1-12 z: rzzzzzzzzzzzzzzzvzz +17-18 t: tttttmtttmttttttpttt +16-17 z: xljjnngmjmhprcqzw +4-11 d: dtddbpddlhn +17-18 t: tptttttttttttttttbtt +9-12 w: wwwwwwwwwwwcw +3-4 z: zdzj +1-8 q: qlqqkqqhqtqhxqbbwcp +6-8 r: rkrrlrrmzrcnnrk +13-17 b: dbsbbbbbbbsbmkbbb +5-16 q: gqnvqwwgqshmtrdbplfb +7-9 c: mcvccccczc +10-11 p: pppxppppppc +1-6 v: vvvvvmvvvvv +5-6 s: ssssks +6-14 r: prgrbvrjrgrkrrr +2-11 c: qbnxcvxgldcvdd +11-15 d: ddddddddddsddddd +13-14 w: rwwwwwwwwwwwwsw +12-15 t: ttttttttttttttt +5-8 g: skjgxsjpgvsgr +5-11 g: ggddglggxgqgg +2-4 c: cccc +2-3 h: rvdg +9-13 r: rrrrrrrrsrrrjrrr +2-7 f: dflmgzsdftgkgc +1-5 f: jffffffnfcff +3-4 c: cccrqc +2-7 m: kblcghm +3-4 r: rscrnbbpfkr +2-3 d: wdtqpd +5-6 q: qqqpqnqq +13-15 d: ddddsdddddddddjd +3-4 c: cmcw +2-7 q: qqqqqqjqqqqbqfqq +11-14 x: txxxxpxdxxkxqcv +10-11 b: bbbbbbbbbkbb +7-11 p: ppppppppppmpv +5-6 r: dnxrcvrrr +1-4 d: rdddddd +5-9 f: lxgfvffdf +8-16 k: vmfksjkwkrkkkhkkvknk +15-16 v: vvvvvqvvvvvvvvgv +2-5 p: xpctr +11-15 w: wfwwwwwkwwwwwpr +11-13 x: xxxxxxxlxrfxxs +18-19 b: bbbbbbbbbbqbbbbbbbb +2-4 l: fgwl +8-11 m: xmjnmmmmnmh +4-6 g: lgvpksgq +5-7 t: jtgtvttjlfhpljtzzstd +7-11 p: mjcgvcmxgqpntxkpb +2-3 r: rrgrrnr +6-7 r: rrrrrcr +4-14 d: dddjdddddddddpdddd +5-7 q: qqqqkqqqq +1-4 t: qttqt +4-10 f: hbfjbzrfgvffq +16-17 j: wjjwjwpsjjdvfjnhv +3-4 v: vvtwv +5-6 s: ssdswspdss +1-2 r: rnrrmskrr +4-7 h: rqxbjjhsfh +4-9 l: llllllllhl +4-6 w: sgtwwmcpwd +4-11 l: fjdllznlllmdnll +4-5 k: kkklk +4-6 s: sszrssssssss +12-14 w: wwwwwwwwwwwvwww +2-4 b: vnzb +7-18 g: ggggggggggggggggggg +1-13 s: srjdvvpqnrsnnkzfj +14-15 g: bmhbclmqcgtqxgg +8-12 g: gggfhxgglgzb +3-5 c: scrkcshctccmhm +7-12 q: qklqqqhqvxqqqqw +1-6 m: mlmxzwkmm +3-16 r: rswggrrrrczxfpjt +14-16 l: llldlblllqllllns +2-5 w: wwwwmw +7-9 r: rrrhrprrr +2-3 j: zjmdfcth +3-8 w: xwgwwwwww +1-5 l: plllllll +2-4 b: fbqp +2-3 p: jwpmp +3-4 c: kscm +2-5 b: mbpbnfkvh +4-15 m: qrswmmmgmvmfqtmrrn +12-15 r: rxrrrrrdrhpfrrrrcrrr +10-13 j: jjljjjjjjnjjjjj +8-20 w: gjccptmwtrwxjtskrdfp +11-14 j: jjjjjxjjjjgjjk +1-4 g: gggzzgg +4-8 q: wqqqqblsmsk +1-11 h: lhhhfhhhhbvhhtjwrbh +4-8 x: xlxqxxtxxxxx +13-14 x: xxxxsxxxxxxxqxxx +12-16 b: bxvbbbqbbbbfzbblb +1-4 j: jzbd +5-6 q: qqqqwqkkqqq +2-5 x: xxxxgx +8-10 n: nnnnnnnnnhn +5-10 m: mmmmrmmmmmmmm +2-3 c: qwcz +3-5 n: cckvz +18-19 q: qqqqqqlqtqqqqqqqjqv +5-13 k: kkpkkkkkkkkklkkk +5-10 q: jfjgqllmqzv +15-17 l: llllllllllllllhll +4-10 b: pgqbfrsnvbhzfmtbtw +1-4 c: mccc +6-16 f: fffffpfffffffcfffff +4-9 j: qjbjlcsgljtbvv +11-12 z: dstqbtxxvdchsg +3-8 d: jvdpnvqs +2-3 n: nfvnnnn +6-12 r: zdbfdrvtmpkrjkr +1-15 k: kbdckwtkfhvrbjk +6-8 v: fvhsvgcv +2-3 p: ppkppp +2-14 r: drclhnrdhtcbmnr +7-10 p: vchpmlpjfxbfnwsdxjr +1-3 v: lvvv +1-3 b: bbjbb +2-12 q: qmxbbbgqlscqvdtpq +7-9 l: lllllkllqlllclll +16-17 r: hrrrrrrrrrrrrrrrr +8-9 g: gggggggfg +6-8 v: zvqffmkv +9-12 t: tttttznttjtfrtsjxtd +5-12 q: bqhbltqnjlhqqhtkq +8-9 d: ddddddddkd +2-8 q: tvpqmrrq +13-16 q: qqqgmqqqqqsqmqqpqqqs +7-9 p: pppppplppp +4-6 h: hhxhlhhhxhp +6-8 g: gggggdggggg +4-5 j: jjjkjj +4-5 x: xxxfg +2-13 x: xxhrhxwbrgrdskghtkj +12-19 x: cxxxxxxxxxxhxxxxxxx +1-4 m: tmmmm +5-11 x: mgqnkjxxscxdxr +3-4 t: tttctt +4-13 b: bfkbfbbwbcbpvcbkdqww +5-7 d: dwddddqd +4-15 l: lvvlfclwbssvsdl +9-14 d: ndkfnddtdddfjpvdqt +8-9 s: ssssssssk +9-13 l: dlljknlsllbslhlml +4-5 n: lnnwn +8-12 v: rlvbqlwvfhvv +6-7 f: rcpfwfvffqfcpf +10-11 g: rnqgxbtnxqfzgggtn +8-11 d: ntdzzddkbdhcdddrgdld +5-6 s: xkmssxscvbpwj +1-3 r: rrmr +9-14 p: pvppppppppppppppp +11-15 t: vhftnbtmwpgbcvt +2-7 t: pmbwnrj +10-11 c: cccccccdcvcc +9-14 s: ssksssssssssslsss +2-5 t: ctrtqpn +4-6 t: mttjftttt +4-5 z: zfbzz +2-3 x: xwxlwstzmvvt +4-5 b: vbsbjwpbsbbb +3-4 x: cwxxlmdf +5-6 z: zzzqszzzzzz +1-4 c: ncczc +3-6 k: kkkkkkk +2-3 z: rjzkpxxdvzlzxjzz +8-10 z: fzjzszzdnzbzkzzfz +1-9 c: ccccxccjpccccc +3-12 j: jjjjjjjjjjjcj +10-14 l: llplllvbllllsp +8-12 r: hnrcrxfzrkcjcprrzjbr +17-20 q: qqkqqqqqqqqqqqqbqqqh +6-9 l: lllljlrlpxllllll +8-9 v: vzzmtwfgv +3-7 v: fqdbsshw +12-13 f: fwffnjfbfffzzqfxfffx +1-3 m: zjmdvjjg +5-7 r: nrswrlbw +8-11 c: crzfvzpcbcbchgxbln +9-17 g: ggggggzgwwjpggpgvgrk +6-9 k: hhkrvkkqfhqwbdb +10-16 q: mzzjqfmtkqwvgdfttj +11-13 m: mmmmmmmmmmtmm +1-2 j: jjhrrj +3-12 h: hhhhhhhhhhhhh +8-11 w: zwkrwznrppw +7-14 d: dpxjnddbvdbcllqr +5-8 c: ccccfcccccc +12-16 p: tnptbppgwxxpppjb +1-14 t: qktttttttttttttt +9-12 t: tttttcttgjtt +3-5 p: tcpdgwhrkxkzjjhvsgqp +13-14 k: kkkkkkkkkkkkklk +11-13 x: xxxxxxsxxxxxt +5-12 n: nxxnnznnnnmlnnn +12-14 h: hhlhhhhhhhzcnnhhhhkh +8-10 j: jbjbjmjvjj +6-9 c: ccccccccsc +5-12 j: jjjjjjjjjjjcj +1-2 f: fhffff +13-17 x: xnlxxxxsxxxxxxxxp +2-5 d: sddzn +2-4 q: qqqt +2-6 p: fmxfxnkp +9-11 k: nkdgncqkkgwjp +2-5 p: hpmgcfcmz +1-3 f: ffczf +5-9 r: rtrrprrrrrr +2-4 p: pnpprdn +9-11 l: ltllbllvllc +4-5 x: xxxmxxx +5-9 x: xxxxxxxxxx +16-20 b: hgcbhbbhbgbbdxhdgjwb +10-15 c: qcccpcccdcccccfccwcf +10-11 x: xndsgkwqpxb +15-17 f: wwbqxrffgfvffdmdffw +5-6 q: qqqhqvqqqq +3-4 h: hhhchc +7-9 x: xxxxxxxxgx +7-8 f: fmfflfgf +12-13 v: vvvvvvvvvvvcvvvv +3-7 g: gggbggsgg +1-5 w: wpswsggtw +3-5 h: hhhhkhhhhhdhw +6-7 w: wwwwwmwwwww +5-11 m: mfdmcwmlvpmfc +14-15 j: jjjjjjjjjjjjjjrjj +3-5 v: rvtvkdvqv +3-6 p: frppxpdpg +3-5 t: ttttrt +2-7 x: xxwxxkfxxxxxxxxxxgxr +6-8 k: kkkkkpkgkkkk +10-11 f: fffffpfffkfdf +11-12 g: gggghgnggflg +1-7 x: xxnxxxxkxx +3-4 h: rhhx +6-8 r: bcwrrrrrhrxmqgrhrzm +2-6 l: mpdlnnp +2-4 j: jbjjdhx +2-15 d: dfdddddddnddddfzddjd +5-12 h: gbngwvffshph +1-2 t: txcpth +14-15 f: ffffkfflfffffgf +8-9 b: bbbbbbpbj +5-6 f: zffhfz +8-15 j: qjjfrtjllqfjjcj +3-5 l: llxllll +10-15 z: tpdzhnzkzrtzrzzzrfrz +3-5 q: qqlqq +3-4 d: vmzddpm +8-11 c: cmvzlxtqxcvckxqm +2-13 r: drpppdsqsmvnlkjb +7-9 w: wwwwwwkww +3-6 s: svfspfnpzq +3-4 b: fqpbbbbzpgqf +2-4 s: smssm +8-9 q: qqqqqlqbq +4-7 s: stcssbw +15-16 k: kkkkkkkkkkkkkkkk +10-13 x: xxsxxzxzxxsxphxxxxx +4-5 p: drpsx +7-11 v: vvvvvvvvvvvvv +14-15 n: nnnnnnnnnpnnnbnn +5-8 k: blgkkkkc +12-16 g: ggggggggggvggggggg +1-8 c: cccccccdc +3-9 p: ppqppppppp +7-9 q: cxqqqbhqqzhjqv +1-12 m: mrkvwmmsjmkmw +2-4 s: xrrj +2-4 w: mbww +7-14 v: vvvvvvvvvvvvvbv +3-8 p: kppjprpxppb +4-10 n: znncndnnjncnrnkn +5-7 k: kktnkks +10-13 r: rrrrrrrrrrrrnr +1-6 k: kkkkkrvk +3-5 k: jhjzkbqsjwkxsvd +5-8 p: pcqpprckrp +2-5 f: fsjwf +6-9 l: jxhtplclr +4-13 x: gdxdcdmmxlfxxs +2-10 v: vvvrvvvvvhvvvvvvvv +11-12 v: wqnwrlvjsxvs +1-4 m: mfqm +3-5 d: bmddv +8-10 h: hbhhdhfchh +4-5 s: sssdb +2-3 l: lsll +10-11 k: kkkkdcpnkkgkk +6-8 r: vrrrrxrrrrr +3-4 s: gxsbfr +17-18 p: ptppppppbbpbprpcqpp +16-17 s: gpgwvvnjbdqpksnsd +5-10 f: gfkfzqflfzffvf +6-18 m: kxxfrxjmwmltdvxwmmb +5-6 d: ddntbd +11-15 b: bbbrbhbgbbltbbhb +6-7 r: krbrrrp +5-6 q: qqqqqkqqqqq +3-6 k: kfkmjt +8-10 d: drbwtrdshdbg +13-15 n: tqnprfnndhplcjn +2-4 w: wjwg +10-11 p: xprpnpvhppp +9-10 r: rrrrrrrrqrrr +2-8 w: wjwnwhwwwwwww +12-13 g: gggggggggggwggg +1-6 s: sssssss +1-9 k: xkkkkkkkkkkkkkv +2-4 c: ccccc +3-7 s: ftssfrm +12-13 k: kkkkkkkkbkksk +9-16 q: qqqmqbbqhzqwtlwqb +7-9 p: ppppppppdppp +4-6 b: pcvbvkhb +9-10 g: qmchkfggmgpqgxxgxq +2-9 t: sthtnttthtlsq +3-4 x: xxxx +8-14 s: ssssssssdssssssss +1-3 m: gmbmvbmqbxvm +10-15 s: sgwkdvnsswsszwrn +3-4 s: gmgs +5-11 f: fffffffffffffffff +7-9 v: vvfvsvzdhvv +4-8 l: lllllllpllllllllll +11-16 x: xxxplxxxxxpxxxxxxxxx +9-13 t: tdtftttjdtttc +9-13 g: rknsckngkvdxg +3-4 d: sdqwddmr +1-3 l: lljl +7-17 r: trhrpmrqswrmnrbrrhb +7-8 g: ghkxwgttgk +5-7 b: fbnbtbndb +6-7 v: vnxlvgv +1-6 t: txtkttg +2-13 n: ljnnnnlpsnscfnnnnnnf +4-11 b: bbbbbbbbbbfb +6-9 x: wxdkxxnnnx +2-4 w: wswww +5-13 j: jjsjjjjjjjjjkjjjj +1-4 f: fszhf +5-9 z: wzgfpzzzzjszfvfpwz +5-9 x: xxxxhxxxsx +15-17 b: bbbbbbbbbbbbbbkbqb +2-7 x: xvdmgxxwgxx +3-4 q: qqqq +6-7 m: mqmlltc +8-10 k: kkkfkhkkkpkkkk +2-6 n: cnxnts +1-6 s: gsssssssssscssss +1-9 n: bbvkmnkdn +2-5 p: nmlhpv +4-6 g: vnggdpgm +7-12 b: bbbbbbvwsbbbbbbbbbbx +2-3 b: lgbjjr +7-12 n: chqccgnwsznngz +4-6 v: nntkvvv +2-5 g: qkrjgkqgljh +1-5 f: rffffsfzxfjfzffff +15-16 z: zpzzzzzzzzzhzzkszz +3-4 l: lmflkl +7-8 f: fffvzxff +2-4 r: rrrgrrrr +12-14 w: tjwgwkkwwwwwwwwww +2-12 m: mzmkmmmmmhmmcmmmrmf +5-7 q: nfqbgqqqpqqgjq +1-4 r: ktpr +5-6 j: jjjgbj +9-13 d: ddpbdddwbbdmd +8-9 r: rphfrrrsrr +10-12 f: fffffffffffbffpff +5-12 b: xhbbcbbbbxtbbb +9-10 j: jjjjjjjjqjjj +3-4 q: qqqn +3-9 r: srrtqqprjmqgnp +2-3 c: gcqc +3-4 c: bclc +3-6 n: jnxhshghnnqncgncn +2-4 h: ckhh +9-12 t: tdjjqcdbtkbtmb +11-13 x: cxxkxbxktxxxkxxxpxxh +4-14 m: hjqmqjvqgjdjzsssdkm +6-12 r: rrrrrlrrrrrrrr +14-16 g: gngggggkfglzgggv +9-13 h: hvhhdzhhmhhhh +3-15 x: xxjxxxxxxxxxxxbxx +10-12 z: zzzzzzzzzpzzz +3-4 h: dnhv +13-14 g: gggggggggggggg +7-11 r: rrrrrrrrrrr +6-9 x: czxxlsxxx +3-5 h: hhchh +1-9 j: jjjjjgdjjjjjjjf +7-10 b: ctsbpxrvwbkbjklghnbn +10-11 g: gggggggggglg +1-7 x: xnpsxfm +9-10 q: xxxzqbpdqj +4-10 q: pqsqbqcvllfn +11-12 x: xxxkxxxxxxgxxxx +3-12 s: pstrsssntsssssbssj +9-12 s: wnsdfrtssllsfbsssccb +1-6 r: nrrrrmrc +11-13 k: kkskkkbkkkzkkk +4-5 h: hhhhshh +5-19 f: ffffffffffffffffffcf +3-4 z: zczzz +5-8 l: ghlllsllfw +3-9 g: ggpngglkkf +7-9 b: xwbbbhhbmgjhbbbhnbb +4-5 c: cjmgczcccpzqr +15-16 j: jqfqsnnvffpjjjqj +5-6 z: zzzztvws +3-7 t: tftxtvfzs +1-5 l: tlllll +5-18 n: nnnngnnnnnnnnnnnnnn +5-6 m: bchzqm +9-10 p: lmpsbqgzpxggltl +2-9 h: hqdpjwpxhg +4-6 n: nqbnbnknnzd +2-7 q: qbqqqvq +7-8 c: cccccclc +8-12 r: rrkrrrprvrcqnr +14-15 j: jkpjjnjjjwjjjjjjhjwj +7-9 s: stsstspsn +8-11 h: hhhhbhhhhjhhhh +5-6 d: dddtpdd \ No newline at end of file diff --git a/day02/sample.txt b/day02/sample.txt new file mode 100644 index 0000000..2eab335 --- /dev/null +++ b/day02/sample.txt @@ -0,0 +1,3 @@ +1-3 a: abcde +1-3 b: cdefg +2-9 c: ccccccccc \ No newline at end of file diff --git a/day02/solution.spec.ts b/day02/solution.spec.ts new file mode 100644 index 0000000..0716ad0 --- /dev/null +++ b/day02/solution.spec.ts @@ -0,0 +1,17 @@ +import { loader } from '../lib/loader' +import { findValidPasswords } from './findValidPasswords' + +const load = loader(2) +const sample = load('sample') +const input = load('input') + +describe('Day 2: Password Philosophy', () => { + describe('Part 1', () => { + it('should solve the sample', () => { + expect(findValidPasswords(sample)).toEqual(2) + }) + it('should solve', () => { + expect(findValidPasswords(input)).toEqual(424) + }) + }) +}) From e18faa0749c5408bb92814f6da1365d40424d154 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 2 Dec 2020 09:45:04 +0100 Subject: [PATCH 008/110] refactor: make password policy plugable --- day02/findValidPasswords.ts | 34 ++++++++++++++++++---------------- day02/solution.spec.ts | 6 +++--- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/day02/findValidPasswords.ts b/day02/findValidPasswords.ts index 4da6e29..ee88099 100644 --- a/day02/findValidPasswords.ts +++ b/day02/findValidPasswords.ts @@ -1,29 +1,31 @@ const policyAndPasswordsLine = new RegExp( - /^(?[0-9]+)-(?[0-9]+) (?[a-z]): (?[a-z]+)$/, + /^(?[0-9]+)-(?[0-9]+) (?[a-z]): (?[a-z]+)$/, ) -const containsChar = ( +type PasswordChecker = ( + password: string, + letter: string, + n1: number, + n2: number, +) => boolean + +export const oldPasswordChecker: PasswordChecker = ( s: string, char: string, min: number, max: number, -): boolean => { - const numChars = s.split('').filter((s) => s === char).length - return numChars >= min && numChars <= max -} +): boolean => + ((numChars: number) => numChars >= min && numChars <= max)( + s.split('').filter((s) => s === char).length, + ) -export const findValidPasswords = (policyAndPasswords: string[]): number => +export const findValidPasswords = (passwordChecker: PasswordChecker) => ( + policyAndPasswords: string[], +): number => policyAndPasswords.reduce((count, s) => { - const { minChars, maxChars, char, password } = + const { n1, n2, letter, password } = policyAndPasswordsLine.exec(s)?.groups ?? {} - if ( - containsChar( - password, - char, - parseInt(minChars, 10), - parseInt(maxChars, 10), - ) - ) + if (passwordChecker(password, letter, parseInt(n1, 10), parseInt(n2, 10))) return count + 1 return count }, 0) diff --git a/day02/solution.spec.ts b/day02/solution.spec.ts index 0716ad0..f90bb14 100644 --- a/day02/solution.spec.ts +++ b/day02/solution.spec.ts @@ -1,5 +1,5 @@ import { loader } from '../lib/loader' -import { findValidPasswords } from './findValidPasswords' +import { findValidPasswords, oldPasswordChecker } from './findValidPasswords' const load = loader(2) const sample = load('sample') @@ -8,10 +8,10 @@ const input = load('input') describe('Day 2: Password Philosophy', () => { describe('Part 1', () => { it('should solve the sample', () => { - expect(findValidPasswords(sample)).toEqual(2) + expect(findValidPasswords(oldPasswordChecker)(sample)).toEqual(2) }) it('should solve', () => { - expect(findValidPasswords(input)).toEqual(424) + expect(findValidPasswords(oldPasswordChecker)(input)).toEqual(424) }) }) }) From 3578e5694d4be867ff04cffe5495f3f5ff7917cd Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 2 Dec 2020 09:53:44 +0100 Subject: [PATCH 009/110] feat(day02): part 2 --- day02/findValidPasswords.ts | 30 ++++++++++++++++++++++++++---- day02/solution.spec.ts | 18 +++++++++++++++--- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/day02/findValidPasswords.ts b/day02/findValidPasswords.ts index ee88099..113cb29 100644 --- a/day02/findValidPasswords.ts +++ b/day02/findValidPasswords.ts @@ -9,16 +9,38 @@ type PasswordChecker = ( n2: number, ) => boolean -export const oldPasswordChecker: PasswordChecker = ( - s: string, - char: string, +/** + * indicates the lowest and highest number of times a given letter must appear for the password to be valid + */ +export const LegacyPasswordChecker: PasswordChecker = ( + password: string, + letter: string, min: number, max: number, ): boolean => ((numChars: number) => numChars >= min && numChars <= max)( - s.split('').filter((s) => s === char).length, + password.split('').filter((s) => s === letter).length, ) +/** + * describes two positions in the password, where 1 means the first character, + * 2 means the second character, and so on. + * (Be careful; Toboggan Corporate Policies have no concept of "index zero"!) + * Exactly one of these positions must contain the given letter. + * Other occurrences of the letter are irrelevant for the purposes of policy enforcement. + */ +export const TobogganPasswordChecker: PasswordChecker = ( + password: string, + letter: string, + pos1: number, + pos2: number, +): boolean => { + let count = 0 + if (password.charAt(pos1 - 1) === letter) count++ + if (password.charAt(pos2 - 1) === letter) count++ + return count === 1 +} + export const findValidPasswords = (passwordChecker: PasswordChecker) => ( policyAndPasswords: string[], ): number => diff --git a/day02/solution.spec.ts b/day02/solution.spec.ts index f90bb14..dce577c 100644 --- a/day02/solution.spec.ts +++ b/day02/solution.spec.ts @@ -1,5 +1,9 @@ import { loader } from '../lib/loader' -import { findValidPasswords, oldPasswordChecker } from './findValidPasswords' +import { + findValidPasswords, + LegacyPasswordChecker, + TobogganPasswordChecker, +} from './findValidPasswords' const load = loader(2) const sample = load('sample') @@ -8,10 +12,18 @@ const input = load('input') describe('Day 2: Password Philosophy', () => { describe('Part 1', () => { it('should solve the sample', () => { - expect(findValidPasswords(oldPasswordChecker)(sample)).toEqual(2) + expect(findValidPasswords(LegacyPasswordChecker)(sample)).toEqual(2) }) it('should solve', () => { - expect(findValidPasswords(oldPasswordChecker)(input)).toEqual(424) + expect(findValidPasswords(LegacyPasswordChecker)(input)).toEqual(424) + }) + }) + describe('Part 2', () => { + it('should solve the sample', () => { + expect(findValidPasswords(TobogganPasswordChecker)(sample)).toEqual(1) + }) + it('should solve', () => { + expect(findValidPasswords(TobogganPasswordChecker)(input)).toEqual(747) }) }) }) From 49c5735d782899899f0bdea02a3a54af032fc0ca Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Thu, 3 Dec 2020 08:05:08 +0100 Subject: [PATCH 010/110] feat(day03): solve sample --- day03/countTrees.ts | 20 +++ day03/input.txt | 323 +++++++++++++++++++++++++++++++++++++++++ day03/sample.txt | 11 ++ day03/solution.spec.ts | 29 ++++ 4 files changed, 383 insertions(+) create mode 100644 day03/countTrees.ts create mode 100644 day03/input.txt create mode 100644 day03/sample.txt create mode 100644 day03/solution.spec.ts diff --git a/day03/countTrees.ts b/day03/countTrees.ts new file mode 100644 index 0000000..bb263f6 --- /dev/null +++ b/day03/countTrees.ts @@ -0,0 +1,20 @@ +const tree = '#' + +export const countTrees = ({ + down, + right, +}: { + down: number + right: number +}) => (slopes: string[]): number => { + const width = slopes[0].length + let currentSlope = down, + currentIndex = right % width, + numTrees = 0 + do { + if (slopes[currentSlope][currentIndex] === tree) numTrees += 1 + currentSlope += down + currentIndex = (currentIndex + right) % width + } while (currentSlope < slopes.length) + return numTrees +} diff --git a/day03/input.txt b/day03/input.txt new file mode 100644 index 0000000..43deaca --- /dev/null +++ b/day03/input.txt @@ -0,0 +1,323 @@ +......#..##..#...#...#.###..... +#..#............#..........#... +..........#....#..........#.... +....#..#.#..........#..#.....#. +#.......#...#......#........### +#####........#.#....##..##..#.. +......#.#..#..#..##.#..#.##.... +.#..#.#..............##....##.. +..##......#....#........#...### +...#....#.#....#.#..#......#..# +..................#.....#.....# +#.#...#...#....#............#.# +.#...#.....#...##........#..... +...#....#........#..#....#..### +#...##.....##.#.#...........#.# +.###........#.#.#.........#.... +...#.............###.....#.#..# +.####.#..#....#.....#.........# +.#.#........#.#.....#.....#.... +.#.......#................##.## +...#.#..#...###.....#....#..##. +...#....##..#............##...# +#...#............######...#.##. +.........#........#.#...#..##.. +.....###..#.#.....##.#.#......# +..#.#...#.#..#.#.##..#.....#.#. +..#......#.#....#...#.......... +..#...#.....#.#...##.....#..... +.##...........####........##... +....#............#.#........... +.....####.........#.##....###.. +#..#..#.#..............#.#..... +...#.#........#.........#...... +......#.#.#...#.....#....#..... +........#.#...#####..#..#...... +.....#.#....#....#...........## +.#...#.........#.......##...... +.#.##..##......#............... +...#.....#.......#.#.#......... +.........#..#...#...#.#.##....# +.#......##....#..#.........#... +....#.....#........#.........## +......#...........##........... +.....#..............###.#....#. +........#..#...#..#..#..#..#.#. +.#.....#.##.#..#..#.#.....#.... +...#....#...#.#.....##.#...#..# +#..#......#..#.###...........#. +.##...##.#........#.#......#.#. +...#.#..#.#.......#..###...##.. +#.......#.#....#..........#.... +.#.....#..#.#.#..#..#........#. +.#...#......#.#...#.##.....#.## +...######..#.#....#.........##. +#.#.......................#.... +..#..##...#...#.#..##.......#.. +.##..#.......##......##.#..#... +#.#....##.......#..#........... +..#...#............#..#........ +........#.#.........#...#..#..# +.#...###...............##...#.. +...........#.....#....#....###. +#..#....##..#................## +...#.#..#..##......#....##....# +...#.##...#....#..#....#....... +#...##..##.#.........#...#....# +.##........###.#..........#.... +..#..#..#...#.##..#.#......#... +.......##..#....###.##.....#..# +#....#...#.#.....#..###....##.. +.#.......#.........#....#.#..#. +.........#.......#.#.......#... +..........#...##..#...#....#.## +..#........#.......#........... +#....#.....##......#....#.#...# +......#.....#....#.....#..#.... +.#....##...#...##.............. +..#....#......#...#....#...#... +#....###...##..#.#....##......# +..#.......#.........#..#......# +...#...#.##.......#....##..#... +..#.#...#.##..#..#..#...#.#...# +.#.........###....#....#.....#. +.#.##.#..##..#...........#....# +....##..#..##.#.......#....#..# +....#..#.........##..#......#.# +..........#.#.#....##.#......## +.##...#....###...#..........#.. +#..#.....#..#.#.#.#..#......#.# +......#....#......##.#......#.# +...#.....#.......#....#.......# +.#.#................#.......... +......#..#..#...............##. +##......#...#.####....#.#.#.... +...#..##............#....#..... +..#..#.#...#..................# +.##.#.#..##.###.....#..#....... +..#...#.#...#......#..#........ +.###..........##...###..##..#.. +#.#...#........#.......##...... +..##...#........#....##...##... +.......#.##.....#.#.##..#..##.. +........#............#....##... +...#.#.#..#.........#.#.......# +..#..##.##...#.##...#....#...#. +.....##.#...##............##... +.#...#.###....#.......#...#...# +.......#######.#....#.....#.#.. +......#.......#............##.. +.....#...........#......#.....# +........#....#.##.#............ +.#........#.......##.#.#....#.. +#.....#..####.#................ +.....#.......................## +.#.....#..##.#..##........#.#.# +#...##....#..##................ +......##.###..........#.....#.. +.#........#...#..............## +..#..........###.........#..... +....#.....##....#..#..#.#.#.... +....#.......#.##...#.####.#.... +#........#............#.##..... +..#......##.....#..#...#....... +..#......###...#.##......#..#.. +#..#..#............#..#.###.... +...##.........#..##...#..#.#... +..#.###..#.##.#........#..#.... +......#..###.#........#........ +.#....#.#..#.....#..#..#....... +#.....##.##...#...###.#.#..#.#. +.#....#..#.........#..#....###. +......##.####...#....#........# +##..#........#..#..##...#...... +#.........#.........#...#..#.#. +..........#...................# +###....#....#....#......###...# +#....##........#..###.#..#..... +.#......#.....#.#.........#..#. +...#.......##.....#.........### +..............#........#.....## +....#.#..#.....###.#....##..... +.........#..##.#....#.#........ +...#....#.......#.#.#..#.#....# +...........#...#..........#.#.. +#.................##........### +####..#.#..#...#.....###....... +..#.#......##.#.......#........ +.......##........#..#.....#..#. +...#..#......#..#.#.......###.. +#....#...##..#.#.#.#.........#. +....#....#....#.#..#..........# +...###........#.#.###......##.. +................#.....#.#...##. +..#..#.###...........#...###.#. +.........................#..#.# +#...#..#..##.###.....##.##.#... +...#..................#.#....#. +......#..##.#.......#.......#.. +.##....#.#................#.... +.#...#..#.#.#....##....#....... +.##......#.....#..........#.... +..#...........#..##.........#.. +....#.#...........#..........## +....#.#.#...........#.#........ +......#.....#..#....##....##... +............##...##......#.#.## +#.#.....#..#....#..#...#.#...#. +.#...###..#..#.......#.......#. +.....#..#.##.....#....#...#.... +##.....#..##.......##..#.#.#..# +....#.#......##....#.....#..### +.#...#.#......#.##...#..##..... +.#...#...#......##..#..#...#.#. +.#.........#....##...###...##.. +###.....#......####.....#.#.... +.....#..##.##................#. +.#.................#...#..##.#. +....#....#..#.......#.....#.... +.##....#..#..#.....###.#..#..#. +#.#.......#.....##...#.....#... +#.#........#.#.###...#....#.... +.#.....#.....##.#...#..#....... +..###.#............#...##.###.. +.....#.....#..#..##............ +.#.#..#.#..##..#....#...##..... +.#...........#..#.......#...#.# +#.#.#.#.....##....#............ +...#.................#.#......# +.....##.............#...#.#.... +.##......#.#....#..........#.#. +.#.##.......##...#...#.....#.#. +#...#.#........#......##....#.# +#....##....#....#...#..#..#.#.# +......#..........#...#.....#..# +#..#....#....#..##.#..#.#...#.. +......#..#.#....#.....#.#..#..# +...#.#...###........#.#......## +..#............................ +...#.#..##...##...#...#......## +...#.####......#.........#....# +.#...#.#...##....#......#.#.... +.#.....##..##.#................ +.#...............#............. +......#.....#...#..##..##...... +...#..##.......#.......#..#.#.# +......##.....#..#.....#...#.#.# +........##........#.#........## +.#....#.....###..#.......#...#. +#...#....#.........#.......#... +...##..#........#####.#........ +###..#....#.#..#...#.####...... +..#..........#.#.............#. +#......#.#....#.#.#....#.##.... +.#.#.#.............#....#...#.. +......#.....#.#...#..###.#..#.. +.....#..#............#...#...## +..#......###..#........#.#..... +#..##......#.#.#.#...........#. +#..#...##.##.....#....#..#..... +...##.#..........#.#....#...#.. +.#.#.#.#..#.#...#......#....... +....#......###.#............... +.........#...#....#...#.#....#. +##.#.........#...##............ +........#..........#.#...#..... +..#........#....#.......#...... +#..#...............#..#...##.#. +#........#.....##.#..#....#...# +..##....#....#.#...........##.. +....#.#.........#..#.....#..#.. +.......##....#.#.#....###.#.... +......#....#.#...#..#.........# +.....##..#....#.#......#.#.#... +#.##..##.#.......#..#...##.#.## +........#.#..#...##.#.#..#..... +#..#......#......#...#.#..#.... +.....#......#.#....##....##.... +....#.##...##..#..........##.#. +.#....#.......#.........#...... +.#.......#.#...#............... +....#.##.......#.##..#.##..#... +#..#.......#.....#..#.......... +..#.##.......#....#.#..##..#... +.#.....#...##.#.#..#...#....... +.......#.........#......#.#.... +#.##.....##.......#....#....... +##.#.#.........##..#.....#....# +....#.#.#.#....#..#..##.......# +#...#...........#.#............ +...#...#.#..#..##.............. +......#.......#.........#..#.#. +#.....##.#....#...#..#......... +#...#..###.##..###...##.....#.. +#....#.#.#...#.#..........#.... +................#.#....#.....## +#.##..............####.....#.## +................#.....#........ +#...#..#......#.....#......#... +.........##...........#...#...# +#.#....#...##.....#.....#..#..# +.....#...##..##.............#.. +....###.#.......#.........#...# +..#.......#......#..#...#.#.... +#.#....#......#.##....#.##.#... +.#.#...#.......#.#...#.##..#... +..........#......#.....#....... +........#...#.....#...##...#.#. +.....##....#.##..#........#.##. +..........##.....#..#........#. +.#....#..#.......#.##.......... +.#..#..#...#...#........#.##... +.#...#.##.......#...#........#. +.....#....#.............#..#... +...#....##...#...#.....##...... +#.#####.........##...#.....#... +......#.......#....#.....#..#.. +..#..............#.#..#..#..... +....#.................#...#.... +###.#..##.#....#...#.#......#.# +..##......#.#........#.#...##.. +.....#...#...#..#.#..#..##..#.. +.##...#......#...#...##.#...#.. +.......###.#...........##.##... +.#.##..#.#.###.......#..##...#. +..#....#.......#..##......#.... +.#....#.#..#..#.#.#....#...#... +..........##....#....#.#....... +.....#.......#.#..###.#.###.... +.#.#....#.##..#.#..#.....#.#.#. +....#.....#.#.#............#... +.###....#...##......##..###..#. +...#.#..#.....#...#....##..#... +.#.#....#..........#...##.....# +#.....##...#........#.#..##..#. +.......#....#.#..........#...#. +.........#..#.#.###.........##. +..................#.#....#....# +....#....#.#..#.......###.##.## +....#...#.................#.... +...#..#####.......#.#..##.##... +##.#....#...............#..#... +....#..........#...........#.#. +..##.#.##.#..#.#....#.......... +.....#....#....##.#....#....#.# +.......#..##.....###...#....#.# +.#.......#..#.#.#...........#.. +.#...........##.#.##....#.#.... +....#.#....#.#.#......##....... +.........##......#.#.....###... +........#.#...#.##.....#.##.##. +##.#..##.#.........#....#...... +.#.#.#....#..........#.#....#.. +....###.........#.#.#.......... +#..#....##.....#............... +#.##....#.#...#.....#......#.#. +............#.##........#...... +.....#.#.....##..##............ +.##..........#.......#......#.. +...##..##......#.....#..#....## +.##.##...#.................##.. +#....#.#........#..#....#..##.# +....##..##......#....###.#.#..# +.....#....#..#..#...##...#...#. \ No newline at end of file diff --git a/day03/sample.txt b/day03/sample.txt new file mode 100644 index 0000000..8f551de --- /dev/null +++ b/day03/sample.txt @@ -0,0 +1,11 @@ +..##....... +#...#...#.. +.#....#..#. +..#.#...#.# +.#...##..#. +..#.##..... +.#.#.#....# +.#........# +#.##...#... +#...##....# +.#..#...#.# \ No newline at end of file diff --git a/day03/solution.spec.ts b/day03/solution.spec.ts new file mode 100644 index 0000000..e90b369 --- /dev/null +++ b/day03/solution.spec.ts @@ -0,0 +1,29 @@ +import { loader } from '../lib/loader' +import { countTrees } from './countTrees' + +const load = loader(3) +const sample = load('sample') +const input = load('input') + +describe('Day 3: Toboggan Trajectory', () => { + describe('Part 1', () => { + it('should solve the sample', () => { + expect(countTrees({ down: 1, right: 3 })(sample)).toEqual(7) + }) + /* + it('should solve', () => { + expect(countTrees(3,1)(input)).toEqual(424) + }) + */ + }) + /* + describe('Part 2', () => { + it('should solve the sample', () => { + expect(countTrees(3,1)(sample)).toEqual(1) + }) + it('should solve', () => { + expect(countTrees(3,1)(input)).toEqual(747) + }) + }) + */ +}) From 9d1ecba3a5182538d2175916d60352a7ebfd1ebd Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Thu, 3 Dec 2020 08:06:02 +0100 Subject: [PATCH 011/110] feat(day03): solve part 1 --- day03/solution.spec.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/day03/solution.spec.ts b/day03/solution.spec.ts index e90b369..4f644c3 100644 --- a/day03/solution.spec.ts +++ b/day03/solution.spec.ts @@ -10,11 +10,9 @@ describe('Day 3: Toboggan Trajectory', () => { it('should solve the sample', () => { expect(countTrees({ down: 1, right: 3 })(sample)).toEqual(7) }) - /* it('should solve', () => { - expect(countTrees(3,1)(input)).toEqual(424) + expect(countTrees({ down: 1, right: 3 })(input)).toEqual(274) }) - */ }) /* describe('Part 2', () => { From 35399d225fc4b156ce29119272204e7dc5b3a02e Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Thu, 3 Dec 2020 08:10:13 +0100 Subject: [PATCH 012/110] feat(day03): solve part 2 --- day03/solution.spec.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/day03/solution.spec.ts b/day03/solution.spec.ts index 4f644c3..6596f9b 100644 --- a/day03/solution.spec.ts +++ b/day03/solution.spec.ts @@ -14,14 +14,24 @@ describe('Day 3: Toboggan Trajectory', () => { expect(countTrees({ down: 1, right: 3 })(input)).toEqual(274) }) }) - /* describe('Part 2', () => { + const slopes = [ + { right: 1, down: 1 }, + { right: 3, down: 1 }, + { right: 5, down: 1 }, + { right: 7, down: 1 }, + { right: 1, down: 2 }, + ] + const mul = (prod: number, n: number) => prod * n it('should solve the sample', () => { - expect(countTrees(3,1)(sample)).toEqual(1) + expect(slopes.map((s) => countTrees(s)(sample)).reduce(mul, 1)).toEqual( + 336, + ) }) it('should solve', () => { - expect(countTrees(3,1)(input)).toEqual(747) + expect(slopes.map((s) => countTrees(s)(input)).reduce(mul, 1)).toEqual( + 6050183040, + ) }) }) - */ }) From 500d9d52ca1985b25e0750b16ed1e535ddb2228b Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 4 Dec 2020 07:57:07 +0100 Subject: [PATCH 013/110] feat(day04): implement passport validation for step 1 --- day04/validatePassport.spec.ts | 56 ++++++++++++++++++++++++++++++++++ day04/validatePassport.ts | 15 +++++++++ 2 files changed, 71 insertions(+) create mode 100644 day04/validatePassport.spec.ts create mode 100644 day04/validatePassport.ts diff --git a/day04/validatePassport.spec.ts b/day04/validatePassport.spec.ts new file mode 100644 index 0000000..9861ee0 --- /dev/null +++ b/day04/validatePassport.spec.ts @@ -0,0 +1,56 @@ +import { validatePassport } from './validatePassport' + +describe('validatePassport', () => { + it.each([ + [ + { + ecl: 'gry', + pid: '860033327', + eyr: '2020', + hcl: '#fffffd', + byr: '1937', + iyr: '2017', + cid: '147', + hgt: '183cm', + }, + true, // all eight fields are present + ], + [ + { + iyr: '2013', + ecl: 'amb', + cid: '350', + eyr: '2023', + pid: '028048884', + hcl: '#cfa07d', + byr: '1929', + }, + false, // missing hgt + ], + [ + { + hcl: '#ae17e1', + iyr: '2013', + eyr: '2024', + ecl: 'brn', + pid: '760753108', + byr: '1931', + hgt: '179cm', + }, + true, // temporarily ignore missing cid fields + ], + [ + { + hcl: '#cfa07d', + eyr: '2025', + pid: '166559648', + iyr: '2011', + ecl: 'brn', + hgt: '59in', + }, + false, // Missing cid is fine, but missing any other field is not, so this passport is invalid. + ], + ])('passport %s validity is %s', (passport, valid) => + expect(validatePassport(passport)).toEqual(valid), + ) +}) diff --git a/day04/validatePassport.ts b/day04/validatePassport.ts new file mode 100644 index 0000000..9c185c3 --- /dev/null +++ b/day04/validatePassport.ts @@ -0,0 +1,15 @@ +/** + * Validate a passport. + * cid field is optional + */ +export const validatePassport = (p: Record): boolean => { + if (!('ecl' in p)) return false + if (!('pid' in p)) return false + if (!('eyr' in p)) return false + if (!('hcl' in p)) return false + if (!('byr' in p)) return false + if (!('iyr' in p)) return false + // if (!('cid' in p)) return false + if (!('hgt' in p)) return false + return true +} From a097577290f6b9a4ecc776b0a16b32fd553b7150 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 4 Dec 2020 09:08:15 +0100 Subject: [PATCH 014/110] feat(day04): implement password list parser --- day04/parsePassportList.spec.ts | 47 +++++++++++++++++++++++++++++++++ day04/parsePassportList.ts | 18 +++++++++++++ day04/sample.txt | 13 +++++++++ lib/loader.ts | 2 +- 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 day04/parsePassportList.spec.ts create mode 100644 day04/parsePassportList.ts create mode 100644 day04/sample.txt diff --git a/day04/parsePassportList.spec.ts b/day04/parsePassportList.spec.ts new file mode 100644 index 0000000..8de735d --- /dev/null +++ b/day04/parsePassportList.spec.ts @@ -0,0 +1,47 @@ +import { loader } from '../lib/loader' +import { parsePassportList } from './parsePassportList' + +const load = loader(4) +const sample = load('sample') + +describe('parsePassportList', () => { + it('should parse the sample', () => + expect(parsePassportList(sample)).toEqual([ + { + ecl: 'gry', + pid: '860033327', + eyr: '2020', + hcl: '#fffffd', + byr: '1937', + iyr: '2017', + cid: '147', + hgt: '183cm', + }, + { + iyr: '2013', + ecl: 'amb', + cid: '350', + eyr: '2023', + pid: '028048884', + hcl: '#cfa07d', + byr: '1929', + }, + { + hcl: '#ae17e1', + iyr: '2013', + eyr: '2024', + ecl: 'brn', + pid: '760753108', + byr: '1931', + hgt: '179cm', + }, + { + hcl: '#cfa07d', + eyr: '2025', + pid: '166559648', + iyr: '2011', + ecl: 'brn', + hgt: '59in', + }, + ])) +}) diff --git a/day04/parsePassportList.ts b/day04/parsePassportList.ts new file mode 100644 index 0000000..ef7d95e --- /dev/null +++ b/day04/parsePassportList.ts @@ -0,0 +1,18 @@ +export const parsePassportList = (input: string[]): Record[] => + input.reduce( + (list, line) => { + if (line.length === 0) list.push({}) + list[list.length - 1] = { + ...list[list.length - 1], + ...line.split(' ').reduce( + (props, entry) => ({ + ...props, + [entry.split(':')[0]]: entry.split(':')[1], + }), + {}, + ), + } + return list + }, + [{}], + ) diff --git a/day04/sample.txt b/day04/sample.txt new file mode 100644 index 0000000..3b38741 --- /dev/null +++ b/day04/sample.txt @@ -0,0 +1,13 @@ +ecl:gry pid:860033327 eyr:2020 hcl:#fffffd +byr:1937 iyr:2017 cid:147 hgt:183cm + +iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884 +hcl:#cfa07d byr:1929 + +hcl:#ae17e1 iyr:2013 +eyr:2024 +ecl:brn pid:760753108 byr:1931 +hgt:179cm + +hcl:#cfa07d eyr:2025 pid:166559648 +iyr:2011 ecl:brn hgt:59in \ No newline at end of file diff --git a/lib/loader.ts b/lib/loader.ts index 5dfe393..f2142ce 100644 --- a/lib/loader.ts +++ b/lib/loader.ts @@ -11,6 +11,6 @@ export const loader = (day: number) => (file: string): string[] => ), 'utf-8', ) + .trim() .split('\n') .map((s) => s.trim()) - .filter((s) => s.length > 0) From 38036afbeb060e76c6d508a68f22004b0e317fd2 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 4 Dec 2020 09:11:15 +0100 Subject: [PATCH 015/110] feat(day04): part 1 --- day04/input.txt | 1121 ++++++++++++++++++++++++++++++++++++++++ day04/solution.spec.ts | 20 + 2 files changed, 1141 insertions(+) create mode 100644 day04/input.txt create mode 100644 day04/solution.spec.ts diff --git a/day04/input.txt b/day04/input.txt new file mode 100644 index 0000000..9b04221 --- /dev/null +++ b/day04/input.txt @@ -0,0 +1,1121 @@ +eyr:2024 pid:662406624 hcl:#cfa07d byr:1947 iyr:2015 ecl:amb hgt:150cm + +iyr:2013 byr:1997 hgt:182cm hcl:#ceb3a1 +eyr:2027 +ecl:gry cid:102 pid:018128535 + +hgt:61in iyr:2014 pid:916315544 hcl:#733820 ecl:oth + +hcl:#a97842 +eyr:2026 byr:1980 ecl:grn pid:726519569 hgt:184cm cid:132 iyr:2011 + +ecl:grn hcl:#6b5442 pid:619743219 cid:69 hgt:176cm eyr:2027 iyr:2012 +byr:1980 + +ecl:brn byr:1969 iyr:2014 +hgt:164cm eyr:2020 pid:982796633 hcl:#602927 + +ecl:gmt +iyr:1987 eyr:2039 pid:15115163 byr:2006 +hcl:bfab0d + +cid:117 +hcl:#efcc98 +iyr:2010 pid:322719183 +hgt:176cm +eyr:2020 +byr:1957 +ecl:brn + +byr:1954 hgt:178cm hcl:#38f7fd pid:838813262 ecl:blu +eyr:2029 iyr:2019 + +eyr:2023 ecl:amb iyr:2020 byr:1927 pid:242570886 hcl:#18171d hgt:192cm + +iyr:1990 cid:295 hgt:131 pid:187cm byr:2014 +ecl:xry hcl:z +eyr:1928 + +ecl:hzl +byr:1953 +eyr:2023 hcl:#866857 +hgt:181cm iyr:2010 pid:568185567 + +byr:2030 hcl:#fffffd ecl:#a4a596 hgt:168cm +iyr:1936 eyr:2020 cid:296 pid:168786676 + +byr:2030 iyr:2026 eyr:1974 hcl:7fcaa5 ecl:utc +pid:190cm +hgt:67cm + +byr:2023 eyr:2037 hgt:59cm +ecl:lzr hcl:z iyr:2026 pid:#ea9083 + +byr:2003 hcl:z hgt:91 iyr:1990 eyr:2024 ecl:#123d73 +pid:48494230 + +byr:2022 eyr:2020 iyr:2030 ecl:gmt +hgt:191cm pid:3509331253 hcl:#888785 + +iyr:1994 +ecl:#c3d564 byr:2009 +hgt:162cm hcl:336498 pid:#e99d09 +cid:288 +eyr:1921 + +byr:1924 cid:290 iyr:2010 ecl:amb eyr:2020 +hgt:156cm hcl:#7d3b0c pid:795497164 + +cid:301 iyr:2017 hgt:67cm +hcl:#888785 ecl:#0405b9 byr:1964 pid:707857518 eyr:1976 + +ecl:gry pid:474303066 +iyr:2011 hcl:#18171d hgt:165cm byr:1921 eyr:2024 + +hcl:#6b5442 ecl:amb iyr:2020 hgt:191cm +byr:1949 cid:301 +pid:075846582 eyr:2029 + +hcl:#a97842 cid:186 iyr:2014 +ecl:gry +hgt:191cm eyr:2023 pid:645548969 +byr:1956 + +pid:154cm hcl:z ecl:gmt iyr:1989 hgt:69in cid:53 byr:2010 + +hgt:72cm byr:2023 +eyr:2034 hcl:z ecl:#f5249e iyr:1997 pid:#79af7a + +eyr:2038 byr:2015 +hgt:70cm ecl:grt hcl:9d58a1 iyr:1926 pid:6290928420 + +pid:620857794 eyr:2022 +byr:1950 +hgt:159cm +hcl:#ceb3a1 ecl:amb iyr:2015 + +eyr:1954 ecl:#ab2ce4 pid:#14eedd +iyr:2009 +hcl:29e484 +byr:2022 hgt:73cm + +hgt:59cm byr:2026 cid:245 iyr:2020 +eyr:2029 pid:073943129 ecl:hzl +hcl:#b6652a + +iyr:2014 byr:2015 hcl:#a97842 eyr:2029 +pid:#132098 +hgt:150 ecl:oth + +hgt:151in ecl:#967d49 eyr:2026 hcl:#18171d +pid:384230726 byr:1934 +iyr:2018 + +iyr:2020 eyr:2021 byr:1937 pid:735047371 cid:159 ecl:blu hgt:177cm hcl:#22b774 + +ecl:brn hcl:#6b5442 pid:117807698 cid:105 iyr:2016 byr:1977 hgt:183cm + +ecl:hzl hcl:#6b5442 byr:1933 +iyr:2019 pid:348486702 +eyr:2020 hgt:193cm + +byr:1928 +ecl:gry +eyr:2028 hcl:#fffffd pid:571149069 +iyr:2012 hgt:175cm + +pid:359108298 +eyr:2027 hgt:158cm ecl:amb iyr:2016 +hcl:#602927 + +iyr:2027 byr:2015 +hgt:191in pid:102033301 ecl:xry +eyr:2031 hcl:#602927 + +ecl:oth cid:163 hcl:z iyr:2014 +byr:1944 hgt:173cm +eyr:2027 pid:#0524c1 + +ecl:brn +byr:2030 hgt:71cm eyr:1931 cid:165 iyr:2010 hcl:#cfa07d +pid:509642098 + +hgt:166 iyr:2020 cid:308 +eyr:2022 pid:950463527 +byr:2017 +hcl:z + +ecl:amb +eyr:2023 byr:1924 +pid:901038027 hgt:70in +iyr:2010 hcl:z + +byr:1972 +iyr:2013 +hcl:d669ad hgt:64cm cid:247 ecl:#19aa26 eyr:2023 + +hgt:71 hcl:#fffffd +byr:1976 cid:108 eyr:2038 +ecl:grt iyr:2018 pid:190cm + +iyr:2017 +byr:1963 ecl:grn hgt:175cm +pid:160915270 eyr:2028 hcl:#cfa07d + +pid:569740130 hgt:171cm hcl:#733820 +ecl:gry eyr:2024 iyr:2020 byr:1973 + +byr:1937 +iyr:2016 ecl:gry hgt:181cm pid:521705827 hcl:#b6652a eyr:2027 cid:295 + +hgt:156cm ecl:blu iyr:2019 hcl:#866857 +pid:662418718 byr:2000 eyr:2024 + +byr:1971 pid:693616099 +hcl:#efcc98 +hgt:175cm iyr:2016 ecl:gry +eyr:2023 + +iyr:2013 +eyr:2024 +ecl:gry +pid:414295491 byr:1986 +hgt:188cm hcl:#b6652a + +eyr:2022 byr:1975 iyr:2020 +ecl:grn cid:68 hcl:#a97842 +hgt:151cm pid:229803943 + +cid:258 iyr:2012 +ecl:hzl +byr:2001 +eyr:2021 +hcl:#866857 pid:990590217 hgt:172cm + +cid:339 byr:1957 hcl:#866857 pid:343480061 eyr:2039 +hgt:191cm +iyr:2021 +ecl:utc + +cid:281 hcl:z ecl:blu +byr:2020 pid:132694306 eyr:2020 iyr:1953 + +hcl:#602927 +byr:1933 eyr:2028 +hgt:165cm ecl:gry iyr:2018 pid:658484617 + +ecl:oth +hgt:188cm cid:110 pid:056975690 iyr:2016 byr:1950 eyr:2023 hcl:#cfa07d + +cid:342 hcl:#fffffd eyr:2024 +pid:153555359 byr:1974 +ecl:gry hgt:191cm iyr:2020 + +byr:2019 ecl:#160ed3 eyr:1999 hcl:z +cid:146 pid:195693972 hgt:159cm + +iyr:2015 eyr:2030 hgt:191cm byr:1979 +ecl:#ec4873 pid:994113786 hcl:#cfa07d + +pid:552331609 +ecl:grn +hgt:171cm eyr:2022 hcl:#b6652a +iyr:2020 byr:1931 + +hgt:177cm iyr:2010 pid:934058099 +eyr:2020 +ecl:blu +byr:1967 +cid:112 hcl:#7d3b0c + +iyr:2028 +hgt:138 +cid:180 hcl:z +eyr:2022 pid:3286566621 byr:2002 + +eyr:2020 +iyr:2019 +hcl:#a97842 pid:149148750 ecl:brn hgt:159cm +byr:1981 cid:339 + +cid:344 +eyr:2021 byr:1968 pid:777786047 +ecl:grn hgt:192cm hcl:#888785 +iyr:2015 + +hgt:173cm +eyr:2030 +hcl:#733820 pid:610226642 byr:1954 cid:80 +iyr:2013 ecl:blu + +byr:1999 eyr:2023 +ecl:amb pid:912145128 +hgt:181cm +iyr:2015 hcl:#a97842 + +eyr:2027 hgt:188cm +pid:080715145 hcl:#341e13 iyr:2013 +ecl:oth +byr:1965 + +hgt:170cm byr:1950 iyr:2013 +pid:010541784 +eyr:2027 ecl:zzz +hcl:a3bae8 + +hgt:190cm eyr:2024 ecl:#6dcedc pid:909319684 +iyr:2011 byr:1959 hcl:z cid:182 + +eyr:2028 +iyr:2016 hcl:#623a2f pid:208417572 byr:1929 cid:137 ecl:hzl +hgt:167cm + +hcl:#6b5442 +ecl:grn +byr:1938 +eyr:2023 cid:307 +hgt:59in iyr:2014 pid:205268145 + +pid:047489285 eyr:2026 +hcl:#b6652a byr:1920 +iyr:2015 +hgt:183cm ecl:gry + +ecl:blu hcl:#508e8b iyr:2016 eyr:1954 hgt:151cm pid:086752750 byr:1920 + +iyr:2011 byr:1981 hgt:186cm +cid:117 hcl:#6b5442 ecl:amb +pid:756830713 eyr:2026 + +eyr:2037 pid:364464758 hcl:z ecl:grn +hgt:112 iyr:2013 byr:2022 + +ecl:hzl +cid:65 pid:679487194 +byr:1986 hgt:169cm hcl:#cfa07d eyr:2025 iyr:2013 + +cid:192 +byr:1921 pid:#5fe831 ecl:#fbb2b9 hgt:62cm eyr:1971 iyr:2024 +hcl:z + +hcl:#cfa07d eyr:2026 +hgt:74in +iyr:2019 +ecl:xry +pid:622690982 byr:1982 + +eyr:2026 pid:523515724 iyr:2013 byr:1973 hgt:167cm +ecl:grn hcl:#866857 + +byr:2009 +eyr:1985 pid:484497014 ecl:#0bfcf2 iyr:1992 cid:131 hcl:39d6b0 hgt:177in + +eyr:2020 iyr:2016 ecl:brn hcl:#ceb3a1 byr:1966 pid:696621560 cid:62 +hgt:59in + +hgt:166cm hcl:#7d3b0c +iyr:2016 +ecl:brn pid:190cm +eyr:2020 +byr:2001 + +eyr:2021 +iyr:2012 hcl:#6b5442 +ecl:amb hgt:169cm +pid:969150085 +byr:1925 + +ecl:brn hgt:175cm byr:1992 iyr:2016 pid:415209726 eyr:2027 +cid:72 hcl:#866857 + +iyr:2017 +hcl:#733820 byr:1938 eyr:2020 pid:274486958 hgt:163cm + +hcl:4f5dd1 cid:336 ecl:grn iyr:1931 pid:6212280197 +byr:2016 eyr:2037 +hgt:187in + +iyr:2017 byr:1940 eyr:2025 pid:115098205 hgt:151cm +ecl:grn +cid:122 +hcl:#6b5442 + +hcl:#efcc98 +iyr:2020 pid:709548547 hgt:179cm +eyr:2030 ecl:gry byr:1975 + +cid:217 hcl:#888785 eyr:2029 +ecl:hzl iyr:2013 pid:160053490 +hgt:166cm byr:1992 + +eyr:2024 cid:188 iyr:2016 hcl:ff3a59 ecl:xry pid:296357512 byr:2026 + +hgt:154cm iyr:2010 +ecl:blu pid:717041634 byr:1928 cid:123 +eyr:2027 +hcl:#a97842 + +pid:391011205 ecl:hzl hgt:191cm iyr:2016 eyr:2028 cid:281 byr:1934 + +byr:1937 hgt:65in +pid:667975382 ecl:gry cid:270 eyr:2024 +iyr:2012 + +hgt:179cm pid:065528723 +hcl:#888785 byr:1937 eyr:2028 +iyr:2013 ecl:hzl + +iyr:2027 cid:261 eyr:2037 ecl:#ced7d5 pid:157cm +hcl:3a80c1 byr:2029 hgt:187in + +eyr:2028 +hgt:157cm hcl:#733820 +iyr:2012 ecl:blu byr:1952 pid:915063263 cid:335 + +eyr:2023 hcl:#efcc98 pid:490625944 byr:1961 ecl:grn hgt:155cm iyr:2018 + +cid:247 pid:2807544665 eyr:2021 +ecl:oth +hgt:191cm +byr:1928 +iyr:2013 hcl:#623a2f + +eyr:2015 +byr:2021 +hcl:40d2fc hgt:69cm pid:159cm ecl:gmt + +hgt:175cm eyr:1992 cid:328 pid:263110997 ecl:#e53989 byr:2014 hcl:#a97842 iyr:2026 + +pid:491396731 eyr:2027 hgt:172cm hcl:#623a2f cid:92 iyr:2017 byr:1983 ecl:grn + +hcl:#fffffd +iyr:2018 byr:1983 pid:714591144 ecl:grn eyr:2021 +hgt:160cm + +eyr:2027 +hgt:63in ecl:blu byr:1987 pid:397963077 iyr:2018 hcl:#ceb3a1 + +eyr:2027 +hgt:184cm +hcl:#6b5442 iyr:2012 byr:1984 ecl:blu pid:196287205 + +iyr:1998 +ecl:hzl +pid:7872103596 byr:1991 +cid:275 eyr:2039 +hgt:174cm hcl:0d2ad6 + +iyr:2010 hcl:#efcc98 +byr:1992 hgt:65cm eyr:2038 pid:383236012 cid:68 ecl:lzr + +hgt:190in cid:127 +byr:1947 pid:515728209 hcl:#733820 iyr:2014 ecl:amb eyr:2020 + +iyr:2017 eyr:2028 +hcl:#623a2f +byr:1964 ecl:grn pid:198467794 hgt:169cm + +ecl:utc +hgt:59cm byr:2007 iyr:2030 +hcl:7ac4db eyr:2038 pid:#7206c6 + +iyr:2010 +hcl:z eyr:2021 ecl:brn +hgt:173 cid:86 +pid:194240791 byr:1975 + +pid:9347286034 +hgt:63cm +iyr:1992 eyr:2034 hcl:66031b ecl:grt byr:1929 + +pid:593398904 byr:1939 iyr:2019 hcl:#b6652a ecl:gry eyr:2023 +hgt:70cm + +byr:1991 +iyr:2019 hgt:164cm pid:282852411 cid:340 ecl:amb +hcl:#341e13 eyr:2027 + +eyr:2020 +iyr:2014 ecl:grn hcl:#866857 hgt:158cm +byr:1931 pid:321748597 + +cid:98 byr:2023 iyr:2019 pid:#48f79f +hcl:73c882 eyr:1973 hgt:151in +ecl:utc + +iyr:2023 +hcl:#18171d +pid:52221892 eyr:2039 +byr:2008 hgt:72cm ecl:#db8d14 + +iyr:1966 cid:274 +eyr:2034 pid:12256322 +byr:2006 ecl:dne +hcl:985c2d + +hcl:#fd033b +eyr:2026 ecl:blu +iyr:2016 +byr:1953 hgt:157cm +pid:502619036 + +byr:2015 pid:159cm iyr:2025 +hgt:158cm eyr:1943 hcl:z ecl:grn + +ecl:blu iyr:2016 +pid:842400950 +hcl:#733820 +cid:266 +eyr:2027 byr:1931 +hgt:161cm + +iyr:2017 hgt:190cm byr:1994 pid:706570967 +ecl:hzl hcl:#18171d +cid:180 + +cid:197 pid:204952666 ecl:amb +hgt:70in iyr:2016 byr:1936 hcl:#98cbe3 eyr:2025 + +pid:555499128 +byr:1971 hgt:71in +cid:83 ecl:blu +hcl:#cfa07d eyr:2027 + +ecl:hzl iyr:2014 +pid:30428184 cid:237 +hgt:171cm byr:1942 hcl:#888785 eyr:1986 + +eyr:2025 +pid:579385370 hgt:193cm +hcl:#c0946f byr:1979 iyr:2016 +ecl:amb cid:284 + +eyr:2029 byr:1946 pid:278271295 +ecl:grn +hcl:#cfa07d cid:271 +hgt:172cm +iyr:2020 + +pid:731752614 eyr:2020 byr:1983 +cid:248 ecl:oth hgt:179cm +iyr:2017 hcl:#fffffd + +hcl:z +cid:203 eyr:2032 ecl:#3f9d3d hgt:65cm pid:4042846885 byr:2019 +iyr:1946 + +hgt:171cm ecl:gry eyr:2027 +iyr:2013 +hcl:#7d3b0c pid:92288579 +byr:1955 + +ecl:brn hgt:164cm byr:1969 hcl:#cbf9c9 pid:022724981 eyr:2030 iyr:2013 cid:244 + +hgt:162cm byr:1974 iyr:2015 pid:927525094 hcl:#3d3011 ecl:blu +eyr:2023 + +hgt:157cm +eyr:2020 +pid:221286943 hcl:#fffffd ecl:amb iyr:2018 byr:1945 + +iyr:2019 +eyr:2025 byr:1997 pid:341544323 hgt:174cm cid:113 +ecl:hzl + +pid:138492032 hcl:e35302 ecl:#caaede +eyr:1931 +byr:2001 hgt:156 iyr:1998 + +pid:912182030 cid:189 hgt:162 hcl:#277b39 +iyr:2013 eyr:2023 byr:2023 ecl:blu + +eyr:2027 hcl:#fffffd +ecl:brn +cid:304 iyr:2016 byr:1969 +pid:866607511 hgt:192cm + +hgt:64in +ecl:amb +byr:1958 +pid:720439412 +iyr:2015 eyr:2022 hcl:#ceb3a1 + +eyr:2024 hgt:159cm +pid:187867283 iyr:2016 +ecl:oth hcl:#fffffd +byr:1988 + +ecl:#910bf2 byr:1969 iyr:2011 hcl:z eyr:2024 pid:579502502 +cid:103 hgt:174cm + +pid:718692455 +eyr:2028 +iyr:2016 +hcl:#602927 +ecl:blu byr:1954 +cid:251 hgt:182cm + +eyr:2021 hcl:#341e13 ecl:amb +byr:1933 hgt:179cm iyr:2011 pid:083172316 + +iyr:1998 hcl:z eyr:1944 +byr:2006 pid:453368738 +hgt:160 ecl:#9da5f1 cid:261 + +hcl:#7d3b0c +iyr:2018 +hgt:164cm eyr:2020 byr:1940 ecl:blu + +pid:993701676 eyr:2028 ecl:gry +byr:1951 hcl:#888785 cid:116 +iyr:2020 +hgt:192cm + +hcl:z eyr:2033 +ecl:lzr iyr:2029 cid:326 hgt:68cm byr:2026 +pid:96742419 + +hcl:#a97842 ecl:brn +byr:1920 +hgt:173cm iyr:2015 +eyr:2024 pid:176967666 + +byr:1930 eyr:2025 pid:792694131 +hgt:179cm ecl:brn +hcl:#a97842 +iyr:2015 + +hgt:167cm byr:1960 eyr:2022 hcl:#efcc98 +cid:87 ecl:blu iyr:2012 +pid:431515059 + +hcl:#cfa07d +eyr:2023 +hgt:188cm ecl:grn pid:081575957 byr:1938 iyr:2012 + +iyr:2010 byr:1973 +cid:108 +eyr:2026 +pid:880191154 hcl:#888785 hgt:181cm +ecl:brn + +eyr:2021 iyr:2010 byr:1942 hcl:#7d3b0c ecl:hzl pid:886241926 hgt:171cm + +cid:53 byr:1993 +pid:150cm eyr:2035 +hcl:#888785 hgt:153cm ecl:#128262 iyr:2021 + +ecl:gry +pid:555911148 +hcl:#733820 eyr:2022 hgt:154cm iyr:2012 +byr:1935 cid:338 + +hcl:#b6652a +pid:833873846 iyr:2012 +hgt:167cm eyr:2023 byr:1984 + +eyr:2024 +ecl:blu byr:1955 +hcl:#b6652a pid:517975316 iyr:2010 hgt:166cm + +pid:133785752 +ecl:blu +eyr:2024 +byr:1973 +iyr:2019 hcl:#fffffd +cid:236 hgt:173cm + +cid:222 +byr:2013 hcl:z eyr:2036 pid:7443967478 ecl:brn +iyr:2030 hgt:62cm + +hgt:193cm cid:259 +hcl:#18171d +ecl:grn +byr:1995 pid:727880050 eyr:2030 iyr:2010 + +hcl:#c0946f cid:275 eyr:1954 pid:772184635 ecl:#76add7 byr:2009 iyr:2018 hgt:151cm + +ecl:#52ed0f eyr:2033 hcl:#18171d pid:475397948 +byr:1946 iyr:2028 hgt:178cm + +iyr:2012 hgt:152cm +eyr:2027 byr:1923 ecl:brn +hcl:#18171d pid:513722888 cid:171 + +iyr:2029 +hgt:111 hcl:z ecl:#33e3bc eyr:1930 +byr:1934 pid:94036732 + +hgt:154cm eyr:2024 hcl:#6b5442 iyr:2017 +byr:1974 +ecl:amb pid:470968353 cid:345 + +hgt:184cm hcl:#617375 eyr:2028 +byr:1975 ecl:oth +iyr:2018 pid:735589126 + +cid:261 +hcl:#cfa07d pid:213013397 +hgt:187cm +ecl:gry iyr:2016 + +hcl:#623a2f +ecl:#34964b eyr:2009 pid:169cm byr:2028 hgt:169cm +iyr:2028 + +eyr:2029 iyr:2016 +byr:1985 +hgt:192cm hcl:#602927 cid:167 +ecl:blu pid:620818510 + +eyr:2029 +byr:1968 +ecl:blu +hgt:183cm iyr:2011 pid:952376140 hcl:#efcc98 + +iyr:2020 +byr:1981 pid:850136149 eyr:2028 hgt:159cm hcl:#7d3b0c +ecl:brn + +ecl:brn pid:480452858 hgt:65in cid:340 eyr:2022 +byr:1946 +hcl:#602927 iyr:2015 + +hgt:172 hcl:z eyr:1958 iyr:1941 byr:2019 pid:389995951 ecl:dne + +byr:2025 hcl:4c8dcd +hgt:177in +ecl:#55d635 +cid:197 pid:91192572 +iyr:1921 eyr:2038 + +iyr:2027 pid:154cm +hgt:185in byr:2012 +eyr:2036 hcl:efd47d +ecl:#64f98d +cid:86 + +eyr:2029 pid:837224515 ecl:grn cid:231 hcl:#733820 iyr:2019 +hgt:159cm +byr:1977 + +pid:974518338 byr:1964 hcl:#cfa07d ecl:grn eyr:2030 +hgt:61in +iyr:2019 + +iyr:2019 +hgt:192in cid:94 +eyr:1922 +byr:1925 hcl:z ecl:utc pid:#081266 + +eyr:2027 iyr:2019 cid:328 byr:1961 hcl:#6b5442 ecl:blu hgt:177cm pid:235426720 + +byr:1959 +eyr:2025 +pid:890034625 ecl:oth +hgt:62in cid:348 hcl:#733820 + +hgt:161cm iyr:2018 pid:916160791 ecl:grn +byr:1951 hcl:#44d03a eyr:2025 + +hgt:158cm byr:1942 iyr:2012 hcl:#602927 +eyr:2026 ecl:gry pid:651231060 + +ecl:hzl cid:340 pid:086942161 byr:1986 hcl:#a97842 iyr:2018 +eyr:2028 +hgt:181cm + +ecl:blu +pid:278922687 cid:238 iyr:2018 hgt:153cm eyr:2027 +byr:1965 +hcl:#733820 + +eyr:2023 cid:208 hgt:178cm hcl:#341e13 byr:1937 pid:290981079 iyr:2010 ecl:grn + +hcl:#888785 +ecl:amb +byr:1943 pid:559804716 eyr:2026 hgt:166cm +iyr:2019 + +pid:947831563 +ecl:gry +byr:1960 hcl:#341e13 +iyr:2016 hgt:173cm eyr:2029 + +ecl:blu iyr:2016 pid:724632073 hcl:#623a2f +eyr:2028 hgt:192cm byr:1958 + +byr:2021 +eyr:2016 hcl:z iyr:1988 pid:65353943 +ecl:#bb553b +hgt:125 + +hcl:#efcc98 byr:1963 pid:290433211 eyr:2023 ecl:hzl +hgt:172cm iyr:2013 + +iyr:2015 ecl:brn +byr:2023 hcl:#18171d +pid:325330679 +hgt:190in eyr:2023 + +pid:745674970 hgt:160cm eyr:2021 byr:1925 ecl:gry hcl:#341e13 iyr:2015 +cid:297 + +eyr:2021 +pid:596411633 +byr:1947 ecl:blu cid:191 hcl:#341e13 hgt:168cm iyr:2019 + +eyr:2030 pid:#902a6b iyr:1997 hcl:11f396 hgt:188cm byr:2025 +ecl:dne + +eyr:2025 +byr:2006 +hcl:#888785 ecl:hzl hgt:187cm +iyr:2012 pid:017702828 + +byr:1988 hcl:#18171d iyr:2019 +pid:110591871 +ecl:hzl +hgt:160cm +eyr:2029 + +ecl:brn +hcl:#c0946f iyr:2030 pid:264404022 byr:1984 hgt:59cm eyr:2040 + +pid:5973803069 +hcl:#cfa07d ecl:grt +hgt:153cm eyr:2039 byr:1970 +iyr:2025 + +hcl:#fffffd +iyr:2022 byr:2026 +hgt:180 pid:82035145 eyr:2034 cid:118 ecl:utc + +hgt:186cm eyr:2026 +ecl:brn +iyr:2013 hcl:#8f4c9b pid:010260339 byr:1948 + +ecl:amb hcl:#18171d iyr:2020 pid:259501214 byr:1978 hgt:193cm +cid:263 eyr:2022 + +hgt:161cm iyr:2015 byr:2014 eyr:2003 +pid:708958872 ecl:grt +hcl:f4a430 + +hgt:170cm eyr:2021 pid:911638274 cid:110 byr:1963 ecl:blu +iyr:2015 hcl:1eda64 + +ecl:oth byr:1949 hgt:174cm hcl:#18171d eyr:2022 iyr:2019 +pid:305857230 + +ecl:gry hcl:#a97842 pid:971971076 byr:2002 iyr:2019 +hgt:188cm +eyr:2022 cid:238 + +eyr:2027 pid:221315043 iyr:2010 hgt:159cm ecl:blu byr:1998 hcl:#6b5442 + +hcl:#888785 +byr:1926 eyr:2022 pid:433807814 ecl:grn +iyr:2010 +hgt:181cm + +ecl:grn hgt:164cm byr:1951 hcl:#18171d cid:75 pid:845508281 eyr:2021 iyr:2017 + +pid:#f59bc7 +eyr:1987 hgt:191cm hcl:z byr:2024 +iyr:1985 + +hcl:#623a2f pid:497429747 +hgt:189cm +byr:1987 +eyr:2027 iyr:2012 cid:95 ecl:hzl + +byr:2000 +hgt:165cm +iyr:2017 pid:519443292 eyr:2029 cid:240 hcl:#a97842 +ecl:blu + +cid:67 pid:038299774 +eyr:2023 iyr:2015 hgt:179cm byr:1941 hcl:#18171d ecl:amb + +byr:2000 +eyr:2025 ecl:oth iyr:2017 +pid:334154607 +hcl:#fffffd hgt:173cm + +hcl:#888785 ecl:amb +cid:131 iyr:2018 byr:1996 eyr:2026 +hgt:180cm pid:709543988 + +iyr:1988 +pid:263277424 +hcl:ee8912 byr:1942 ecl:gry eyr:2040 hgt:161cm + +eyr:2020 byr:1966 iyr:2020 hgt:169cm pid:611918000 +hcl:#7d3b0c ecl:hzl + +hgt:164cm ecl:brn +iyr:2015 pid:192054454 hcl:#6b5442 byr:1987 eyr:2022 + +byr:1952 +ecl:zzz +pid:215953654 +eyr:2021 hcl:#efcc98 hgt:153cm iyr:2026 + +hgt:167cm +hcl:#b6652a pid:847614726 +eyr:2022 ecl:gry byr:1990 iyr:2015 + +hgt:185cm ecl:oth iyr:2012 +byr:1933 +cid:250 +pid:038674023 +hcl:#c0946f + +pid:613273980 hcl:#a97842 +ecl:oth byr:1924 hgt:179cm +eyr:2027 iyr:1950 + +hcl:#cfa07d byr:2018 hgt:190cm pid:64530329 +ecl:brn +iyr:2024 + +hcl:z hgt:70cm pid:18807747 +cid:284 byr:2023 +eyr:2035 ecl:#4a1501 +iyr:1954 + +iyr:2016 hgt:152cm pid:886247173 byr:1940 hcl:#c0946f eyr:2027 ecl:oth cid:150 + +hgt:152cm hcl:#48cfdf eyr:2025 cid:277 +ecl:oth pid:246230621 byr:1932 +iyr:2020 + +ecl:amb pid:871180042 +cid:117 hcl:#602927 iyr:2011 hgt:152cm +eyr:2030 byr:1999 + +eyr:2024 ecl:hzl hgt:171cm +byr:1934 pid:356408125 iyr:2019 hcl:#b6652a +cid:169 + +eyr:2023 +hcl:#7d3b0c +byr:1934 hgt:67in ecl:oth pid:191785527 +cid:117 iyr:2016 + +iyr:2029 +hcl:#602927 eyr:2022 byr:1931 ecl:oth hgt:192cm +pid:231475143 + +ecl:grn iyr:2014 cid:250 hcl:#b6652a byr:1970 pid:675238417 hgt:162cm +eyr:2026 + +ecl:brn +hcl:#623a2f eyr:2021 pid:293293433 hgt:158 byr:1977 iyr:2019 + +ecl:oth hcl:#ceb3a1 pid:013111996 eyr:2023 hgt:180cm byr:1976 cid:224 + +hgt:61cm +eyr:2027 ecl:amb pid:181cm iyr:1932 +byr:1974 +hcl:#18171d + +byr:1968 hgt:167cm +hcl:#a97842 eyr:2022 iyr:2018 ecl:hzl pid:940968694 + +iyr:1943 +hgt:96 +cid:229 +hcl:z eyr:1990 byr:2007 pid:#25aa73 +ecl:#74592e + +hgt:182cm iyr:2018 ecl:hzl eyr:2029 byr:1946 pid:602345030 +hcl:#ceb3a1 + +pid:750306036 eyr:2020 hgt:181in ecl:xry +iyr:2011 hcl:z byr:1971 cid:71 + +pid:183825747 iyr:2019 hcl:#6b5442 +byr:1974 +hgt:180cm eyr:2028 +ecl:amb + +ecl:brn cid:200 pid:576495225 +byr:1924 +hcl:#efcc98 eyr:2022 iyr:2017 hgt:185cm + +iyr:2020 hgt:167cm byr:1965 ecl:brn hcl:#888785 +eyr:2028 pid:752062953 + +byr:2026 +hcl:z +eyr:2020 +ecl:#b4ec74 pid:187cm iyr:1974 +cid:326 hgt:150cm + +byr:1996 pid:507323629 +iyr:2015 cid:347 eyr:2026 hcl:#efcc98 +ecl:amb hgt:157cm + +byr:2017 pid:456780590 hcl:#888785 eyr:1966 ecl:amb iyr:2023 cid:187 hgt:62cm + +ecl:hzl iyr:2015 hcl:#6b5442 hgt:152cm eyr:2028 byr:1982 pid:003269467 + +iyr:2017 eyr:2026 +ecl:blu cid:70 hcl:#7d3b0c +byr:1966 pid:160330947 hgt:189cm + +iyr:2010 ecl:amb +hgt:164cm eyr:2029 byr:1963 +pid:596606374 hcl:#efcc98 + +hcl:#fffffd cid:277 pid:102326370 hgt:154cm eyr:2026 iyr:2012 byr:1968 +ecl:hzl + +ecl:oth pid:477189554 hcl:#6b5442 eyr:2022 byr:1948 hgt:74in cid:181 +iyr:2016 + +hgt:169cm hcl:#d7bc93 +cid:344 ecl:oth +pid:#09c55d iyr:2017 +eyr:2030 byr:1928 + +hcl:5d02ff ecl:#ca7901 iyr:1959 byr:2006 eyr:2022 +hgt:164in +pid:#d6cdfd + +ecl:amb pid:5739190196 eyr:2021 hgt:157in hcl:#efcc98 byr:2018 iyr:2028 + +byr:1995 ecl:hzl +iyr:2017 +hcl:#a97842 pid:917039291 eyr:2026 hgt:175cm + +iyr:2017 pid:756519868 +hcl:#623a2f +eyr:2028 +hgt:158cm +ecl:amb byr:1957 + +iyr:2012 +hgt:158cm +byr:2014 pid:973021666 hcl:f04766 eyr:2035 ecl:utc + +ecl:blu +byr:1989 eyr:2022 +pid:520765501 +cid:200 hgt:193cm hcl:#a97842 iyr:2011 + +byr:1959 +ecl:blu hcl:#733820 cid:284 hgt:162cm +eyr:2022 pid:751629408 iyr:2016 + +byr:1978 cid:301 +ecl:oth hgt:67cm hcl:#888785 +eyr:2040 iyr:2025 pid:26038514 + +iyr:2020 byr:1974 hgt:163cm ecl:blu hcl:#7d3b0c eyr:2028 cid:99 + +hcl:#a97842 +hgt:186cm +ecl:grn byr:1969 pid:460360492 iyr:2011 eyr:2028 + +byr:2009 +pid:489490924 eyr:2031 +hcl:cb5351 ecl:#083a25 hgt:164cm + +iyr:2019 +hcl:3463cc ecl:amb pid:4089063078 eyr:2022 hgt:150cm +byr:2007 + +eyr:2028 hcl:#ceb3a1 +hgt:191cm iyr:2019 pid:737842199 ecl:blu cid:268 byr:1925 + +pid:868397851 +hcl:#efcc98 ecl:grn iyr:2017 eyr:2021 byr:1943 +hgt:179cm + +hcl:#623a2f byr:1987 eyr:2023 iyr:2019 hgt:152cm +pid:473569020 +ecl:grn + +pid:953968630 +hgt:175cm +byr:1971 ecl:blu hcl:#623a2f iyr:2017 cid:336 eyr:2030 + +ecl:grt hgt:74cm byr:2022 eyr:2024 pid:39114027 +iyr:2026 hcl:4b5675 + +pid:#492988 +eyr:2032 hgt:63cm iyr:2006 +ecl:#817211 byr:2019 + +pid:800367032 hcl:#341e13 +ecl:#765111 iyr:2012 byr:2006 hgt:166cm cid:291 eyr:2027 + +eyr:2021 iyr:2012 pid:876581393 ecl:amb hcl:#866857 +hgt:64in byr:1993 + +iyr:2017 byr:1996 ecl:hzl pid:038990744 +eyr:2028 +hgt:177cm +hcl:#c0946f + +hcl:#4214a6 +eyr:2021 +iyr:2019 cid:72 byr:1939 +ecl:hzl pid:783071912 hgt:187cm + +eyr:2020 hgt:158cm +pid:274060737 cid:277 +iyr:2015 hcl:#bf9b5e byr:1950 ecl:brn + +byr:1921 hcl:#7d3b0c cid:329 hgt:155cm eyr:2030 pid:718399669 iyr:2011 ecl:brn + +cid:147 eyr:2021 hgt:167cm iyr:2010 ecl:grn byr:1975 hcl:#6b5442 +pid:285479783 + +hgt:187cm +byr:2004 eyr:2025 hcl:bb331b +pid:851189955 iyr:2016 +ecl:amb + +hcl:#94007d pid:361561551 byr:1927 eyr:2026 iyr:2020 +ecl:gry hgt:158cm + +byr:1993 pid:#24c4af iyr:2023 hgt:175cm eyr:2028 +hcl:z ecl:hzl cid:308 + +byr:1985 hcl:#c0946f eyr:2034 hgt:172cm +cid:300 iyr:2013 ecl:gry pid:389455676 + +eyr:2030 iyr:2017 byr:1956 hgt:178cm +pid:864401853 hcl:#6b5442 + +pid:836559549 +iyr:2011 +hgt:167cm +ecl:amb hcl:#c0946f +eyr:2026 byr:1981 + +pid:111085991 iyr:2011 +ecl:blu eyr:2026 cid:311 +byr:1920 hgt:182cm hcl:#602927 + +ecl:oth pid:284436132 +byr:1929 cid:121 +eyr:2027 +iyr:2010 +hgt:75in +hcl:#6b5442 + +byr:1987 +hcl:#7d3b0c iyr:2018 hgt:180cm +ecl:blu eyr:2029 pid:878348021 + +hgt:183cm cid:98 +byr:1953 hcl:#866857 eyr:2021 iyr:2012 pid:158898193 + +eyr:2030 pid:039638764 ecl:hzl hgt:190cm byr:1926 +cid:294 hcl:#b6652a iyr:2017 \ No newline at end of file diff --git a/day04/solution.spec.ts b/day04/solution.spec.ts new file mode 100644 index 0000000..314b9b7 --- /dev/null +++ b/day04/solution.spec.ts @@ -0,0 +1,20 @@ +import { loader } from '../lib/loader' +import { parsePassportList } from './parsePassportList' +import { validatePassport } from './validatePassport' + +const load = loader(4) +const sample = load('sample') +const input = load('input') + +describe('Day 4: Passport Processing', () => { + describe('Part 1', () => { + it('should solve the sample', () => { + expect(parsePassportList(sample).filter(validatePassport)).toHaveLength(2) + }) + it('should solve', () => { + expect(parsePassportList(input).filter(validatePassport)).toHaveLength( + 250, + ) + }) + }) +}) From 0e0ece4e945e8b5ea745ce56cc3e875d3dd4901a Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 4 Dec 2020 09:37:12 +0100 Subject: [PATCH 016/110] feat(day04): part 2 sample --- day04/parsePassportList.ts | 13 ++++++------ day04/solution.spec.ts | 43 ++++++++++++++++++++++++++++++++++++-- day04/validatePassport.ts | 30 ++++++++++++++++++++++++++ lib/loader.ts | 16 ++++++++------ 4 files changed, 88 insertions(+), 14 deletions(-) diff --git a/day04/parsePassportList.ts b/day04/parsePassportList.ts index ef7d95e..0e68b88 100644 --- a/day04/parsePassportList.ts +++ b/day04/parsePassportList.ts @@ -4,13 +4,14 @@ export const parsePassportList = (input: string[]): Record[] => if (line.length === 0) list.push({}) list[list.length - 1] = { ...list[list.length - 1], - ...line.split(' ').reduce( - (props, entry) => ({ + ...line.split(' ').reduce((props, entry) => { + const [k, v] = entry.split(':') + if (v === undefined) return props + return { ...props, - [entry.split(':')[0]]: entry.split(':')[1], - }), - {}, - ), + [k]: v, + } + }, {}), } return list }, diff --git a/day04/solution.spec.ts b/day04/solution.spec.ts index 314b9b7..6aade91 100644 --- a/day04/solution.spec.ts +++ b/day04/solution.spec.ts @@ -1,6 +1,6 @@ -import { loader } from '../lib/loader' +import { loader, loadString } from '../lib/loader' import { parsePassportList } from './parsePassportList' -import { validatePassport } from './validatePassport' +import { validatePassport, validatePassportStrict } from './validatePassport' const load = loader(4) const sample = load('sample') @@ -17,4 +17,43 @@ describe('Day 4: Passport Processing', () => { ) }) }) + describe('Part 2', () => { + it('should solve the invalid passports sample', () => { + expect( + parsePassportList( + loadString(`eyr:1972 cid:100 + hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926 + + iyr:2019 + hcl:#602927 eyr:1967 hgt:170cm + ecl:grn pid:012533040 byr:1946 + + hcl:dab227 iyr:2012 + ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277 + + hgt:59cm ecl:zzz + eyr:2038 hcl:74454a iyr:2023 + pid:3556412378 byr:2007`), + ).filter(validatePassportStrict), + ).toHaveLength(0) + }) + it('should solve the valid passports sample', () => { + expect( + parsePassportList( + loadString(`pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980 + hcl:#623a2f + + eyr:2029 ecl:blu cid:129 byr:1989 + iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm + + hcl:#888785 + hgt:164cm byr:2001 iyr:2015 cid:88 + pid:545766238 ecl:hzl + eyr:2022 + + iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719`), + ).filter(validatePassportStrict), + ).toHaveLength(4) + }) + }) }) diff --git a/day04/validatePassport.ts b/day04/validatePassport.ts index 9c185c3..fd0f927 100644 --- a/day04/validatePassport.ts +++ b/day04/validatePassport.ts @@ -13,3 +13,33 @@ export const validatePassport = (p: Record): boolean => { if (!('hgt' in p)) return false return true } + +export const validatePassportStrict = (p: Record): boolean => { + if (!validatePassport(p)) return false + // byr (Birth Year) - four digits; at least 1920 and at most 2002. + const byr = parseInt(p.byr, 10) + if (byr < 1920 || byr > 2002) return false + // iyr (Issue Year) - four digits; at least 2010 and at most 2020. + const iyr = parseInt(p.iyr, 10) + if (iyr < 2010 || iyr > 2020) return false + // eyr (Expiration Year) - four digits; at least 2020 and at most 2030. + const eyr = parseInt(p.eyr, 10) + if (eyr < 2020 || eyr > 2030) return false + // hgt (Height) - a number followed by either cm or in: + const hgt = /^([0-9]+)(cm|in)$/.exec(p.hgt) + if (hgt === null) return false + const hgtValue = parseInt(hgt[0], 10) + // If cm, the number must be at least 150 and at most 193. + if (hgt[1] === 'cm' && (hgtValue < 150 || hgtValue > 193)) return false + // If in, the number must be at least 59 and at most 76. + if (hgt[1] === 'in' && (hgtValue < 59 || hgtValue > 76)) return false + // hcl (Hair Color) - a # followed by exactly six characters 0-9 or a-f. + if (!/^#[0-9a-f]{6}$/.test(p.hcl)) return false + // ecl (Eye Color) - exactly one of: amb blu brn gry grn hzl oth. + if (!['amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth'].includes(p.ecl)) + return false + // pid (Passport ID) - a nine-digit number, including leading zeroes. + if (!/^[0-9]{9}$/.test(p.pid)) return false + // cid (Country ID) - ignored, missing or not. + return true +} diff --git a/lib/loader.ts b/lib/loader.ts index f2142ce..5378c92 100644 --- a/lib/loader.ts +++ b/lib/loader.ts @@ -1,16 +1,20 @@ import * as fs from 'fs' import * as path from 'path' +export const loadString = (s: string): string[] => + s + .trim() + .split('\n') + .map((s) => s.trim()) + export const loader = (day: number) => (file: string): string[] => - fs - .readFileSync( + loadString( + fs.readFileSync( path.resolve( process.cwd(), `day${day.toString().padStart(2, '0')}`, `${file}.txt`, ), 'utf-8', - ) - .trim() - .split('\n') - .map((s) => s.trim()) + ), + ) From e43c23fc26ef20209c4e68476bba7a90e8b159fb Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 4 Dec 2020 10:17:19 +0100 Subject: [PATCH 017/110] feat(day04): part 2 --- day04/input.txt | 2 +- day04/solution.spec.ts | 90 +++++++++++++++++++++++++++------------ day04/validatePassport.ts | 6 +-- 3 files changed, 66 insertions(+), 32 deletions(-) diff --git a/day04/input.txt b/day04/input.txt index 9b04221..127dae0 100644 --- a/day04/input.txt +++ b/day04/input.txt @@ -1118,4 +1118,4 @@ hgt:183cm cid:98 byr:1953 hcl:#866857 eyr:2021 iyr:2012 pid:158898193 eyr:2030 pid:039638764 ecl:hzl hgt:190cm byr:1926 -cid:294 hcl:#b6652a iyr:2017 \ No newline at end of file +cid:294 hcl:#b6652a iyr:2017 diff --git a/day04/solution.spec.ts b/day04/solution.spec.ts index 6aade91..eb376db 100644 --- a/day04/solution.spec.ts +++ b/day04/solution.spec.ts @@ -18,42 +18,76 @@ describe('Day 4: Passport Processing', () => { }) }) describe('Part 2', () => { - it('should solve the invalid passports sample', () => { + it('should solve the sample', () => { expect( parsePassportList( loadString(`eyr:1972 cid:100 - hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926 - - iyr:2019 - hcl:#602927 eyr:1967 hgt:170cm - ecl:grn pid:012533040 byr:1946 - - hcl:dab227 iyr:2012 - ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277 - - hgt:59cm ecl:zzz - eyr:2038 hcl:74454a iyr:2023 - pid:3556412378 byr:2007`), - ).filter(validatePassportStrict), - ).toHaveLength(0) - }) - it('should solve the valid passports sample', () => { - expect( - parsePassportList( - loadString(`pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980 - hcl:#623a2f + hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926 + + iyr:2019 + hcl:#602927 eyr:1967 hgt:170cm + ecl:grn pid:012533040 byr:1946 + + hcl:dab227 iyr:2012 + ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277 + + hgt:59cm ecl:zzz + eyr:2038 hcl:74454a iyr:2023 + pid:3556412378 byr:2007 + + pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980 + hcl:#623a2f - eyr:2029 ecl:blu cid:129 byr:1989 - iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm + eyr:2029 ecl:blu cid:129 byr:1989 + iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm - hcl:#888785 - hgt:164cm byr:2001 iyr:2015 cid:88 - pid:545766238 ecl:hzl - eyr:2022 + hcl:#888785 + hgt:164cm byr:2001 iyr:2015 cid:88 + pid:545766238 ecl:hzl + eyr:2022 - iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719`), + iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719`), ).filter(validatePassportStrict), ).toHaveLength(4) }) + + it.each([ + [{ byr: '2002' }, true], + [{ byr: '2003' }, false], + [{ hgt: '60in' }, true], + [{ hgt: '190cm' }, true], + [{ hgt: '190in' }, false], + [{ hgt: '190' }, false], + [{ hcl: '#123abc' }, true], + [{ hcl: '#123abz' }, false], + [{ hcl: '123abc' }, false], + [{ ecl: 'brn' }, true], + [{ ecl: 'wat' }, false], + [{ pid: '000000001' }, true], + [{ pid: '0123456789' }, false], + ])(`should pass sample properties %s %s`, (props, isValid) => { + const valid = { + eyr: '2024', + pid: '662406624', + hcl: '#cfa07d', + byr: '1947', + iyr: '2015', + ecl: 'amb', + hgt: '150cm', + } + + expect(validatePassportStrict(valid)).toEqual(true) + expect( + validatePassportStrict({ + ...valid, + ...props, + }), + ).toEqual(isValid) + }) + + it('should solve', () => { + const v = parsePassportList(input).filter(validatePassportStrict) + expect(v).toHaveLength(158) + }) }) }) diff --git a/day04/validatePassport.ts b/day04/validatePassport.ts index fd0f927..4447133 100644 --- a/day04/validatePassport.ts +++ b/day04/validatePassport.ts @@ -28,11 +28,11 @@ export const validatePassportStrict = (p: Record): boolean => { // hgt (Height) - a number followed by either cm or in: const hgt = /^([0-9]+)(cm|in)$/.exec(p.hgt) if (hgt === null) return false - const hgtValue = parseInt(hgt[0], 10) + const hgtValue = parseInt(hgt[1], 10) // If cm, the number must be at least 150 and at most 193. - if (hgt[1] === 'cm' && (hgtValue < 150 || hgtValue > 193)) return false + if (hgt[2] === 'cm' && (hgtValue < 150 || hgtValue > 193)) return false // If in, the number must be at least 59 and at most 76. - if (hgt[1] === 'in' && (hgtValue < 59 || hgtValue > 76)) return false + if (hgt[2] === 'in' && (hgtValue < 59 || hgtValue > 76)) return false // hcl (Hair Color) - a # followed by exactly six characters 0-9 or a-f. if (!/^#[0-9a-f]{6}$/.test(p.hcl)) return false // ecl (Eye Color) - exactly one of: amb blu brn gry grn hzl oth. From dd5d08672ea1aec93623eb6004011275f183d417 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 4 Dec 2020 10:44:09 +0100 Subject: [PATCH 018/110] refactor(day04): improve naming --- day04/validatePassport.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/day04/validatePassport.ts b/day04/validatePassport.ts index 4447133..02e141f 100644 --- a/day04/validatePassport.ts +++ b/day04/validatePassport.ts @@ -29,10 +29,11 @@ export const validatePassportStrict = (p: Record): boolean => { const hgt = /^([0-9]+)(cm|in)$/.exec(p.hgt) if (hgt === null) return false const hgtValue = parseInt(hgt[1], 10) + const hgtUnit = hgt[2] // If cm, the number must be at least 150 and at most 193. - if (hgt[2] === 'cm' && (hgtValue < 150 || hgtValue > 193)) return false + if (hgtUnit === 'cm' && (hgtValue < 150 || hgtValue > 193)) return false // If in, the number must be at least 59 and at most 76. - if (hgt[2] === 'in' && (hgtValue < 59 || hgtValue > 76)) return false + if (hgtUnit === 'in' && (hgtValue < 59 || hgtValue > 76)) return false // hcl (Hair Color) - a # followed by exactly six characters 0-9 or a-f. if (!/^#[0-9a-f]{6}$/.test(p.hcl)) return false // ecl (Eye Color) - exactly one of: amb blu brn gry grn hzl oth. From c62fcc12940c188cb43c87b1b520d91a53597c90 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 4 Dec 2020 14:38:52 +0100 Subject: [PATCH 019/110] refactor(day04): move strict tests --- day04/solution.spec.ts | 34 ------------------------------ day04/validatePassport.spec.ts | 38 +++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/day04/solution.spec.ts b/day04/solution.spec.ts index eb376db..fd1774f 100644 --- a/day04/solution.spec.ts +++ b/day04/solution.spec.ts @@ -51,40 +51,6 @@ describe('Day 4: Passport Processing', () => { ).toHaveLength(4) }) - it.each([ - [{ byr: '2002' }, true], - [{ byr: '2003' }, false], - [{ hgt: '60in' }, true], - [{ hgt: '190cm' }, true], - [{ hgt: '190in' }, false], - [{ hgt: '190' }, false], - [{ hcl: '#123abc' }, true], - [{ hcl: '#123abz' }, false], - [{ hcl: '123abc' }, false], - [{ ecl: 'brn' }, true], - [{ ecl: 'wat' }, false], - [{ pid: '000000001' }, true], - [{ pid: '0123456789' }, false], - ])(`should pass sample properties %s %s`, (props, isValid) => { - const valid = { - eyr: '2024', - pid: '662406624', - hcl: '#cfa07d', - byr: '1947', - iyr: '2015', - ecl: 'amb', - hgt: '150cm', - } - - expect(validatePassportStrict(valid)).toEqual(true) - expect( - validatePassportStrict({ - ...valid, - ...props, - }), - ).toEqual(isValid) - }) - it('should solve', () => { const v = parsePassportList(input).filter(validatePassportStrict) expect(v).toHaveLength(158) diff --git a/day04/validatePassport.spec.ts b/day04/validatePassport.spec.ts index 9861ee0..3254311 100644 --- a/day04/validatePassport.spec.ts +++ b/day04/validatePassport.spec.ts @@ -1,4 +1,4 @@ -import { validatePassport } from './validatePassport' +import { validatePassport, validatePassportStrict } from './validatePassport' describe('validatePassport', () => { it.each([ @@ -54,3 +54,39 @@ describe('validatePassport', () => { expect(validatePassport(passport)).toEqual(valid), ) }) + +describe('validatePassportStrict', () => { + it.each([ + [{ byr: '2002' }, true], + [{ byr: '2003' }, false], + [{ hgt: '60in' }, true], + [{ hgt: '190cm' }, true], + [{ hgt: '190in' }, false], + [{ hgt: '190' }, false], + [{ hcl: '#123abc' }, true], + [{ hcl: '#123abz' }, false], + [{ hcl: '123abc' }, false], + [{ ecl: 'brn' }, true], + [{ ecl: 'wat' }, false], + [{ pid: '000000001' }, true], + [{ pid: '0123456789' }, false], + ])(`should pass sample properties %s %s`, (props, isValid) => { + const valid = { + eyr: '2024', + pid: '662406624', + hcl: '#cfa07d', + byr: '1947', + iyr: '2015', + ecl: 'amb', + hgt: '150cm', + } + + expect(validatePassportStrict(valid)).toEqual(true) + expect( + validatePassportStrict({ + ...valid, + ...props, + }), + ).toEqual(isValid) + }) +}) From a7fd716c872af6cff4db41b43430e29400e94721 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 5 Dec 2020 11:22:49 +0100 Subject: [PATCH 020/110] feat(day05): part 1 --- day05/input.txt | 945 +++++++++++++++++++++++++++++++++++++++++ day05/locateSeat.ts | 45 ++ day05/solution.spec.ts | 31 ++ 3 files changed, 1021 insertions(+) create mode 100644 day05/input.txt create mode 100644 day05/locateSeat.ts create mode 100644 day05/solution.spec.ts diff --git a/day05/input.txt b/day05/input.txt new file mode 100644 index 0000000..d789b79 --- /dev/null +++ b/day05/input.txt @@ -0,0 +1,945 @@ +FFBFFBBLRL +FBFBBFBLRR +FBFFBBBRLL +FFBBFBFRRR +BFBBBBFLRR +BBFBBBFRRL +BFBBBBBLLR +FBFFBFBRRR +BBFFBBBLRL +BBBFFFFLLR +FFFFBFFRLL +FFBFFFFRLL +FFFBFBBLRR +BFBFBBBRLR +FBBFBBBLRR +BBFFFFBRRR +FBBFFFBRRR +BFFFBFFLLR +FBBBBFFLRL +BFBFFFBRRL +FFBFBBFRRL +BBFBFFFRRR +FFBFFBFLRR +FFBFFBBLLR +FBFBFFFLRR +FFFBFFFRRL +FFFFFBFRRL +BBBFFFFRLL +FBBFBFFLLL +FBBBBFBLRL +BBBFBBFRRR +BBBFBFBLLL +FBBFFBBLLL +FBBBFBFLRL +FBBBFBFRLL +BFFFFFFLRR +FFFFBBBRRR +FBFBBBFLLL +FBFBFBFRLL +FBBBFBFLLR +FBBFFFFLRR +FFBBBBFRRL +FFBBBBFRLR +FBFBBBBLRL +BFFFFFFRRL +FBBBFFBLLL +FBFFFFFRLL +BFFFFBFRRL +FFBBBFBLRL +FBFFBFFRLR +FBFFBBFLRL +BFFFBFBRLL +BFFFFFFLLL +FFFBBFBLRR +FBFBFBBRLR +BBFFBFFLRR +BBFFFBBLRR +BFBFBBFRLR +FBBFBBBLLR +FFFFBBFLLL +BBFBBBFLRL +BFFBBBFRLR +FBFFFFBLLR +FFFFBFFLRL +BBFBFBFLRR +BFFBFFBLLR +BBFBBBFLRR +FFFFBBFRLR +FBBFFBBLRL +FBBBBBBRLL +FBBFBFBRLR +FFBBFBFRLL +FFBFBFFLRR +BFFBBBBLLR +FBFBFBFRRL +BBBFBBFLLL +FFBBFFBLRR +BBFBBFBLRR +BFFFBBBLLL +BBBFFBFRRL +FBBBFBFLLL +FBFBFBBRRL +BFBFFBBLLR +FFBFFBBRRR +BBFFFFFLLL +BFFBFFBLLL +BBBFBFFRRL +FBFFBFBRLR +BFFBBFFLRR +BFBFBBFLRR +FBBBBFBRLR +BFBBBBBRLL +BFBBBFBLRR +BFFFFFBLLR +BBBFFFBLRL +BFFFBFBLRL +BFFFBBBLRR +BBFBBBBRLL +FFBBFBFLLL +BFFBFBBRRL +BFFBBFBRRR +BBFBBBBRRR +FFBBBBBLLL +FBBBFFBLRL +FFBFFBFLRL +FFBBBBFRLL +FFFFBBFLRR +BBFFFFBRRL +BFFFFBBRRR +FFFBFBFRLR +FBBBBBFLRR +FFFFBBBRRL +BFBFBFBRRR +BFFBBBFRRR +FFFFFFBLLL +FFFBBFBLLL +FBFFFBFLRL +BFFFBBFLRR +FBBBBBFRLL +FBFFFFBRLL +FBFBBBFRLL +FFBFBBBLRL +BFBFBFFLLL +BBBFBFBLLR +FBBBBFFRRR +FBBFBFFRLR +FBFFBFFRRR +BFBFBFFLRR +BBFFFBFLRL +BBFFFBBRRL +BFFBBFFLLL +BFBBFFFRLL +FFFBFFBRLR +BBFBBFBLLR +BBBFFFFRLR +BFBBFBBRRR +FBBBFBFRRL +BBFBBBBLLR +BFFBBBBRRR +FFFFFBFLLL +BBBFBFFLRL +FBFFFFBLLL +BFFBBBFRRL +FBFBBFBLRL +FFBFBBBRLR +FFFBBBBLLL +BBFBBFFRLL +BBFBFBBRLL +BBFBFBBRRL +BFBBBFBRLR +FBFBFFFRLL +BFFFBFFRRL +BFFFFBFLRR +BFBBFFBRRL +BBFFBBFRRL +BBBFFFFLLL +FBFFBFBRRL +FFFBBFBRRL +FBFFBFFLLL +FFFBFBBLRL +BBFFBFBLLL +FFBBBFBLLL +BFBBBFFLRL +BFBFBBBRRL +FFBBBBFLRR +FBBFFBFRRR +FFBFBFBRLL +BFBBFFBLLR +BFFBFBFRRL +FBFFFFFLRR +FBFBBBBRLR +BFFFFFBLRR +BBFBFFFRLL +FFBFBBFLRR +BBFFFFFRLL +BFFBBFBRLR +FFBBFBBRLR +BFBBFFFLRL +FFFFFFFRRL +FFBBBBBLRL +FFFBBBBLLR +FFFBBFFLLR +FFFBFFFRLL +BFBFFBBRRL +BBFBBFFRRL +FFBFFBBRRL +FFBFFFFRRL +FFFBFFBRLL +FBFBFFFRLR +FFFBFBFRRR +BFBBBBFRRR +BBBFBFFRLL +FBBFFFFRLR +BFFBBBBLRR +FFBBBBBRLL +FFBBFBFLRL +BBBFFBBRLL +BBFBBBFRLL +BFBBFBFRRR +FBFBBFBRRL +FBBFBBBRRL +FFBFFBBRLR +FFFFFBFLRL +FBFBFFFLLL +FBFFBBFRLL +FBBBFFFRRR +BFFBFBBRLL +BFBFFFFRLL +BBFFFBBLLR +FFBBFBBLLL +BBBFFFBLLR +FFFBBBBRLL +BFBBBBFRLL +BFBBBFFLRR +BFFFFFFLLR +BFBBBBFLLL +FBBBFFFLRL +FBBBBFBLLL +BFFFBBFRRL +FBBBBFFRLR +BBFBFBFRLR +BFFBFBFLRR +BBFBFFBRRL +FFFFFFBRRL +FBFBFBBLRL +BFBFFBBLRR +FFBBFBFRRL +FBFFFBFLLR +FBBBBBBRRR +BBBFBFFLRR +FBBFBBBRLL +FFBFFBBLLL +BBFFBFBRRR +BFFBBBFLRR +FFFBFFFLLR +FBBFBFFRLL +BBFFFFBLLL +BFBFBFFLRL +BBFBBFBRRR +BBFFFBBRLL +BFFBBFBRLL +FFFFFFBRLL +BFFBFFBRLL +BFFBBFBLRR +BFBBBBFLRL +BBFFFFBLRL +FFFBBBFLRR +BFBBFBBLRL +FBBBFBBRLL +BBFBBFBRLR +BFFBBFBLLL +FBBBBBFRRL +BFFBBBFLRL +FFFBBFFRLR +FBBFFFFRLL +BFFFFBFRLL +FFBBBFBRLL +FFFBFFFRLR +BFBBFFFRRL +BFBFFBBRRR +FFBBFBFLRR +FFFBFFBLLR +BBFBBFFRLR +BFFBBFFRRL +FBBFFFFLRL +FBFBBFFRLL +BBFBFBBLLR +FFFFFBBLRR +BFBBBFFLLR +BFBFFBFLRR +BFBBFBFRRL +FBBFBBFRLR +BBFBBBFLLR +BFFFBBBRLR +FBFFBFFRLL +BFBBFFFRLR +BBFFBBFRLR +BBFBFFBLRL +BBBFBFBRLL +FFFFBFFLRR +BFBFBBBLLL +BFFFFBFLRL +BFBBBFBRLL +FFFBFFBLRR +FFFBBFBRLR +BBFFFBBLLL +FFFBBBBRRL +FFBFBFFRLR +BBBFFBBLRL +FFBFFBFLLL +FFFBFBBLLR +FFBFFFFLRL +FFBBFFFLLL +FBFFFBBRRL +BFFFFBBLLR +BFBFFFFRRR +FBFBFBBRLL +BFBBBFFRLL +BFFBBFFLRL +FFBBFFBLLL +FBBBBFBRRL +BBFFFBFRRL +FFFBBFBLRL +BBBFFFBRLR +BFBBFFFRRR +FFBFBBBRRR +BFFFBFBRRL +FBBFFBFRLL +BBBFFBBLLL +FBBFBBBRLR +BBBFBBFLRR +BBFFFFBRLR +BFFFBFBRLR +FBBBFBFRLR +BFBBFFFLLL +FBBBBBBRRL +BBFFBBBRLR +BFFFFFFRRR +BBFFFBBRLR +FBFBBFBLLL +BFBFBBBLLR +FBBBFBBLRL +FFBFFFBRRR +BFFFFBBRLL +BBFBBFFLRR +FBBBFBFLRR +BFFBFFFLLR +BBBFFFFLRR +BFFBFBFRRR +FFFFFFBRRR +BFBFFFFLRR +BFFFBBBLRL +FBBBFFBLRR +FFFFBFFLLL +FFBBFFFLLR +BFBBFFBRLR +FBFFBBFLLL +FFFBBBFRLL +BFBBFFBLRR +BFFBFFBRRR +FBFBBFFLRR +BFFBFBFLLR +FBFFFFBLRR +FBFFFBBLRR +BFBFFBFRRL +FFBFBFBLRL +FBFBBBBRRL +BBFFFFFRLR +FFBFFBFRRL +FFBBFFBRRR +BBFFBFFRRL +FFFFFBBRLR +BFBBFFFLLR +FFFBBFFLRR +BFFBFBBRLR +FBFFBFBLLL +FFBBFBFLLR +FFBBFFFRLR +BFBFFFFRRL +FBBFBBBRRR +BFFFFBFRRR +BFBFBFBLLR +BBBFBFFRLR +BFFFBFBRRR +FBFBFFBLRR +BBFFBBFRLL +BFBFBBFLRL +BFBFFFFLRL +BBBFBFBRLR +FFBBBBFLLL +FBBBFFBRLL +FFBFFFBRLR +FFBBBFFRRL +FFBBBBBLLR +FFFFBFBLRL +FFFBFFFLRL +FBBBBBBLLR +BFFFBBFLRL +FBBFBFFLRL +FFBFFBFLLR +FFBBBBBRRR +FFFBFBFRRL +BFFBFFFRLR +FFBFFBBLRR +BBFFFFFLRR +BBBFBBFRRL +BBFFFBFRLL +FBFBFBBLRR +BBFFFBBRRR +BBBFBFBLRL +FBBBFFFRLR +BFFFBBFLLL +FBBBBFFLRR +FFBBFFBRLR +FFBFFFFRRR +FBFBFBFLRR +BBBFFFFRRR +FBFFFBFRRL +FFBFFFFLLL +BBFBBBBRRL +FBFFBBFLRR +FBFBBFFRRR +BFFFBBBLLR +FFBBBFFLRR +BFFFFBBRRL +FFBFFFFLRR +BFFBFBFLRL +BFFBBBBRLR +BFFBFBBLLL +BFBBBBBRRR +FFBBFBBLRL +BFBFFBFLRL +BBFBBBFRLR +FBBFBBFRLL +BFBFFBBRLL +FBFBBBBRLL +FFBBFBBLRR +BFBFFBBLLL +FFBFFFBLLR +BFBBBFBRRL +BBFFFBFLRR +BBFFBBFLRL +FBBFBFBLLR +BBBFBBFRLR +FBBBBBFRLR +BFBBFBFLLL +FBFFFFBLRL +FBBFFBBLLR +FBBFFBBRLR +FFFFBFBRRR +FBBFFBFLRL +FBFBBBBRRR +FBBFFFFRRL +FFFBBBBLRL +BFFBFBFRLL +FFBFBFFRRR +FFFBBFFRRR +BBFFBBBLRR +FFBFFFBLRR +FFBBFBBRLL +FFBBFFFRLL +FBBBFBBLLL +BBFFBFFRLL +FBBFBFBLRR +BBBFFFBLLL +FBFBFBFLRL +BFFBBFBLLR +BFBFBBFLLR +BFBBBFFRRR +FBFFFBFRRR +FFBFFFBRRL +BBFFBBFRRR +BFBBFBBLLL +FFFFFBBRLL +FBFFBFFLRL +FFBFBFBLLR +FFBBBBFLLR +BFBFFBFRRR +BFFFFFBRRL +BFFFFBFLLR +FFFBBBFLLR +BFBFBFBLRR +FFFFBBFLLR +BBBFFBBRRR +FFBFBFBRRR +FBFBBBFLRR +BFFFFBBRLR +BFFBFFBRLR +BFBBFBBRRL +FFBBFBBRRR +FBBFBBFLRR +BBFFBBBRRL +FBBBBBBLRR +FFFBFFFRRR +FFFFBFBRRL +FBFFBFFLRR +BFFBFFFLRR +FFBFFBBRLL +FBFBBFFLLR +BFBFFBFRLR +BBFBFFFLRL +BFFFFFFLRL +FBFFFBFRLR +FBFBBFBLLR +FBBBBFFLLL +BFBFBBFLLL +BBFFFBFRLR +BFBBBBFLLR +FFFFBBBRLR +BFBFFBFLLR +BBBFBFFLLL +BFFFFFBRLL +FFBBFBBLLR +FBBBBFFRRL +FFBBFFBLRL +FBFBBBFLLR +FBFFBFBLRL +FBBBFFFLRR +FFBFBFFRRL +FBBBBBBRLR +FFFBBFBRLL +FBFBFFBRLR +BBBFBFBRRR +FBBBBBBLLL +FFFFBBBLLL +BBFBFBFLRL +BBFFFFFRRL +FBBBFFBRLR +FFFFBFFLLR +BFFBBFFRLL +FBFFBBFRRL +BFBFFFBRRR +FBFFBFFRRL +FFFFFBBLLR +BBFFFFBRLL +FFFBFBFLLL +BFBBFBFRLR +BFBFBBBLRR +BFFFBBBRRR +FFFFFFBLRL +FFFFFFBLRR +BFBFFBBRLR +BBBFFBFLLR +FBFFFBBLLL +BBBFFBFLLL +BBFFBBFLRR +BFFBFFFRRL +FFBFBBBRLL +FBBBBBFLLL +BBFBFFBRRR +BBFFFFFLRL +BFFBFBBLRL +BFBBBFFLLL +BFBFBFFRRR +FFBBFBBRRL +FBFBBFFLLL +BBFFBFFRRR +FBBFFFBRRL +BBBFBBFRLL +FFFFBBFRLL +BBBFFBBRRL +BBFBBBFRRR +FBBFFBBRRL +BFBBBBFRLR +BFBFBBFRLL +FFBFBFBLRR +BFFBFBBLLR +FBFBBBFRRR +FFFBBBBLRR +FBFFFBBRLL +BBFFFBFRRR +FBFFFFBRRL +FBBFFFBRLL +FBFFFFFLLL +FBBBBBFLRL +BBFFBFFLRL +BBBFBBFLLR +FBFFBFFLLR +FFBBFFFRRR +BFFFFFBRRR +FFBFBFBLLL +FFFFBFBRLL +BBFBFFBRLR +BBFFBFBRLL +FBBFFBFRLR +FBBBFFBRRL +FFFBBBBRRR +BBFFFFBLRR +FFBFBBFRRR +BFFFFFBLRL +FFBFBFBRRL +FFBBFBFRLR +FFBFBBBRRL +BFFFFBBLRL +FBBFBFBRRR +BFFFFFFRLR +FFFFBFFRLR +BFBFFBFRLL +BFFBBFFRRR +BFFBFFBLRR +FBFBFFFLLR +BFBFBFBRLL +BBFFFBFLLL +BFBFFFBRLL +BFBFBFFRLL +FBFBBBFLRL +FBFFFFFLRL +BBFBBFBRRL +FFBFFFBRLL +FBBFFFBLLR +FFBBBFFLRL +BFFBFBFRLR +FBFFFBBLLR +FFFBFFFLLL +FBBBBBFRRR +BFBFBFBLRL +BBBFFBFLRR +BBBFBBFLRL +BBFBFFFLLR +FBBFFFBLLL +BFBFFFBLRL +FBFBFBBRRR +FBBBFBBRRL +FFFFFFBRLR +FBBFBBFRRL +BBFBFBFLLL +BBFBBBBRLR +BFBBBBBLRL +FBBBBFBRLL +BFFBFFFLRL +BFBBBFFRRL +FFBBBFBLLR +FBFFBBBLLL +FFFFFFBLLR +FFFBFFBLRL +FFFBFFFLRR +FFBBFFFLRL +FBFBFFFRRR +FBFBFBBLLR +FFFFBBBLLR +FFBBBBBRLR +BFBBBBBLRR +BBFBFBFRLL +BFBFFFBLLL +FBBBFBFRRR +FBBFBBFLRL +FFFBBFFLRL +FFFBFBFLRL +FBFBBBBLRR +FFFBBFBRRR +FFFBBFFRLL +FFBBFFBLLR +FBBBBBFLLR +BFBFBFFRRL +BBFBBFBRLL +FBBBFFBRRR +FBFBBFBRLR +FBBFBBBLRL +BFFFFBFRLR +BBFBBBBLRR +BFFBBFFLLR +FBBFFFFLLL +FBFFFFBRLR +FFFFBBFRRL +BFFFBFFLLL +FFFFBBBLRR +FBFFBBBLRL +FFBFFFFRLR +BBBFFBFLRL +BFFBBBBLLL +FFFFFBBRRL +BFBBFFBLLL +BFBBFBFLRR +BFFBBBFLLL +FBFFFBFLLL +FBBFFFBLRL +FFBBBBFLRL +FBFFFBFRLL +FBBFFFBRLR +FBFBBFFLRL +FBBBBFBRRR +FBBBBFBLRR +BBFFBFBLLR +FFBFBBBLLL +FFFFFFFRRR +FFFFFBFRLR +FFBFFFBLRL +BBBFFFBLRR +FBBBBFFRLL +FFBFBBFLLL +BFFFFFFRLL +FFBBBFBRRL +FBFFBFBLRR +BFFBFBBLRR +BFFFBBFRRR +FBBFBBFLLL +BFBBFBBLRR +BBFBBFFLRL +FBBBFBBRLR +BFBBBFFRLR +FFFFFBBRRR +BBFFFBFLLR +BFFFFFBLLL +FBFBFFBRRR +BBFFBFBRLR +BFBBFBFLLR +FBFBFBFLLR +FBBBFFFRLL +BBFBFFBLRR +BBFBFFFRLR +BFBFFFBLRR +BFFBFFBRRL +FFFBFFBLLL +FFBFBFFRLL +BBFBFFBLLL +FBFFFFBRRR +BFBBBFBLLR +FBFBFFBRLL +BFBFBFBRRL +BFFBFFBLRL +FFBFFBFRLR +FBBBFFFLLL +FBFFFFFRRR +FFBFFFFLLR +FBBFFFFRRR +BFFFBFFRLR +BBBFFBBRLR +FFBFBFFLRL +FFFBFBBLLL +BBFBFBBRLR +FFFFFBBLRL +BFBFFBBLRL +FBBFFFFLLR +BBFBBFBLLL +BFFBBBBRRL +FBFFBBBRLR +BBBFBFFLLR +FFFFFBFRRR +FFFBBBBRLR +FFBBBFFLLL +FFFBBFFRRL +BFFFBFFLRR +FBBFFFBLRR +BFFBBFBRRL +FBFBBBFRLR +FBFFFBBRLR +FBFBFBBLLL +FFBFBBFLRL +FFBBBFFRLR +BBFBFBFRRL +FBBBFBBLRR +BFBBBFBLLL +FFFFBFBRLR +FFBBFFBRRL +FBFFBBBLRR +FFBFFFBLLL +FBBFFBFLLL +FFBBBFFRLL +FBFBFBFLLL +BBFFBFFRLR +BFFBFFFLLL +BBFBFBFRRR +FBFFFFFRLR +FBBFBFFRRR +BBFFFFFLLR +BFFFFBBLLL +FFBFBBBLRR +BFFBBBBLRL +BFBFBBBRRR +BFFBFBBRRR +FBBBFFBLLR +BBFBFFFRRL +FFFBBFBLLR +FBFBFFFLRL +FBFBBFBRLL +FFFBBBFRLR +BBFFBBBLLR +FBFBBFBRRR +BFBBFFBRLL +FBBFBFFRRL +FBFFFFFRRL +FFFFFBFLRR +FBBBFFFLLR +FBBBFFFRRL +BBFBFBBLRL +BFFFBFFLRL +FFFBBFFLLL +BBFFBBBRLL +FBFFBBFLLR +BFFBFFFRLL +FBFBBFFRRL +BFFBBFFRLR +FFFBBBFLLL +FBFFFFFLLR +BFBFBBFRRR +BFBBFFFLRR +FFBFBBFRLL +FBBFBFBLRL +FFFFBFFRRR +FFFBFBFLLR +FFBBFFFRRL +FBBFBBFLLR +BFBBBBBRRL +FFFFBFFRRL +FBFBBBBLLR +BBFBBBBLRL +BFBBBBFRRL +BBBFFBBLLR +BFFFBBBRLL +FBBBFBBLLR +FFFFBBBLRL +FBBFBFFLLR +FFBBBBFRRR +FFFFFBBLLL +FFFBFBBRLR +BFBBFBFRLL +FFFBBBFLRL +FBBFBFBRRL +FFFFBBFLRL +BFFBBBBRLL +FFFBFFBRRL +BFFFBBFRLR +FFFBFBBRRR +BFBBFBFLRL +BFBBBBBRLR +BBFBFBFLLR +FFFBBBFRRL +FBBFFBFRRL +FBBBBBBLRL +FFFBFBFLRR +BFFFBBFLLR +BFFBBBFRLL +BBFFBFBLRL +FFBBBBBLRR +FBFBFBFRRR +BFBBFFBLRL +BFFBBBFLLR +FFBFBBFLLR +BFFFBBFRLL +FFBFBFFLLR +FBBFBFFLRR +BFBBBFBRRR +BBBFFFBRRL +BFFFBFFRLL +FFBFBFFLLL +BBBFBFBRRL +FFFBFBBRRL +BFFBFFFRRR +BFFFBFFRRR +BFBFBFFLLR +BBFFFBBLRL +BFFFBFBLLR +BFBBBBBLLL +BFBFFFFRLR +FBFFFBBRRR +BBBFFBFRLL +FFFBBBFRRR +BFBFBFFRLR +FFBFBBBLLR +FBBFFBBRLL +BBBFFBBLRR +BBBFBFFRRR +FFFFBBFRRR +FBFFBBBRRR +BBBFFBFRLR +BBFBFFFLRR +FBFBFFFRRL +BBFBFBBLRR +FBBFBBBLLL +BFFFBFBLRR +FBBBBFFLLR +FBBBBFBLLR +FBBFFBBRRR +BBBFFFFRRL +BFFFBFBLLL +FBBBFBBRRR +FFBFBFBRLR +FFFFBBBRLL +BFBBBFBLRL +BBFBFFBLLR +FBFFBBBLLR +FFBBBFFRRR +FBBFBFBRLL +BBFFFFBLLR +FFBBFFFLRR +FBFFFBFLRR +BBBFFFFLRL +FFFFBFBLLR +FFFFFBFLLR +FFFFBFBLLL +FBFFBBFRLR +BBFFBBFLLR +FBFFFBBLRL +BBFBBFFLLR +BFBBFBBRLL +BFFFFFBRLR +FBBFBBFRRR +FFFBFBFRLL +BBFBBBBLLL +FFFFBFBLRR +BBBFFFBRLL +BBFFBFFLLR +FFBBBBBRRL +BFBFBBBLRL +FFBBBFBRLR +BFBFBBFRRL +FFBBBFBRRR +FFFBFBBRLL +BBFFBBBRRR +BFFBFBFLLL +BFFBBFBLRL +BFBFFFFLLR +FFBBFFBRLL +BBFBFFBRLL +BBFBFBBLLL +FBFBBBBLLL +FBFBBBFRRL +BFBFFFBLLR +BBFFBBBLLL +FBFFBFBRLL +BFBBFBBRLR +FFFBFFBRRR +BBFBFBBRRR +FBFFBBFRRR +FFBFFBFRLL +FBBFFBFLRR +BBBFBFBLRR +BBBFFBFRRR +FBBFBFBLLL +BFFFFBBLRR +FBFBFBFRLR +FBFBBFFRLR +FBFBFFBRRL +BFBBFFBRRR +FBFFBFBLLR +BFBFBFBLLL +BBFFFFFRRR +FBFBFFBLRL +BBFFBBFLLL +BFBFFFFLLL +FFBFBBFRLR +BBFFBFFLLL +BFBBFBBLLR +FFFFFBFRLL +BBFBBFFRRR +BFFFBBBRRL +BBFBBFFLLL +FBBFFBFLLR +FFBBBFBLRR +BFBFBFBRLR +BBBFFFBRRR +FBBFFBBLRR +FFBBBFFLLR +BFFFFBFLLL +BFBFFBFLLL +BBFBFFFLLL +FBFBFFBLLL +BBFFBFBRRL +BBFBBFBLRL +FBFBFFBLLR +BBFFBFBLRR +FBFFBBBRRL +FFBFFBFRRR +BBFBBBFLLL +BFBFBBBRLL diff --git a/day05/locateSeat.ts b/day05/locateSeat.ts new file mode 100644 index 0000000..f733de7 --- /dev/null +++ b/day05/locateSeat.ts @@ -0,0 +1,45 @@ +enum Instruction { + LOWER_HALF = 'LOWER_HALF', + UPPER_HALF = 'UPPER_HALF', +} + +const findNumber = ( + instructions: Instruction[], + start: number, + end: number, +): number => { + if (start === end) return start + const [instruction, ...rest] = instructions + if (rest.length === 0) { + return instruction === Instruction.LOWER_HALF ? start : end + } + if (instruction === Instruction.LOWER_HALF) { + return findNumber(rest, start, start + Math.floor((end - start) / 2)) + } + return findNumber(rest, start + Math.ceil((end - start) / 2), end) +} + +export const locateSeat = ({ rows, cols }: { rows: number; cols: number }) => ( + passId: string, +): { row: number; col: number } => ({ + row: findNumber( + passId + .split('') + .filter((s) => ['F', 'B'].includes(s)) + .map((s) => + s === 'F' ? Instruction.LOWER_HALF : Instruction.UPPER_HALF, + ), + 0, + rows - 1, + ), + col: findNumber( + passId + .split('') + .filter((s) => ['L', 'R'].includes(s)) + .map((s) => + s === 'L' ? Instruction.LOWER_HALF : Instruction.UPPER_HALF, + ), + 0, + cols - 1, + ), +}) diff --git a/day05/solution.spec.ts b/day05/solution.spec.ts new file mode 100644 index 0000000..f08daac --- /dev/null +++ b/day05/solution.spec.ts @@ -0,0 +1,31 @@ +import { loader } from '../lib/loader' +import { locateSeat } from './locateSeat' + +const load = loader(5) +const input = load('input') + +describe('Day 5: Binary Boarding', () => { + describe('Part 1', () => { + it.each([ + ['FBFBBFFRLR', 44, 5], + ['BFFFBBFRRR', 70, 7], + ['FFFBBBFRRR', 14, 7], + ['BBFFBBFRLL', 102, 4], + ])('should solve the sample: %s is row %d, col %d', (passId, row, col) => { + expect(locateSeat({ rows: 128, cols: 8 })(passId)).toEqual({ + row, + col, + }) + }) + it('should solve', () => { + const l = locateSeat({ rows: 128, cols: 8 }) + expect( + input + .map((passId) => l(passId)) + .map(({ row, col }) => row * 8 + col) + .sort((a, b) => a - b) + .pop(), + ).toEqual(951) + }) + }) +}) From 8d73865acbdf4b58f0495d7f7daccd8c162d330d Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 5 Dec 2020 12:02:07 +0100 Subject: [PATCH 021/110] feat(day05): part 2 --- day05/solution.spec.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/day05/solution.spec.ts b/day05/solution.spec.ts index f08daac..a4d659e 100644 --- a/day05/solution.spec.ts +++ b/day05/solution.spec.ts @@ -4,6 +4,8 @@ import { locateSeat } from './locateSeat' const load = loader(5) const input = load('input') +const l = locateSeat({ rows: 128, cols: 8 }) + describe('Day 5: Binary Boarding', () => { describe('Part 1', () => { it.each([ @@ -12,7 +14,7 @@ describe('Day 5: Binary Boarding', () => { ['FFFBBBFRRR', 14, 7], ['BBFFBBFRLL', 102, 4], ])('should solve the sample: %s is row %d, col %d', (passId, row, col) => { - expect(locateSeat({ rows: 128, cols: 8 })(passId)).toEqual({ + expect(l(passId)).toEqual({ row, col, }) @@ -28,4 +30,18 @@ describe('Day 5: Binary Boarding', () => { ).toEqual(951) }) }) + describe('Part 2', () => { + expect( + input + .map((passId) => l(passId)) + .map(({ row, col }) => row * 8 + col) + .sort((a, b) => a - b) + .find((id, k, arr) => { + if (arr[k - 1] === undefined) return false + if (arr[k + 1] === undefined) return false + if (id - arr[k - 1] > 1) return true + return false + }) - 1, + ).toEqual(653) + }) }) From b572946b9551b35ebc43e6ccd870fd8b300aaba9 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 5 Dec 2020 12:02:54 +0100 Subject: [PATCH 022/110] feat(day05): part 2 --- day05/solution.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/day05/solution.spec.ts b/day05/solution.spec.ts index a4d659e..9c588ce 100644 --- a/day05/solution.spec.ts +++ b/day05/solution.spec.ts @@ -39,7 +39,7 @@ describe('Day 5: Binary Boarding', () => { .find((id, k, arr) => { if (arr[k - 1] === undefined) return false if (arr[k + 1] === undefined) return false - if (id - arr[k - 1] > 1) return true + if (id - arr[k - 1] == 2) return true return false }) - 1, ).toEqual(653) From 3d5302b2becd85aa85a150a00700cd3c2b11c8e9 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 5 Dec 2020 12:24:01 +0100 Subject: [PATCH 023/110] refactor(day05): improve readability --- day05/locateSeat.ts | 48 +++++++++++++++++++++++------------------- day05/solution.spec.ts | 12 +++++------ 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/day05/locateSeat.ts b/day05/locateSeat.ts index f733de7..a981be5 100644 --- a/day05/locateSeat.ts +++ b/day05/locateSeat.ts @@ -1,44 +1,48 @@ -enum Instruction { - LOWER_HALF = 'LOWER_HALF', - UPPER_HALF = 'UPPER_HALF', -} - +/** + * Recursively follow the instructions which determine whether to use the + * upper half (true) or lower half (false) of the number range + */ const findNumber = ( - instructions: Instruction[], + instructions: boolean[], start: number, end: number, ): number => { if (start === end) return start - const [instruction, ...rest] = instructions + const [upperHalf, ...rest] = instructions if (rest.length === 0) { - return instruction === Instruction.LOWER_HALF ? start : end + // No more instructions left, decide between the two + return upperHalf === false ? start : end } - if (instruction === Instruction.LOWER_HALF) { + if (upperHalf === false) { return findNumber(rest, start, start + Math.floor((end - start) / 2)) } return findNumber(rest, start + Math.ceil((end - start) / 2), end) } +type Instruction = 'L' | 'R' | 'F' | 'B' +export type Instructions = ('L' | 'R' | 'F' | 'B')[] + +const filterInstructions = (instructions: Instructions) => (i: Instruction) => + instructions.includes(i) + +const isUpperIf = (upperInstruction: Instruction) => (i: Instruction) => + i === upperInstruction + +/** + * Implements a recursive aproach to finding the seat based on the given instructions + */ export const locateSeat = ({ rows, cols }: { rows: number; cols: number }) => ( - passId: string, + passId: Instructions, ): { row: number; col: number } => ({ row: findNumber( - passId - .split('') - .filter((s) => ['F', 'B'].includes(s)) - .map((s) => - s === 'F' ? Instruction.LOWER_HALF : Instruction.UPPER_HALF, - ), + // This converts the boarding pass instructions sequence of true/false for only the front/back operation + passId.filter(filterInstructions(['F', 'B'])).map(isUpperIf('B')), 0, rows - 1, ), col: findNumber( - passId - .split('') - .filter((s) => ['L', 'R'].includes(s)) - .map((s) => - s === 'L' ? Instruction.LOWER_HALF : Instruction.UPPER_HALF, - ), + // This converts the boarding pass instructions sequence of true/false for only the left/right operation + passId.filter(filterInstructions(['L', 'R'])).map(isUpperIf('R')), 0, cols - 1, ), diff --git a/day05/solution.spec.ts b/day05/solution.spec.ts index 9c588ce..4a29a0f 100644 --- a/day05/solution.spec.ts +++ b/day05/solution.spec.ts @@ -1,5 +1,5 @@ import { loader } from '../lib/loader' -import { locateSeat } from './locateSeat' +import { Instructions, locateSeat } from './locateSeat' const load = loader(5) const input = load('input') @@ -14,7 +14,7 @@ describe('Day 5: Binary Boarding', () => { ['FFFBBBFRRR', 14, 7], ['BBFFBBFRLL', 102, 4], ])('should solve the sample: %s is row %d, col %d', (passId, row, col) => { - expect(l(passId)).toEqual({ + expect(l(passId.split('') as Instructions)).toEqual({ row, col, }) @@ -23,7 +23,7 @@ describe('Day 5: Binary Boarding', () => { const l = locateSeat({ rows: 128, cols: 8 }) expect( input - .map((passId) => l(passId)) + .map((passId) => l(passId.split('') as Instructions)) .map(({ row, col }) => row * 8 + col) .sort((a, b) => a - b) .pop(), @@ -32,8 +32,8 @@ describe('Day 5: Binary Boarding', () => { }) describe('Part 2', () => { expect( - input - .map((passId) => l(passId)) + (input + .map((passId) => l(passId.split('') as Instructions)) .map(({ row, col }) => row * 8 + col) .sort((a, b) => a - b) .find((id, k, arr) => { @@ -41,7 +41,7 @@ describe('Day 5: Binary Boarding', () => { if (arr[k + 1] === undefined) return false if (id - arr[k - 1] == 2) return true return false - }) - 1, + }) ?? 0) - 1, ).toEqual(653) }) }) From 5a7fd52be5df6a93d01f2e8c4403b230e0151e1e Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sun, 6 Dec 2020 11:40:54 +0100 Subject: [PATCH 024/110] feat(day06): part 1 --- day06/collectAnswers.spec.ts | 8 + day06/collectAnswers.ts | 12 + day06/input.txt | 2211 ++++++++++++++++++++++++++++++++++ day06/parseGroupList.spec.ts | 32 + day06/parseGroupList.ts | 12 + day06/solution.spec.ts | 43 + 6 files changed, 2318 insertions(+) create mode 100644 day06/collectAnswers.spec.ts create mode 100644 day06/collectAnswers.ts create mode 100644 day06/input.txt create mode 100644 day06/parseGroupList.spec.ts create mode 100644 day06/parseGroupList.ts create mode 100644 day06/solution.spec.ts diff --git a/day06/collectAnswers.spec.ts b/day06/collectAnswers.spec.ts new file mode 100644 index 0000000..dde50ae --- /dev/null +++ b/day06/collectAnswers.spec.ts @@ -0,0 +1,8 @@ +import { collectAnswers } from './collectAnswers' + +describe('collectAnswers', () => { + it(`should collect all answers`, () => + expect(Object.keys(collectAnswers(['abcx', 'abcy', 'abcz']))).toHaveLength( + 6, + )) +}) diff --git a/day06/collectAnswers.ts b/day06/collectAnswers.ts new file mode 100644 index 0000000..c90b206 --- /dev/null +++ b/day06/collectAnswers.ts @@ -0,0 +1,12 @@ +export const collectAnswers = (forms: string[]): Record => + forms.reduce( + (answered, form) => + form.split('').reduce( + (answered, a) => ({ + ...answered, + [a]: (answered?.[a] ?? 0) + 1, + }), + answered, + ), + {} as Record, + ) diff --git a/day06/input.txt b/day06/input.txt new file mode 100644 index 0000000..3d0415a --- /dev/null +++ b/day06/input.txt @@ -0,0 +1,2211 @@ +ymw +w +wm +vsw +wm + +vs +lqn +ti +uvl + +fryuv +pngtvuhfr +fcbrulv + +pr +rp + +tdvcspxnujak +vektaowjncs +ifybztmhlasqrjkgc + +exvbqomlucjfi +cufeiomgvl +uolcfvmie +eoculrifnmv +fvclmdnoeiu + +iyomzvhpdjtrw +rpnovdhwzmityj + +emplyqxzfjrwb +xrezwjlsqpb +prdvzbhljqxaw + +wtuolk +kwtluj + +kixnqubme +adjgfwvl + +lkzqupo +nsfhbc +rki + +gkmqehib +ngiemuh + +m +s +s +w + +tu +arudi +gukp +u + +hkfs +hpfjk + +yzkuhrncx +dqasvifwne + +x +x +x +x +x + +zabmrcequtghsnlvdpkfij +drbelmtjasiupnhqgfvkc +hdvlprtebgamqfknijycsu +pcirvatkgmhndefulbqjs +hinfqkldbzcretsuvamjpg + +eoc +omvqig +aglo + +qgnjkcirewz +vmwhuafoxpt + +zinoybesugqjhr +fzgeasrhynq +myzngtrwqvl + +gdma +dq + +haugzib +xeghuf + +fsl +fsg +fs +fts +sf + +bysucwlra +ucwylrbas +sbkuarlcwy + +skmphtzonuydfxi +xpidmolthzywfusg +hxtysznfimdpou + +gonabqykhrzmpsl +pyrblhznoswkgqam +pgbohakrqzslmny +ogbqmyprlnkahzs + +hdcl +cdlh +hdcl +hldc +ldhc + +fiwztpbcxreqodunljvyh +fsrmnugobhydpkc + +fcloanbrm +dnkaglrxot +swvylepanjhqzoui + +upali +kyilvspz +rlejqntbmoxi +iklfdw + +tdxwaqsybovjgm +bmxjznqdt +ujtmehxqpldb +qbltpkrxjmd +qjxdzmbit + +avnituwozrgcjmsd +rwsaocnugzjmdtv +zanrotwdusjgcvm + +duqy +iu + +rnatpelzuiv +eaizntulvr +fntbrilvaezu + +vwprtg +nfrwluaodtphg +gtrszpw +writqgmp + +ayxievonwmtchp +aytxowvcpmihe +xtehvomypcwifa +hwmoytcvipjxae +yvawtmeiocxfhp + +dnrpaivezcktfwy +vdpnyfzrmcktwi +icfnyrtpzdkwv + +gejt +getj +ejgto +jtge + +btmwidzrun +mtunzdrbi +oiebudtxkrmyz +ztmbdrui +dmzbrtui + +rasxhidbgw +klxwvhbeacidsg +dhxlacgusirbn +sqabjmhtifxodg + +utpkgqjiycexosvanwl +grjfvnbuscwadmihxzk + +ktnhpvqxzfuwosmgl +fwxmtvzohnrlkgsup +hvlzfroxucmgpksnt +pslyfovbigtukzxnmh + +zde +zed +zed + +v +v + +calfotjxbg +etagbc +brackuvtzpgi +mdhapbtygcv + +hkdb +eahrxg +pohs +hujbq +dchbt + +nw +ewgr +amyh +pquwn + +o +o +o +o +ou + +oakzcxnp +xoclan +oxazcknp +hwcomfxna + +iymzjovgkdrqpalehubc +ptcgyqhrboazuv +vxyohunafqcswzgprb + +azwb +zabw +bzaw +zabw + +zu +zxi +fldo +u +p + +ejhtlbm +etblhm +mtbelh +hbltme +thbelm + +tnqxahufm +bhftnxumaq +ufbahtqnxm +amnhfxtuq +qfxumwanht + +vgdtjm +tdga + +wkzbx +tksxbwz + +niasv +cirenka + +pvbjswzixkcug +bxvjwsiugck +xcwjbkisugv +bgikucvdsjxlw +aswuxibjgcpvk + +vrjcpfuhetkd +mjbhzwctpeyk +qhwepmtljksc + +mkdb +bkmd +omkdb +kmdub +dmkb + +tmharzskfycvnio +abdmulpwjyxeqgc + +skmacnpgzho +ghsnpaczkmo +haposzmgnkc + +mrngvewdsqca +tfjyqhkxes + +ampi +m +mt + +kcduvyaqgtpfmij +vxgfiqcdlajypuk +gcyoeufqkpdijmav +cvfuqpiyeadjkg + +tblyemri +teburlymi +tneidylbrmfc + +jtmkxgehipfuasqrbwvcdyn +azwkvfhsbynrjpgmutdcqex +uobjpcgzstharyvkxefmnwdq + +etgikbzjd +zdybhkwteqig +ouitdbrfgeznvkxs +bekipadqgtzlc + +v +ale +c +h + +neqvowybzx +nybezqwxvo +zbenxwvoyq +vqbxwznyeo + +kwdm +k + +eahrozxdj +aopndezjx +emjaonxyzd +jxeaufdosz +yaoedxjz + +hzwc +s + +bnemwzv +mbzwnve +envbamzw +ebnwmvz +ezvntwbm + +djkqnrcvpseohazmflb +jyzftduhbnparmlscqovk +zksbneljmxcfdprwaovgqh + +zxfgtveb +xfbetvgz +txevgfbz +tfxbvegz + +mfcr +cfmr +mfcr +frmc +rfcm + +qsdvzyixl +zvdlqy +znydvqlku +lvndzyq + +vpok +hoyb + +lucohageisvdtfqnbrxk +naekdgslcqoftxrhbvui +oxgrunehtafkbidqclvs +vrdsfanugtihkxqlcobe + +poayngfzwb +mzyi +clxuesdvqythrjk + +vtsxloimpq +sqvxulbiomtp + +xlo +xol +lox +lxo +lox + +mqtafugsj +wahiptqjbe + +nuosc +usocn +cnuso +socaun + +rwchjlkmidbtxupfvg +jkudgvprhalcfbnymtw + +uptazbcdxywqf +buqywadtfhcx +klbduawtqyx + +klfyrxdzn +lsnrcyvzokhx +eafrzqkxly +xzlqryk +xwriykmljzugp + +gfvxdi +vtwigxdj +xdnvgyi + +vs +sepvngak +vs + +dqzfx +xqdfz +qfdzx +qxzfd + +lfdksujt +ijcdtslkf + +rxqevdwishmjfluy +lwshvauecgrfiqxyjm +txisrubqelyfwvmhj + +ijlvuenzdsykfwc +qkxacuydnehzbglsrfm + +purkflqgovscyedzhtinxa +ensuvzrftpdgcxykhqilo + +f +p +jkxa +p + +rwqcyxtbvn +rtbwcxqnyv +ytwvnbxqrc +vwxcrqtnyb + +takohlgzesf +katgsozeflh +aolgtesfhkz + +jakvrlxipqgwn +xwjhigvkqarlpn +vrlitwjqcagnkxp +ngcljqvpkrwiax + +csg +sgc +sgc +gsc +sgc + +xftrpzkynwjcils +tyzjfncspxwilrk +clxjtnsriykzpwf +rcflzkwpxjynsti +ntwxsapejzkcrilfy + +gmabr +mrbag + +idrvzjbafosemw +fvewdrjazsmibo +woisjrtdvxezkabmuf +aifmbdjowzvres +jzesabwvmdiofr + +cvsr +scvr +srvc +zcrsv +rscv + +ldjs +sdjl +sdjgl +ldjs +jlds + +vf +vf +vf +vf + +nqi +gmiywb +il + +bsvamr +qkvrab +abrqv +ktabvhr +rvbhax + +cpgsqnorkay +yproncgkqsa +okapcgqsnyr + +fhcrk +wjaxbchs +flunch +khorczi + +uyj +jyau +yuj +yju +ykjiu + +yuqwkzf +jaocfzyxpw + +ayqun +vwpzfoj + +ftkx +nftjkr + +saupfiylrhckzdmq +idwlp +ldip +wlidjp + +qhiu +suqni +iuxnq +qui +iumqzg + +xvoqnda +dloqvnxa +donvqax +vqdnoax + +ctblovfpygsmwqrjai +ivfwqgrpsjtacm +pmvqtjfragcwis + +m +ms +m +m + +v +vxcjl +tvgn + +agcvutldfnwpoqhe +panwfvugetxqo +tusfwgmoaeyvnjkpq +wvutgfoeraqmzpn + +pfelnjvha +qmzexonlv +rbyiugdswk + +spmzxl +nhbuvqcagdi + +vpfmjgitk +vefgrdkpit +gfitvkbp +pftjvgik + +eiczmbkfargtosjdlyhwuxqn +uiqdwkptonjzxlfsrgemahycb +mnfzskoytqlbhuidjagwexrc + +ylcroxz +azolxycr +rcxoylz + +ipjvbtacrsuklozxqg +gkczovaibqptulxsjr +zsuctpolbxjikqrgva +aglbcjqsvzxokrupti +tlpurqvxgazoibjsck + +chjtiyplzb +rzcplthisq +lcwgmnzvhei + +uvbqnetmkdsg +tcgizb + +anet +tnea + +b +lbm +b +b + +rjsgkvxnoctybf +onhbkjryzvtcfag +rvtbyfgxsonkjc +fcgoktjnbryv +cvgpjdnyrotfixbk + +woyzins +vml +l +ekh + +imurfjexb +iufxme +midneuxf +ztudmxife +kymfxieuod + +fjevlykwshit +jfpwistkglev +ljidewskvtf +orqwblzsevtcikjfu +xayemltwksfjivn + +jmfbqzsu +jsxbiumfv + +kuytgfqzwolpxdcnjhrsme +xwzjpqsgfmdklhytocuren + +tswk +ztqw +mdrpthif +t +tw + +rnskdcauhe +rukeyndhasc +ahsrknuecd + +mxsaerbdhgqcy +xvqybdmahreos +qyxbmgjsradhe +bqxheasyirmd +rdqehysabmx + +bkzxw +xzkwb +xkwbz +wxjzkb +bwzxk + +avlwfyqrp +jkozmedhgubsxnct + +ie +gkec +epx + +xvbisfp +zxprafsim +pwiqhkfucsx +sflxmjbivyp + +mkhg +dpnflvzhesrt +bmhu + +mpl +pml +pml +pml +pml + +hdrtnziabqscwxp +btdczqxhuwranspi +prwatsxhzbdnicq +hxrnzawpcsqbitd + +gxzafpjvciywskn +wnzvjifscrxykapog +ncsjiapyzkgvxwf +jkexzingwpvscayf +iyjzfwnckavpxsg + +xtdblwyqfsjak +uwtsncvjlm +switjlm + +j +je + +ce +c +cy + +semxdiqw +lbnmaq + +n +n +n +n + +rq +rqes +qr +rq +qr + +ibndxgtuawhokzc +wkxhgdcznjtoaiubp +uxzwtdnblapkchogi +zhtidxwvecobkgyuna +cgabuhrpioxkwdztn + +ekcrfujsopgvbwxtya +jeykusfvpxbowacrztg +frkjsygapcowxubetv +shjoyanumqkertxgbdfwpvc + +mfw +pfwm +mwfi + +ocyhq +chqye + +nzsxagpfuhmqkcy +flyqunphxm +qmpnhxufy +mjurwfpqhnyxe + +pxqf +pqx +xpq +qgpx + +bzhprgot +rzhpaoug +rmhygacqxvkpjzo + +tlzpvdgkafqw +clqvpgtkafd +lgetfbksxivdprqah +kuptalqgjfdnv + +rfkwoalbjdi +bkilwjfro +orwjlkibf +okbdflrjiaw +nrwjzoibflk + +n +n +n +n + +vznusdgkmcrxfpwojtleqhy +rveftohngkxzdljq +lefikohvbxqrjtdzng +xqtnjzvdglfkrheao + +xohambwtulqnpgf +ruxmopbjwtfncdgal +bnsptuwyvlmxzogif + +azbsgpwihlcfmuk +ahfgulbckzsm +gslafkcombuzhj +hujmklzgbafcs + +nzdqthy +wjeagzcxyiq +qzfycp + +hudclx +quczdxhl +chudlx +hlcxdu + +nrmypdbzvolxga +ykgtvfcasz +yagwvqze +zfvygja +iyzgauvht + +eitov +aizw +qjai + +ruptmgzobxa +hjvsdwylieqnkf + +njsgbwltpyeohf +gxsojntpyfwlehb +fontbepsjwgyh +mdfhypjeobsriktqanwug + +pcunvqdgxjfzokwm +awighqdejvnflp +iqdnvfpjwlgs + +upqz +zhyxjdtlv + +nq +qpns +nqfu +qnps + +lve +pi +ipf + +uafxbjp +lfpjcw +rjfp + +obh +h +h +h +h + +ezx +xze +xze +efxz +zxe + +yshdxqelnzmuipowr +oqsedljrinmytwuphx +ljnbcirxshyouqdzewp +wbiqxtrducehoylspn +rvshygoewlqunidpxfak + +e +e +e +e + +hyuwjlgxoa +chajowynxlf +wyfhlnjaox +aztohyxlwj + +eqldmuxigyhktfwbczapnrvjso +vpxflgohmqijwadnbykrecustz +kswxetzualphigncdoqjmfrybv +znilqdpkgratwjvuybxhemfocs +izjbnyvastgdchfeoxmrwqpklu + +qwjzem +ewzmcqj +cqzwejm +mwqejz +qbmkjdzew + +rvuoscwqldtnjfpyk +dstluofwkrqcjnyp +ujnytlcqwsdaokprf + +cbhwotxiglrm +iwlhgcbtrom +ibvrotmjscgwh +gkcltbmrhoxwi +tzrgowmcbihx + +dc +cd +cd +dc +cd + +pnsjqghf +ntqjfhgp +nfphezrjmgv + +gotlaypnhj +ylonphtgja +gahjotynlp +lpajtyonhg +lynopgtajh + +uqkwycrbd +dubvkqrcywm +uqdkybcrw + +hvwialzjfqecpukxdobr +fhkeaczluqwbpvrxdoji +qkabjohpwcurvxlidezf + +zjrqhwbkcdv +cvxjhbqkpwdz +omdzlwkbqgcajhv +rjcvqwzhtdkbp + +olmvrwtagfuyjbzi +mfrtbuvjizaylgow +vafmjgyubzliorwt +orbmjpvigztwafuyl + +rgmodkbs +mogs +suogdrm +togm +mogv + +hf +fha +tfh + +bcazwpirygekfoxjdtnlmuqhvs +fzkrwyuslvmajxqdienot + +xdanjtygfrwhkzblpq +jamxfwzklchngrby +hyvlbzfjrwkonga + +shaxbk +rztkmls +nwjvucedk +okt + +rpvukdoaqfywlciehjnt +qxwhtregcnilvapskuodf +ltacrhfwquvnizkdjpoey +vtqekcpnwauflhiord +hvqlkurptfaiwnemodc + +huqwrpfsilxotcazvygdnj +navdfwistcpzljgruqxoyh +lhdipqtczywaxunbfojvrsg +wotlyvzfjdqgcuarhnxpsi +qfgyonxuzavspjrdhlciwt + +qdzjxfhpnmbwtuskyceg +sxyaqfwcjehkprodzvg +iykjhqscdzfpwxoevg +qsveyhjxczwgdolfkp + +jf +xn +gpw +k +n + +nc +c +c + +iyfavqodmwgzspceblxuhk +favzwqtgkyspuixdcbhr + +hdcazlv +wtqbg +seu +krbju + +myldhzr +wutkednmhla +yidhlvcmr +omhrdgfqblpc +jlsmdxh + +omnhyavdercx +qzncxyamro +wmxynozpbauric +kcnwomxyrba +pnocxymrka + +bj +ybjk +bj + +lgqkmsndwhx +knxsqdmhlgw +msxdqwnghlk +nyxcmgwkseqhldtv + +th +qzxyw +a +m +ohu + +sujpydikhnv +vnjyhuitksp +ajenhpviskuy + +gnjvqlwfxor +fithnsacxjbkmez + +rf +uwklarfc +xrf +vrfd +fjr + +gtoxeicdfqm +gtiqmeochpdx +tedlycbxqmigao + +muxsonhgp +yudpsohm +shpmou +rmpohus +ojmhups + +cjsgzxr +axclosqg +cgxs +cgxsj +ixscg + +v +v +srgbv +vo + +doaphkmvec +adrwme +wytmaesdbun +ieqgzdxfjyam + +lcgmfa +agflc +alcfg +faolgk + +i +ibe + +jemfp +mp +pms +mp + +u +u +rda +u + +hzdl +xrgdz +vjfgdzr +zknswaeuidcmq +zd + +rjwpoqyvzcxektf +xqzwjvetofrcypk +exwjyovkrfzqpct +zctewjxlnorpqakfvy +otxcrkyqfpjewzv + +vyhnmjlgekxobps +prgbyltswioquvfmzex + +q +feq +dqwx +q +q + +i +vbytcon +zksragjq +xdf + +lqtzbjudwhm +etgyxpcvarsnko + +dupshvrnafz +zafnhrpvodus +vzpsufdnrhxa + +ylkzmodvqg +dgmvzqkloy +qkvzgdloym +glqomyzvdk +mldgqkyvoz + +v +o +v + +actqvguieyrf +uvzgaryipqtl +hrlixgyvatu +dsjokyumvirgwt + +q +q + +xqln +lqxnu +xqn +oqxvns + +i +i +xi +i + +cxtnd +dtxcn +vxctdn + +vspoaczketurxdwj +vkjlrwznespouxfcadtg +pwsrxvedktacojzu + +qdis +sud +dnsquvf +bexgrdsj + +mfjcevsywhnuplxiqrzba +ibxrpeunqhzscyfljwmv +yjbqzixfvsupcrhwlenm + +wpvmzkhb +zbvkhpwm +mbhyizvwakp + +bqfzaeoig +fbzixgaoq +foqizgb +dkibvjquszgofy +ogbfizq + +wnz +nwz +nzw + +vthxfdk +hfdkgt +vsfdthxkq + +uzr +rltz +krfqz + +aoshypdlikqfutvebgjnz +qgtdkobisc +rotbdmcwgskqxi + +trbziwe +qlmuxkbyngrt + +nuqdyjmg +nmgqydu +uqmyicgwnvld + +phmc +pd +pd + +slj +usqjl + +q +q +q +q + +zsryajnihfexcguvltk +zvhcanygretxiuk +izcquegtyhxvnakr +nrixgcuaevtyhzk +aeckhzgyqxnvtrui + +bkyhnwitqoflxuz +oqhzbntkuwyxfa +hxbywtkqnzouf +qwgkxntozihyubf +nxkzusfeocbtqwy + +xwloszbpcatn +pwzblgtanoc +abcngtwlozp +lfzabtnwpoc + +paof +paof +aokpf + +yermvpgouhilaxtsf +hiuapfsmvergxl +ulemxsipgvhfar +gfimvphualerxs +pusxveifrmglha + +qwzfjcbxvhaedmu +hczufqwejvmabdx +bvumhayeoxcqdfzjw +awhvdxnfcqzebjmu +xcfwaqubhdzmjve + +p +u + +pabrkst +kptxsb +nofjptbglks + +pwxtihaoryfqjcmk +yrzwjqiokaevmx +ypmdqrkgxubljownai + +wrezth +nbvma + +cxz +xzc + +botydczsvwgikrfa +otkfryqwmgnacisubzxd +zfcdkyaosrbtvigw + +rpestzqxokcb +qrxgimauceftnzkbhdsjw + +msuerxvhajnckb +rcahunbemkljsx +cgmsvxrhjbkuna +zxabprinwjmcshku +rucajnktbmxsh + +infwrgjphdvokebsqzy +eahcnxpljksfqbwdum +ktdpefljwqnabhs + +oilcxdjheuyprna +cpydlhaorjxuie +jzairyhpcouxeldn +hucoibrejxyldap + +jbiglmtowxvkdch +ygmjiwtdlohcxkv +cwtfxlhkmsgnvojid +rakpdiolcvxegjtmhwz +chojlykxmvtgiudw + +vnqoimutgcwyhx +iwqnecovmyg +dsgmiqeyocwnv + +wzjtrynsfqkga +awxkqtnjozdruyg +yngqeajwtzkr + +jrg +jgx +jg +gj +gj + +ryaxghznduqmkve +kxnrfzbye +nzysjlbriexk +rzfxjclenykpw +teyzrkxwno + +mhlaqj +luajh +jhla +jalh + +rdbvoqszekg +ekltghbudosivqarz +qkbgsreovzd + +r +r +r + +il +io +ix +i + +nkyrthauqjb +jyktnabhrgq + +rkjnluewc +ybgmizxto +efwlprvc + +ga +a +a +w +a + +goexmwfchknjbliap +hbxcklgnfipajwmot + +nwzgbjo +njwyclbsk +nhqjirbwv +fwvbnrjo +wjbnud + +thlemzwakn +taylrneqzmh +exsovpcnzitmfua +aetmjzn + +hcozjrtsx +sxrczhtoq +ohxgzirsct + +yojqc +ocqy +oqycd +aycqo +doqcy + +jvuigo +zvujgx + +isolkxcghzvfpajdeuyrb +hutcjnmxgyqvrkeow + +rocqg +g +gcsx +gile +ngu + +jwhoelbgiscfzakmx +wtxkmcoslzigjebafh +fzshoicblxgkemwaj + +mubtlkhjspeynw +lkstuweyjmbhnp + +tdpy +dypt + +set +ts +stol +ts + +tfisjzu +tusfzji +fusjizt +szfitju + +cwlvjiuqkgom +twedofxgvynjqa + +jhuwldvt +twhd +trwdh + +mzlqyv +gzydvqm +mejzytqvb +qmybzv + +qsdpagrf +ybfuikxm +fjdprszch +jdzcofn + +cuemfrdviynwko +ucisbdwftjyxh + +wim +wi +wi +wi + +velqabhypocmxjs +ckvqlnybrughtmapwdzs + +fleghjbtvqrzdpy +njfzrpqyhbkvdlwet +lefdyjvxrhtbqpz + +n +qn +dpn + +hsdxgiartqfczkmeoy +dmothqjezsfyikgx +wsgndtmezoyikqhfx +dfsxqpotemigyknzh + +dhirx +jxbltqdrf +rxnzdyw +xyrdw + +gztrajypuesxmonwlhdbf +opjvelthnqxgfkbdsayrzmwu + +dsqzkpj +kspqjdyz +qszdpljkm +zjpqksdn + +bdvmoeinsw +ldvma +pcytgzqrhufxmjk + +qtvdacproxhyfeig +iqevdchgxtypfr +iqyedcpgxfrvht + +tnkvcfobej +jicwsrbxeamy + +rvqnbulwdgocf +kxgoulzs +mlugyok +kuehijpagtlo + +pnayvm +vmpany +mpvnya +ymapvn +manvpy + +juandk +bqamunz +cnuxt +oshgeinw +nur + +artidpmywzx +bowqmgenkcruj + +ymbgfnv +mynvbfgl +bmfyng +mnfgbiy +nfymgb + +yc +x +y +ksfv +o + +t +gmq +lhrx +zfvb + +rzaokythm +madgkjqyhltz +thaozykm + +jlecfkhazwyqtrsgn +clrwndzstjfqkgeamh +zenxwahslptgrfcjkq + +lhn +qztv +yp + +gv +xqg +cwpierytzuh + +u +tvfy +uo +j + +ywofspubhrgjmcilekv +skejhiorglvbyufw +arezwfukjbgysvhlio + +xpnldkub +wkdnqupx +gkyjduxon + +qubrihmgokzjclvytdfaw +brueisfpazonxcqk + +mykiwzenjtblqasdoux +njuxkbytmwleqridzspa +aubkqjmyinslwdxzte + +kjdn +ts +xw +sypu +c + +iumldrvwogjbs +ujwsemlrvdibgo + +zlknvwbhy +nzms +nitsz +rnzm + +ngde +lge +buatigrcvz +xewgy +jlopdg + +xjnythqakgsruicbld +ezfwpmov + +es +se +nsaer +sxcwplje +gems + +r +s +r +r + +enkqydmrgjvsbhau +hmbgservnjkuyd +dherisgymjvbunk +beyvnhjxgumsrikd + +a +aex +oa +oa + +ibedyc +ondfctsjy +cdykvga +ywacdbvuq + +mlowux +wqplxc +lhxkwp +pwxl +lxws + +truzalwqfpcinjoh +baxwplhjrzvgfynqoic + +fdbshvkcm +dcgzskfwb +iadczkfb +ydfrqcobk + +gpisnoletr +symv +qhmfws + +bjfm +ml +mvcd +mv + +levr +v +qv +vq +v + +j +j +j + +uepmnys +ymgphe + +bvlrqpgj +qbvgrpmlj +vpjgrlqcb + +fmsuteojyqchwrdv +rdyefmqoschwj + +cnudzpksyvbeoxrijqa +iuokqscnjyvpzedarxb +sxijkqybuoavpdrzcen +zckabxsoerjduvpqiyn + +qdwinxo +cxabnqgmiwo +ienqflorpxy + +tsbxdevwi +evbtwidx +vbextiwd +dvtwixeb + +pedufvxjgarqzwy +zvgpfyqrtu +lfzybuscgmvonpr + +pgmqjt +ulaib + +jefg +vb + +ltqevp +grik +qelv + +jh +xh +h + +diaukxtvohzwnbecsgjr +znyrixahutkgbsopvewjcd +zxsbcivunhqojegrtfakwd +dwuzeagjhtcvrbnikoxs + +qnasfbreph +bpka +lpbao +paylb + +flmoxzuakb +dhtnicpys + +vsnxozukyfqmj +ritpgwelahdbc + +ndripfaw +fry +rf +rfy +rf + +dqpouiscz +dfouc +wocdlmuneb + +coiwvtezuf +tvzofcwui +cfoiwutvz +uvtocwfiz +ntvuoczifpw + +aycwonkebidt +vbekioyctad +ckmafdbiyroet + +bne +ben +ebny +nheb + +bcnvuf +fvubqnc +fuvnbc +bcevnuf + +catnl +anclt +catnl +tngcal +nlzcato + +pcohyrgfwitkjzxa +pswmtxigkzhlrjafy +rfahwkxzgtjynspi +vhfgpjtinwxakyzr +jebyraqiwfzkgtuhxdp + +ifzpyvnrxscqmealb +ypnrofazxsbelqvmci +mzxfpgroayqnbscvlie +cesyrfqvixkbhznpalm +pqsenbmxzrfyvidcal + +zyrnivgqhjxsopftadmk +humogbldxfecrpqjwa + +lgwkuxemhaifprosq +rgfsxaiwuqhkpmeol +axgfepmsukroliqhw +aiwqlusgfokmehxrp + +wmanq +owqpagm +abctmxq + +azsnmugchqfv +cqvsmfzebuhagn +qlwafvnxusgmczihd +ekzfcusqhypangvm + +jdfau +ufa +auf +ufna +fua + +jrvyckoizf +bmka + +rvmoylsthqca +ohsriqxyaczt + +gkajpilzfeodcunwsvbrhmqtyx +jdqgenacxzrhotlwbvumfkpyis + +xewygnkia +xyinagekw +nkayewgix +anyxegkiw + +qlykxzcthnprfbej +rlckniyjtzpqbefxh +cxgbtephmkryzjfswqln +hpjtfkcebzyvxlrdnq +ftkyrxblchneqpijz + +p +b + +vc +t +t +t + +vagutfpbqhielzn +bpnligtvqhaefuz +fpevuihnqbatlzg +efvzlhigupqabtn +lufiztepnqghabv + +rfbsmiknjogvhyq +mqpikvjrtfonycsbdh +svyfkbhnpmiqrojz +whnsijavbuyqkrfom +kiyjxoqvblmhfrsn + +gaxwn +pgmeaw +bfxagw +gwlsa +gkawyc + +cxqozuawvliptyjhfs +ahvuqityolspfjwzxc +xifpthoyclaqzvsjwu + +syfbj +ysjfeb +fsbj +jbgsfwk + +rquip +pjiq +pqi +piq +dqpfikv + +p +kiwh +z +fyvmrc + +yh +hygs +haye + +uqxvaojkbw +jqawxuokvb +vuxbqkjawo + +pvzba +bymav +xbyavn +abv + +nfasjxqwrgimztvcludob +ldsxumwtircqvzbynofjga +uchrlvstdmixzkjanqgowbf + +xbsdla +hupjrknzficy +tveoa + +cafoqgjdemsnk +fjivltcdmg +fgdwphcumjb +vyfxjcrgzmid + +orciqajldy +ohdqiylacm + +y +y +yu +y + +li +ilh + +lta +avle + +wnkha +awnkh +nahw +vhanlwd + +cfmurandsiexvwq +vzidurtyboemj + +gosh +hoesg +hgotel +gobhj + +wransfipukq +riflauznhqbpt +rtvaiunfqocpl + +vdajgmsqrpefytzil +txdrisplvafzujk + +elwgstkh + +epwji +jpfe +hmsryxap + +za +abokz +tazefsl +apz +zbar + +wxtufcbpdlesrzkvhgmnyjaqo +oeflsvhjwmrznckxdaqgytu + +wxydrbvmokunatqpe +xoeawvpqtdbmskrun +ovwxrkuqatdpenbm +wreubavpxmtqdnko +xwpkontbvueaqdrm + +npjrtougxm +ptojgmrnx +ngmxpjtfr +jgzxmtrnkp + +c +sc +jg + +vszrmkhqjpgayc +otswxfuibdl + +snwpgtufhaqoxberyjmkdi +tsmbkenrfdujayhwpogqi +fkgsmebvjyanocwurhdqzi + +w +s +w +w +ciy + +ydxstgncopql +umfrvjawnekibhz + +xjw +jwx +xwj +jwx +wjx + +kwgxylvafh +fyvhxklawg +klhygafwv +wyfktslgahv +wkxlmyahfgv + +git +igt +gti +otgi +git + +vnih +vionh +invh + +pstycrxzeg +yrcgtzpe +ctpzyrgs +tkyvpcbgzmri +gzpytrc + +hvlq +hzj +hz + +knrgyxumlio +dyirljutgnv +zagpinwuyhr + +mzlvrsgpid +pftrocn +awqprfnhux + +wvlpjegodb +dvbegwjpol +lzdwjkfgpobveth + +slwmnda +swmdl +sqwdlm + +iahz +hzai +iazh +izha + +ozaq +zoq +zweqo +zoq + +a +qo + +vbylpk +gferiaouxwntc +qjk +hqmks + +kmtqnhjuorx +gjmutoxqdnr +uomnjxqt +omvpxuytqnj + +mdjgyzhnrbqlkixwup +umbnjkwsdolhizgrqpx + +estfmkocwlzua +wertfzuslakm +zsxntkfewylm + +ewozvybutrlc +pcmtlz +ctflzx +zsamtckl + +rcnabkwmljygzdhpos +rpadmzhwgbolknsycj +ojhgrczpwsymklbdan +hmrwybldcskaojgznp + +vuyj +rjuy +ugyvjz + +gtbvkoi +otkbvg + +wzmshqxk +uafswryemj +cvhskzwm +xwohmgqzcs + +fezyavinmdjxwqthp +uhmydqjoewfzaxt + +ytobegs +rebynogpaw +cgyboueh + +hqmen +okqwimt + +n +n +n +n +n + +mtgye +mezq + +njpgvcwbxzqhauds +nghbqsjawpvuxdzc +zsqdahuxwpvbgnjc +vhdaqbspzwgnucxj + +sfebtowpijhcl +xtokqyecmwphlid +urtighewvpoza +tbpofwinehd + +xmlctywhong +rliwocgutxaeyvn +ptydglnfjzxbso +nogqtlxmywauvh + +rjecz +aehocvg +pyufxqbmsltw + +wquytmaroexfgzkclvb +umtzxhavjsqgwrckpb + +cgvbhlyxtifkzsewjru +rhsftpjgmwabzlcvqkuxone + +ndgizukav +zuinkavdg +udzgkvai +wgudikvza + +kfvpnot +nvpotkf +ktpvfon +pokfnvt +vfoktpn + +kqrd +rdkq +krqd +vfrqkd +qkdr + +zyqijxlfdu +zdjfixyq +zihxyfjdq +xoyikqjdbfezg + +rq +qur + +bozhntm +oeprf + +ltx +ij +s +fyvhcdqkm + +cqivpm +vmcpqi + +ntb +tbfn +nbt +pbtn +cbnpt + +a +b +yexo +f +t + +tqfazuimjbxgsvedkp +exczvifmsqwakpjtbug +xijzfqcgsvkbpteamy +esorqhmlpnbaijvtgzfxk +evsjiztqmpafgxkb + +vhljf +iknboam + +kg +jbovgtl +g +gw +iugx + +j +j +j +j +j + +omsul +ucsim + +zykn +aisxbtez +lmzc +zl + +a +a +c +a + +pkso +noku + +rpo +opr + +jh +j +j + +akqpzhoyrjwitlcxvbdume +mwyrjqzavueokiphxlbtc +yxbrckaepwiomvzqltuhj +voithcspxmwlkyaujbeqrz + +naqe +efnq +qne +qenk + +chwluymniztgrxafdb +tghnclypeiufsbkwrxam +iynhrfluwgcmadtobx + +icgwkoretxmyuzaljdvq +qxgfkuicowleaszyvrdmj +gukrvdczaqojyliewmx +rzosixlycukgdmwejavq +qmuleoaygkrjdicxvzw + +erqbuao +peoaiqnf +axoqegwm + +ikaydnx +ykja +yksae + +jmwfaqxrztivlknscghbu +zkruqhclxainsgtjvfm + +mykilgzq +gqzmlki +kwlbiqrzpdgsxj +mgqkuaiznl +cloikfzgyuq + +euba +auewb +leabfu + +zoqb +boqz +obzq +qbzo +ozqb + +lrjvtqf +jrzqltvfha +tlqfjrv + +xosvzaq +qsoa +atqso +asolq +aoqs + +ckilsdrut +ldrsjtgenqiu + +etvizsnywkjobh +jskwoevzltyibnqh + +ctkpmiyohjgbuldarn +hoyfbkvdt +zwthxsoykbd + +dciagsvnmzyruephk +aslrwitjvenxgcd +vebdqnarctisgl + +nlzs +zobwxsln +zsnl +rsiucynlz + +gziwqfy +lodmh +knarujextpscbv + +uhmobwlgj +obhmwugl +hmabwuglo +oawblgumh +owlbughm + +ucsfwbizqdenro +npsrtkmeobfdg + +rvhcidqaysukjxbpgzoe +vauhokjrsybiqcdepzgx +cjibvqsxzoyrkeufphagd +cyzpukrhxdsebogajqvi + +zcojuprtbhg +pdwbauchjtsgkn +gprtulcfhjyba +xbecghvmjtpiu + +qclaiywnujprxdotf +fiuqtwlxocrnayjdp +wdfoacnjipyqtluxr +ejdyblqnihcftpwroavux +nqiayfgucrdjlwxopt + +xhzrepycnwsm +iaxfykeblwp + +eaqkisdgcojhzw +ckhbasd +ckdhpasb +hcpydabks +sckdha + +kn +nk +nuk \ No newline at end of file diff --git a/day06/parseGroupList.spec.ts b/day06/parseGroupList.spec.ts new file mode 100644 index 0000000..522d25f --- /dev/null +++ b/day06/parseGroupList.spec.ts @@ -0,0 +1,32 @@ +import { loadString } from '../lib/loader' +import { parseGroupList } from './parseGroupList' + +describe('parseGroupList', () => { + it('should parse a list of group answers', () => { + expect( + parseGroupList( + loadString(`abc + + a + b + c + + ab + ac + + a + a + a + a + + b`), + ), + ).toEqual([ + ['abc'], + ['a', 'b', 'c'], + ['ab', 'ac'], + ['a', 'a', 'a', 'a'], + ['b'], + ]) + }) +}) diff --git a/day06/parseGroupList.ts b/day06/parseGroupList.ts new file mode 100644 index 0000000..bd81b06 --- /dev/null +++ b/day06/parseGroupList.ts @@ -0,0 +1,12 @@ +export const parseGroupList = (input: string[]): string[][] => + input.reduce( + (list, line) => { + if (line.length === 0) { + list.push([]) + return list + } + list[list.length - 1].push(line) + return list + }, + [[]] as string[][], + ) diff --git a/day06/solution.spec.ts b/day06/solution.spec.ts new file mode 100644 index 0000000..82cda6b --- /dev/null +++ b/day06/solution.spec.ts @@ -0,0 +1,43 @@ +import { loader, loadString } from '../lib/loader' +import { collectAnswers } from './collectAnswers' +import { parseGroupList } from './parseGroupList' + +const load = loader(6) + +const sumAnswers = (answers: Record[]) => + answers + .map(Object.keys) + .map((a) => a.length) + .reduce((total, i) => total + i, 0) + +describe('Day 6: Custom Customs', () => { + describe('Part 1', () => { + it('should solve the sample', () => { + expect( + sumAnswers( + parseGroupList( + loadString(`abc + + a + b + c + + ab + ac + + a + a + a + a + + b`), + ).map(collectAnswers), + ), + ).toEqual(11) + }) + it('should solve', () => + expect( + sumAnswers(parseGroupList(load('input')).map(collectAnswers)), + ).toEqual(6735)) + }) +}) From 36a618cc7d07459039a1d9d348b004981e97f417 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sun, 6 Dec 2020 11:58:16 +0100 Subject: [PATCH 025/110] feat(day06): part 2 --- day06/collectAnswers.spec.ts | 8 ++-- day06/collectAnswers.ts | 14 +++++-- day06/solution.spec.ts | 71 +++++++++++++++++++++++++++--------- 3 files changed, 69 insertions(+), 24 deletions(-) diff --git a/day06/collectAnswers.spec.ts b/day06/collectAnswers.spec.ts index dde50ae..09797b5 100644 --- a/day06/collectAnswers.spec.ts +++ b/day06/collectAnswers.spec.ts @@ -2,7 +2,9 @@ import { collectAnswers } from './collectAnswers' describe('collectAnswers', () => { it(`should collect all answers`, () => - expect(Object.keys(collectAnswers(['abcx', 'abcy', 'abcz']))).toHaveLength( - 6, - )) + expect( + Object.keys(collectAnswers(['abcx', 'abcy', 'abcz']).answers), + ).toHaveLength(6)) + it(`should count forms`, () => + expect(collectAnswers(['abcx', 'abcy', 'abcz']).n).toEqual(3)) }) diff --git a/day06/collectAnswers.ts b/day06/collectAnswers.ts index c90b206..b26564a 100644 --- a/day06/collectAnswers.ts +++ b/day06/collectAnswers.ts @@ -1,12 +1,20 @@ -export const collectAnswers = (forms: string[]): Record => +export const collectAnswers = ( + forms: string[], +): { answers: Record; n: number } => forms.reduce( (answered, form) => form.split('').reduce( (answered, a) => ({ ...answered, - [a]: (answered?.[a] ?? 0) + 1, + answers: { + ...answered.answers, + [a]: (answered.answers?.[a] ?? 0) + 1, + }, }), answered, ), - {} as Record, + { + n: forms.length, + answers: {} as Record, + }, ) diff --git a/day06/solution.spec.ts b/day06/solution.spec.ts index 82cda6b..3544b53 100644 --- a/day06/solution.spec.ts +++ b/day06/solution.spec.ts @@ -3,41 +3,76 @@ import { collectAnswers } from './collectAnswers' import { parseGroupList } from './parseGroupList' const load = loader(6) +const sample = `abc +a +b +c + +ab +ac + +a +a +a +a + +b` +const input = load('input') + +/** + * Count the questions to which anyone answered "yes" + */ const sumAnswers = (answers: Record[]) => answers .map(Object.keys) .map((a) => a.length) .reduce((total, i) => total + i, 0) +/** + * Count the questions to which everyone answered "yes" + */ +const sumAnswersByAll = ( + answers: { + answers: Record + n: number + }[], +) => + answers.reduce( + (total, { answers, n }) => + total + Object.values(answers).filter((v) => v === n).length, + 0, + ) + describe('Day 6: Custom Customs', () => { describe('Part 1', () => { it('should solve the sample', () => { expect( sumAnswers( - parseGroupList( - loadString(`abc - - a - b - c - - ab - ac - - a - a - a - a - - b`), - ).map(collectAnswers), + parseGroupList(loadString(sample)) + .map(collectAnswers) + .map(({ answers }) => answers), ), ).toEqual(11) }) it('should solve', () => expect( - sumAnswers(parseGroupList(load('input')).map(collectAnswers)), + sumAnswers( + parseGroupList(input) + .map(collectAnswers) + .map(({ answers }) => answers), + ), ).toEqual(6735)) }) + describe('Part 2', () => { + it('should solve the sample', () => { + expect( + sumAnswersByAll(parseGroupList(loadString(sample)).map(collectAnswers)), + ).toEqual(6) + }) + it('should solve', () => + expect( + sumAnswersByAll(parseGroupList(input).map(collectAnswers)), + ).toEqual(3221)) + }) }) From 21320380d175c3fdf9f828a9a9c3023b48dc3450 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sun, 6 Dec 2020 12:05:27 +0100 Subject: [PATCH 026/110] refactor: improve readability --- day06/collectAnswers.ts | 10 ++++++++-- day06/parseGroupList.ts | 3 +++ day06/solution.spec.ts | 16 ++++++++++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/day06/collectAnswers.ts b/day06/collectAnswers.ts index b26564a..cb7ea69 100644 --- a/day06/collectAnswers.ts +++ b/day06/collectAnswers.ts @@ -1,6 +1,12 @@ +export type Answers = Record + +/** + * Creates a record that counts how often a specific answer has been given + * in a list of forms (AKA a group's answers) + */ export const collectAnswers = ( forms: string[], -): { answers: Record; n: number } => +): { answers: Answers; n: number } => forms.reduce( (answered, form) => form.split('').reduce( @@ -15,6 +21,6 @@ export const collectAnswers = ( ), { n: forms.length, - answers: {} as Record, + answers: {} as Answers, }, ) diff --git a/day06/parseGroupList.ts b/day06/parseGroupList.ts index bd81b06..ea25dc5 100644 --- a/day06/parseGroupList.ts +++ b/day06/parseGroupList.ts @@ -1,3 +1,6 @@ +/** + * Group the list of answers. A blank line denotes a new group. + */ export const parseGroupList = (input: string[]): string[][] => input.reduce( (list, line) => { diff --git a/day06/solution.spec.ts b/day06/solution.spec.ts index 3544b53..11d86c7 100644 --- a/day06/solution.spec.ts +++ b/day06/solution.spec.ts @@ -1,5 +1,5 @@ import { loader, loadString } from '../lib/loader' -import { collectAnswers } from './collectAnswers' +import { Answers, collectAnswers } from './collectAnswers' import { parseGroupList } from './parseGroupList' const load = loader(6) @@ -23,10 +23,14 @@ const input = load('input') /** * Count the questions to which anyone answered "yes" */ -const sumAnswers = (answers: Record[]) => +const sumAnswers = (answers: Answers[]) => answers + // collectAnswers counts how often answer was given + // in keys to the Answers record .map(Object.keys) + // count how many entries the record has .map((a) => a.length) + // sum it up .reduce((total, i) => total + i, 0) /** @@ -34,13 +38,17 @@ const sumAnswers = (answers: Record[]) => */ const sumAnswersByAll = ( answers: { - answers: Record + answers: Answers n: number }[], ) => answers.reduce( (total, { answers, n }) => - total + Object.values(answers).filter((v) => v === n).length, + // add the number of answers which have been given by all to the total + total + + Object.values(answers) + // filter out those answers which not have been given by everyone + .filter((v) => v === n).length, 0, ) From 9d9cd5a02dd3a2cc46a18e0c448e66f4b3346b26 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sun, 6 Dec 2020 15:45:04 +0100 Subject: [PATCH 027/110] refactor: move solution methods --- day06/solution.spec.ts | 36 +++--------------------------------- day06/sumAnswers.ts | 14 ++++++++++++++ day06/sumAnswersByAll.ts | 20 ++++++++++++++++++++ 3 files changed, 37 insertions(+), 33 deletions(-) create mode 100644 day06/sumAnswers.ts create mode 100644 day06/sumAnswersByAll.ts diff --git a/day06/solution.spec.ts b/day06/solution.spec.ts index 11d86c7..df92591 100644 --- a/day06/solution.spec.ts +++ b/day06/solution.spec.ts @@ -1,6 +1,8 @@ import { loader, loadString } from '../lib/loader' -import { Answers, collectAnswers } from './collectAnswers' +import { collectAnswers } from './collectAnswers' import { parseGroupList } from './parseGroupList' +import { sumAnswers } from './sumAnswers' +import { sumAnswersByAll } from './sumAnswersByAll' const load = loader(6) const sample = `abc @@ -20,38 +22,6 @@ a b` const input = load('input') -/** - * Count the questions to which anyone answered "yes" - */ -const sumAnswers = (answers: Answers[]) => - answers - // collectAnswers counts how often answer was given - // in keys to the Answers record - .map(Object.keys) - // count how many entries the record has - .map((a) => a.length) - // sum it up - .reduce((total, i) => total + i, 0) - -/** - * Count the questions to which everyone answered "yes" - */ -const sumAnswersByAll = ( - answers: { - answers: Answers - n: number - }[], -) => - answers.reduce( - (total, { answers, n }) => - // add the number of answers which have been given by all to the total - total + - Object.values(answers) - // filter out those answers which not have been given by everyone - .filter((v) => v === n).length, - 0, - ) - describe('Day 6: Custom Customs', () => { describe('Part 1', () => { it('should solve the sample', () => { diff --git a/day06/sumAnswers.ts b/day06/sumAnswers.ts new file mode 100644 index 0000000..cf2d091 --- /dev/null +++ b/day06/sumAnswers.ts @@ -0,0 +1,14 @@ +import { Answers } from './collectAnswers' + +/** + * Count the questions to which anyone answered "yes" + */ +export const sumAnswers = (answers: Answers[]): number => + answers + // collectAnswers counts how often answer was given + // in keys to the Answers record + .map(Object.keys) + // count how many entries the record has + .map((a) => a.length) + // sum it up + .reduce((total, i) => total + i, 0) diff --git a/day06/sumAnswersByAll.ts b/day06/sumAnswersByAll.ts new file mode 100644 index 0000000..d661f94 --- /dev/null +++ b/day06/sumAnswersByAll.ts @@ -0,0 +1,20 @@ +import { Answers } from './collectAnswers' + +/** + * Count the questions to which everyone answered "yes" + */ +export const sumAnswersByAll = ( + answers: { + answers: Answers + n: number + }[], +): number => + answers.reduce( + (total, { answers, n }) => + // add the number of answers which have been given by all to the total + total + + Object.values(answers) + // filter out those answers which not have been given by everyone + .filter((v) => v === n).length, + 0, + ) From 1c98ce9526f9c0f4542dc8095ac93b815c41bac5 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Mon, 7 Dec 2020 08:29:50 +0100 Subject: [PATCH 028/110] feat(day07): parse rules --- day07/packBag.spec.ts | 44 +++++++++++++++++++++++++++ day07/parseRules.spec.ts | 65 ++++++++++++++++++++++++++++++++++++++++ day07/parseRules.ts | 39 ++++++++++++++++++++++++ 3 files changed, 148 insertions(+) create mode 100644 day07/packBag.spec.ts create mode 100644 day07/parseRules.spec.ts create mode 100644 day07/parseRules.ts diff --git a/day07/packBag.spec.ts b/day07/packBag.spec.ts new file mode 100644 index 0000000..62ec841 --- /dev/null +++ b/day07/packBag.spec.ts @@ -0,0 +1,44 @@ +import { loadString } from '../lib/loader' +import { parseRules } from './parseRules' +/** + * These rules specify the required contents for 9 bag types. In this example, + * every faded blue bag is empty, every vibrant plum bag contains 11 bags + * (5 faded blue and 6 dotted black), and so on. + */ +const sample = `light red bags contain 1 bright white bag, 2 muted yellow bags. +dark orange bags contain 3 bright white bags, 4 muted yellow bags. +bright white bags contain 1 shiny gold bag. +muted yellow bags contain 2 shiny gold bags, 9 faded blue bags. +shiny gold bags contain 1 dark olive bag, 2 vibrant plum bags. +dark olive bags contain 3 faded blue bags, 4 dotted black bags. +vibrant plum bags contain 5 faded blue bags, 6 dotted black bags. +faded blue bags contain no other bags. +dotted black bags contain no other bags.` + +describe('packBag', () => { + /** + * You have a shiny gold bag. If you wanted to carry it in at least one + * other bag, how many different bag colors would be valid for the outermost + * bag? (In other words: how many colors can, eventually, contain at least + * one shiny gold bag?) + * + * In the above rules, the following options would be available to you: + * + * A bright white bag, which can hold your shiny gold bag directly. + * A muted yellow bag, which can hold your shiny gold bag directly, plus some other bags. + * A dark orange bag, which can hold bright white and muted yellow bags, either of which could then hold your shiny gold bag. + * A light red bag, which can hold bright white and muted yellow bags, either of which could then hold your shiny gold bag. + * So, in this example, the number of bag colors that can eventually contain at least one shiny gold bag is 4. + */ + it('should pack a shiny gold bag', () => { + const rules = parseRules(loadString(sample)) + const packager = packBag(rules) + const colors = Object.keys(packager('shiny gold')) + expect(colors).toEqual([ + 'bright white', + 'muted yellow', + 'dark orange', + 'light red', + ]) + }) +}) diff --git a/day07/parseRules.spec.ts b/day07/parseRules.spec.ts new file mode 100644 index 0000000..8a0196b --- /dev/null +++ b/day07/parseRules.spec.ts @@ -0,0 +1,65 @@ +import { loadString } from '../lib/loader' +import { parseRules, parseRuleLine } from './parseRules' + +const sample = `light red bags contain 1 bright white bag, 2 muted yellow bags. +dark orange bags contain 3 bright white bags, 4 muted yellow bags. +bright white bags contain 1 shiny gold bag. +muted yellow bags contain 2 shiny gold bags, 9 faded blue bags. +shiny gold bags contain 1 dark olive bag, 2 vibrant plum bags. +dark olive bags contain 3 faded blue bags, 4 dotted black bags. +vibrant plum bags contain 5 faded blue bags, 6 dotted black bags. +faded blue bags contain no other bags. +dotted black bags contain no other bags.` + +describe('parseRule', () => { + it.each([ + [ + 'light red bags contain 1 bright white bag, 2 muted yellow bags.', + { + color: 'light red', + children: { 'bright white': 1, 'muted yellow': 2 }, + }, + ], + [ + 'bright white bags contain 1 shiny gold bag.', + { + color: 'bright white', + children: { 'shiny gold': 1 }, + }, + ], + [ + 'faded blue bags contain no other bags.', + { + color: 'faded blue', + }, + ], + ])(`should parse %s into %s`, (rule, expected) => { + expect(parseRuleLine(rule)).toEqual(expected) + }) +}) + +describe('parseRules', () => { + it('should parse the rules', () => { + /* + Test that it parses the rules into trees: + + light red + / \ + 1 2 + / \ + white muted yellow + + */ + const rules = parseRules(loadString(sample)) + expect(Object.keys(rules)).toHaveLength(9) + // top level bag is light red + const lightRed = rules['light red'] + expect(lightRed.color).toEqual('light red') + // It does not have parents + expect(lightRed.children?.['bright white']).toEqual(1) + expect(lightRed.children?.['muted yellow']).toEqual(2) + // Bottom level is faded blue + const fadedBlue = rules['faded blue'] + expect(fadedBlue.children).toBeUndefined() + }) +}) diff --git a/day07/parseRules.ts b/day07/parseRules.ts new file mode 100644 index 0000000..ce565e0 --- /dev/null +++ b/day07/parseRules.ts @@ -0,0 +1,39 @@ +export type Bag = { + color: string + children?: Record +} + +const ruleDef = /^(?[a-z ]+) bags contain (?.+)/ +const contentsRuleDef = /^(?[0-9]+) (?[a-z ]+) bags?/ + +export const parseRuleLine = (rule: string): Bag | undefined => { + const match = ruleDef.exec(rule) + if (match === null) return + const children = match.groups.contents + .split(',') + .map((s) => s.trim()) + .filter((s) => s !== undefined) + .filter((s) => !/no other bags/.test(s)) + .map((s) => contentsRuleDef.exec(s)) + .reduce( + (children, child) => ({ + ...children, + [child?.groups.color]: parseInt(child?.groups.amount, 10), + }), + {}, + ) + return { + color: match.groups.color as string, + children: Object.keys(children).length === 0 ? undefined : children, + } +} + +export const parseRules = (rules: string[]): Record => + rules.reduce((bags, rule) => { + const bag = parseRuleLine(rule) + if (bag === undefined) return bags + return { + ...bags, + [bag.color]: bag, + } + }, {}) From 25a2f8ef1721ca779c442762e893e51d236e9230 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Mon, 7 Dec 2020 09:08:04 +0100 Subject: [PATCH 029/110] feat(day07): part 1 --- day07/input.txt | 594 +++++++++++++++++++++++++++++++++++++++++ day07/packBag.spec.ts | 44 --- day07/packBag.ts | 22 ++ day07/parseRules.ts | 20 +- day07/solution.spec.ts | 41 +++ 5 files changed, 668 insertions(+), 53 deletions(-) create mode 100644 day07/input.txt delete mode 100644 day07/packBag.spec.ts create mode 100644 day07/packBag.ts create mode 100644 day07/solution.spec.ts diff --git a/day07/input.txt b/day07/input.txt new file mode 100644 index 0000000..cf4a371 --- /dev/null +++ b/day07/input.txt @@ -0,0 +1,594 @@ +dotted blue bags contain 5 wavy green bags, 3 pale beige bags. +dull lime bags contain 1 dotted olive bag, 3 dim brown bags. +mirrored magenta bags contain 3 mirrored gray bags, 2 plaid beige bags, 4 dull brown bags, 3 pale plum bags. +posh coral bags contain 2 light blue bags, 2 dotted purple bags, 1 pale fuchsia bag, 2 light cyan bags. +bright orange bags contain 2 shiny chartreuse bags. +plaid salmon bags contain 1 faded coral bag, 4 clear lavender bags, 5 wavy tan bags. +wavy lavender bags contain 2 drab purple bags, 2 light brown bags, 2 wavy tomato bags, 1 mirrored plum bag. +clear indigo bags contain 4 dark magenta bags, 2 shiny brown bags. +posh salmon bags contain 4 dull tomato bags, 3 drab black bags, 5 mirrored chartreuse bags, 4 shiny blue bags. +mirrored coral bags contain 4 faded aqua bags, 2 plaid plum bags, 5 striped tan bags, 5 wavy tomato bags. +dotted purple bags contain 1 faded gold bag. +bright purple bags contain 2 muted indigo bags, 3 pale maroon bags, 4 dim coral bags, 2 dark blue bags. +drab olive bags contain 2 shiny coral bags. +dim orange bags contain 1 faded turquoise bag. +drab aqua bags contain 1 faded black bag, 4 clear lavender bags. +bright salmon bags contain 2 bright aqua bags. +dim brown bags contain 1 bright yellow bag, 3 faded cyan bags, 4 dotted chartreuse bags. +clear tan bags contain 2 posh tomato bags, 4 bright tan bags, 1 mirrored gray bag. +faded beige bags contain 2 mirrored olive bags, 5 dark chartreuse bags. +drab chartreuse bags contain 1 shiny white bag. +faded coral bags contain 4 dotted green bags, 2 dim violet bags, 3 striped magenta bags. +vibrant crimson bags contain 5 shiny gray bags, 2 muted black bags, 2 posh brown bags. +mirrored aqua bags contain 5 bright brown bags, 3 mirrored tomato bags, 3 bright bronze bags, 1 shiny magenta bag. +dotted salmon bags contain 2 muted tan bags, 4 light bronze bags. +vibrant salmon bags contain 5 dull yellow bags, 5 wavy tan bags, 3 light fuchsia bags, 1 drab tan bag. +vibrant olive bags contain 2 pale white bags, 2 dull coral bags, 1 mirrored magenta bag, 2 clear crimson bags. +shiny plum bags contain 3 dotted chartreuse bags, 1 striped tomato bag, 4 clear indigo bags. +pale fuchsia bags contain 1 mirrored indigo bag, 2 plaid aqua bags, 1 striped teal bag, 4 drab salmon bags. +wavy beige bags contain 1 mirrored coral bag, 1 bright plum bag, 2 dark lavender bags. +drab silver bags contain 5 vibrant gold bags, 5 pale gray bags. +light salmon bags contain 2 drab chartreuse bags, 3 faded gray bags, 3 pale gray bags, 1 clear olive bag. +faded red bags contain 5 dull chartreuse bags, 2 plaid aqua bags. +clear maroon bags contain 2 muted lavender bags. +dull green bags contain 3 pale olive bags, 5 vibrant gold bags, 2 clear teal bags, 5 dotted plum bags. +striped white bags contain 1 dim cyan bag. +pale coral bags contain 5 dim purple bags, 3 faded silver bags, 3 dim blue bags, 3 dotted brown bags. +drab green bags contain 5 pale teal bags. +posh tomato bags contain 4 drab fuchsia bags, 5 dark brown bags. +shiny chartreuse bags contain 5 dim maroon bags, 5 dull indigo bags, 5 pale purple bags, 3 vibrant gold bags. +dark plum bags contain 4 muted tan bags. +faded green bags contain 4 drab lavender bags. +pale tomato bags contain 3 bright maroon bags, 4 pale turquoise bags, 4 dark gold bags, 3 dull indigo bags. +striped aqua bags contain 1 dull gray bag, 5 dim blue bags, 5 wavy cyan bags. +dotted lavender bags contain 4 pale plum bags, 2 bright coral bags. +light gold bags contain 3 light tan bags, 4 clear indigo bags, 3 shiny tan bags. +striped maroon bags contain 5 drab tan bags, 1 pale black bag. +plaid black bags contain 3 dull fuchsia bags. +dim beige bags contain 1 dim teal bag, 1 muted salmon bag. +mirrored teal bags contain 2 bright coral bags, 4 dotted brown bags, 5 vibrant white bags, 3 clear magenta bags. +faded gold bags contain no other bags. +faded yellow bags contain 1 faded brown bag, 3 clear tomato bags. +bright violet bags contain 1 faded lime bag, 5 dark chartreuse bags, 1 shiny black bag, 3 vibrant yellow bags. +shiny fuchsia bags contain 2 dotted plum bags. +dim aqua bags contain 1 dim cyan bag. +dotted fuchsia bags contain 5 muted blue bags, 1 pale brown bag, 2 shiny salmon bags. +dim fuchsia bags contain 3 muted tomato bags, 2 striped lime bags, 2 clear white bags, 2 striped blue bags. +faded teal bags contain 1 wavy gold bag, 1 clear coral bag, 3 pale crimson bags. +dull plum bags contain 1 bright tan bag, 5 light violet bags, 5 shiny black bags. +light cyan bags contain 1 mirrored turquoise bag, 1 dim gray bag, 5 faded white bags. +vibrant cyan bags contain 1 dotted gold bag, 1 mirrored indigo bag. +bright coral bags contain 1 pale lavender bag, 3 mirrored olive bags, 3 muted tan bags. +dim chartreuse bags contain 3 pale white bags, 5 faded white bags, 3 mirrored magenta bags, 5 faded black bags. +pale green bags contain 3 faded white bags, 5 dotted lavender bags. +wavy gray bags contain 3 wavy tomato bags, 4 dull gray bags, 4 shiny teal bags, 5 pale beige bags. +dotted cyan bags contain 4 bright white bags. +shiny olive bags contain 2 wavy chartreuse bags, 5 dim chartreuse bags, 4 pale gold bags, 1 posh crimson bag. +drab maroon bags contain 3 clear olive bags, 4 dotted blue bags, 4 dim magenta bags. +striped purple bags contain 4 wavy beige bags, 1 pale orange bag, 1 pale brown bag. +dull olive bags contain 2 vibrant yellow bags. +faded tomato bags contain 4 light turquoise bags. +dotted maroon bags contain 2 faded cyan bags, 3 muted tomato bags, 1 shiny aqua bag, 3 bright orange bags. +wavy turquoise bags contain 1 drab magenta bag. +plaid green bags contain 1 light blue bag, 1 mirrored silver bag, 5 striped gold bags. +drab indigo bags contain 5 dull aqua bags. +plaid crimson bags contain 1 posh yellow bag, 5 shiny cyan bags. +drab salmon bags contain 3 bright lavender bags, 4 bright violet bags, 1 mirrored brown bag, 4 shiny gold bags. +dim turquoise bags contain 5 wavy brown bags, 4 mirrored yellow bags. +pale bronze bags contain 2 dotted bronze bags, 5 dim purple bags, 1 plaid red bag. +striped blue bags contain 5 drab fuchsia bags. +wavy aqua bags contain 5 posh plum bags, 1 striped bronze bag, 4 dark magenta bags. +posh beige bags contain 1 faded lime bag, 3 wavy white bags, 2 mirrored gray bags. +plaid magenta bags contain 4 light olive bags, 3 faded salmon bags. +plaid gray bags contain 1 light indigo bag, 5 muted indigo bags. +mirrored white bags contain 3 muted gray bags, 4 dotted beige bags, 5 dotted salmon bags, 5 muted gold bags. +dull chartreuse bags contain 3 muted gray bags. +faded cyan bags contain 4 light violet bags, 4 faded lime bags, 2 bright silver bags, 3 pale olive bags. +mirrored red bags contain 1 dotted violet bag, 5 bright plum bags, 2 pale violet bags, 4 pale plum bags. +shiny purple bags contain 2 pale magenta bags, 2 shiny fuchsia bags. +vibrant plum bags contain 5 light bronze bags, 3 plaid lavender bags, 1 shiny coral bag, 2 vibrant yellow bags. +shiny lime bags contain 1 posh black bag. +mirrored salmon bags contain 5 dull magenta bags, 2 clear gray bags, 1 dim indigo bag, 4 light brown bags. +dotted violet bags contain 2 pale violet bags. +muted orange bags contain 5 dark coral bags, 3 mirrored tomato bags, 1 dotted green bag. +bright lime bags contain 3 shiny gold bags, 4 plaid lavender bags, 3 dull gold bags. +pale lavender bags contain no other bags. +clear aqua bags contain 2 plaid turquoise bags. +clear white bags contain 4 shiny coral bags, 5 striped gold bags, 2 mirrored magenta bags. +clear chartreuse bags contain 1 posh lime bag. +wavy silver bags contain 3 clear orange bags, 2 clear lavender bags. +posh cyan bags contain 1 shiny crimson bag. +light plum bags contain 1 plaid lavender bag. +dim lime bags contain 5 bright crimson bags, 3 dark green bags, 2 vibrant green bags, 3 pale maroon bags. +dim coral bags contain 4 muted crimson bags, 1 mirrored plum bag. +pale salmon bags contain 5 wavy orange bags, 4 dotted gold bags, 4 posh brown bags. +faded chartreuse bags contain 1 dotted chartreuse bag, 3 wavy orange bags. +faded olive bags contain 5 pale blue bags, 3 dim yellow bags, 1 dotted gray bag, 2 dim crimson bags. +clear lime bags contain 3 dull fuchsia bags, 4 wavy red bags. +bright blue bags contain 3 mirrored violet bags, 3 pale gold bags, 4 drab salmon bags, 5 dull silver bags. +muted maroon bags contain 5 dull salmon bags, 3 dim gray bags. +clear teal bags contain 2 muted tomato bags, 4 faded turquoise bags. +shiny white bags contain 1 posh red bag, 3 dotted red bags. +light magenta bags contain 4 drab olive bags. +vibrant coral bags contain 5 pale lavender bags, 5 plaid red bags. +wavy yellow bags contain 3 vibrant beige bags, 4 muted crimson bags, 4 bright white bags, 1 pale maroon bag. +bright black bags contain 2 striped maroon bags. +plaid lavender bags contain 1 drab turquoise bag. +light crimson bags contain 2 wavy chartreuse bags. +muted salmon bags contain 2 bright orange bags, 3 dotted plum bags, 3 light magenta bags. +striped teal bags contain 4 dark chartreuse bags, 1 dim maroon bag. +dull bronze bags contain no other bags. +dotted bronze bags contain 1 striped orange bag, 5 shiny cyan bags, 2 muted tan bags. +dark gold bags contain 3 pale plum bags, 3 mirrored olive bags. +mirrored lime bags contain 3 dim maroon bags, 3 light violet bags, 2 mirrored turquoise bags, 3 vibrant yellow bags. +clear violet bags contain 2 drab salmon bags, 4 pale gray bags, 4 striped tan bags, 5 mirrored blue bags. +plaid beige bags contain 3 dull gold bags. +shiny salmon bags contain 3 dark chartreuse bags, 4 bright yellow bags, 5 dark gold bags, 2 muted tomato bags. +dull brown bags contain 1 bright silver bag, 4 muted tan bags. +dull orange bags contain 1 dim bronze bag. +vibrant lavender bags contain 4 dotted violet bags, 3 striped lime bags. +light blue bags contain 2 shiny teal bags, 5 striped orange bags, 5 shiny gray bags. +plaid teal bags contain 4 dark turquoise bags, 4 posh indigo bags, 1 mirrored tan bag. +drab black bags contain 4 vibrant chartreuse bags, 4 dim turquoise bags. +light beige bags contain 3 pale aqua bags. +mirrored gray bags contain 5 dark chartreuse bags. +faded black bags contain 4 shiny salmon bags. +light yellow bags contain 1 dotted magenta bag. +bright red bags contain 5 bright bronze bags, 3 dull white bags, 3 dim plum bags, 3 light tan bags. +mirrored lavender bags contain 5 faded chartreuse bags. +shiny coral bags contain 3 plaid chartreuse bags, 1 pale lavender bag. +clear bronze bags contain 4 mirrored silver bags, 1 dim coral bag, 3 posh teal bags. +dotted yellow bags contain 1 bright crimson bag, 5 dotted olive bags. +light bronze bags contain 4 dim maroon bags, 3 shiny crimson bags. +wavy tomato bags contain 5 dull red bags, 3 wavy cyan bags, 4 dark gold bags. +dotted turquoise bags contain 5 muted silver bags. +posh orange bags contain 2 bright beige bags, 5 vibrant chartreuse bags, 3 drab green bags. +wavy bronze bags contain 1 dark coral bag. +plaid tan bags contain 1 vibrant bronze bag. +wavy red bags contain 4 dotted gray bags, 2 pale purple bags, 1 bright tan bag. +dull turquoise bags contain 4 dull crimson bags. +faded brown bags contain 5 muted teal bags. +dark violet bags contain 1 dim gold bag, 1 dim beige bag, 5 dull orange bags. +bright brown bags contain 1 plaid aqua bag, 4 light cyan bags. +dull teal bags contain 4 shiny teal bags. +dotted white bags contain 3 pale black bags, 2 drab black bags, 5 faded fuchsia bags, 1 plaid black bag. +dark magenta bags contain 5 shiny teal bags, 4 pale purple bags. +mirrored maroon bags contain 3 plaid chartreuse bags, 2 muted orange bags, 5 pale gray bags, 4 drab green bags. +faded magenta bags contain 1 bright green bag, 5 pale lavender bags, 4 posh fuchsia bags, 2 pale teal bags. +wavy violet bags contain 4 bright indigo bags. +posh gold bags contain 1 bright green bag, 3 dim cyan bags. +muted silver bags contain 3 light lime bags, 4 wavy indigo bags, 5 striped turquoise bags, 5 clear blue bags. +muted fuchsia bags contain 2 pale olive bags, 1 light maroon bag, 3 plaid blue bags, 1 light blue bag. +posh turquoise bags contain 3 light lime bags, 4 wavy tomato bags, 3 vibrant blue bags, 3 posh fuchsia bags. +dull purple bags contain 1 striped tan bag, 2 vibrant tomato bags, 2 dim brown bags, 2 shiny fuchsia bags. +light fuchsia bags contain 2 mirrored turquoise bags, 4 striped lime bags, 4 faded white bags. +dull gold bags contain 5 plaid tan bags, 2 light bronze bags, 1 striped tan bag. +wavy olive bags contain 4 vibrant maroon bags, 1 drab salmon bag. +pale beige bags contain 1 wavy white bag, 1 dotted orange bag, 4 dim gray bags. +clear crimson bags contain 4 dull blue bags. +dotted tomato bags contain 5 dotted olive bags. +drab purple bags contain 1 striped tan bag, 3 mirrored olive bags, 4 mirrored turquoise bags. +plaid red bags contain 2 bright cyan bags, 5 pale lavender bags, 3 dark chartreuse bags, 1 dotted plum bag. +posh silver bags contain 5 light olive bags, 5 bright white bags, 5 light violet bags, 4 faded orange bags. +muted teal bags contain 2 wavy violet bags. +light red bags contain 2 dull white bags, 4 drab fuchsia bags. +bright crimson bags contain 4 light lavender bags, 2 dotted plum bags. +plaid purple bags contain 5 dull magenta bags, 5 light lavender bags. +dark gray bags contain 4 dull plum bags, 5 muted tomato bags, 3 drab brown bags. +vibrant gray bags contain 4 posh black bags. +plaid fuchsia bags contain 1 posh lime bag. +striped chartreuse bags contain 4 posh teal bags, 1 bright purple bag, 1 clear white bag. +dull fuchsia bags contain 3 bright brown bags, 3 striped olive bags, 2 faded white bags. +muted beige bags contain 4 drab chartreuse bags. +vibrant beige bags contain 4 striped crimson bags. +vibrant indigo bags contain 5 dull plum bags, 1 dull maroon bag, 2 striped white bags. +dull silver bags contain 5 dull white bags, 2 dull gold bags, 4 shiny cyan bags, 4 wavy gold bags. +dim blue bags contain 5 posh yellow bags, 5 dim maroon bags. +posh white bags contain 4 dim teal bags, 4 light brown bags. +mirrored tomato bags contain 1 posh purple bag, 3 striped aqua bags. +light black bags contain 1 mirrored chartreuse bag, 3 muted yellow bags, 4 muted tan bags. +plaid silver bags contain 2 dull beige bags, 5 bright tan bags, 5 posh tomato bags. +shiny violet bags contain 1 plaid beige bag, 3 faded teal bags, 4 dotted tomato bags, 1 shiny orange bag. +dull black bags contain 5 vibrant coral bags, 2 clear orange bags. +dim white bags contain 5 drab brown bags, 2 plaid lavender bags. +wavy salmon bags contain 5 dull white bags, 5 vibrant crimson bags, 2 posh silver bags, 1 dim purple bag. +dark green bags contain 1 dull magenta bag, 3 light tomato bags, 1 pale olive bag, 5 pale brown bags. +light chartreuse bags contain 1 dotted silver bag, 3 bright maroon bags, 4 vibrant silver bags, 5 bright coral bags. +dim green bags contain 3 wavy bronze bags, 3 bright tan bags, 1 dotted magenta bag. +shiny tan bags contain 3 striped turquoise bags, 4 drab brown bags, 2 wavy tan bags, 3 light fuchsia bags. +muted lime bags contain 4 dark yellow bags, 5 vibrant blue bags. +dark coral bags contain 5 plaid chartreuse bags. +striped fuchsia bags contain 4 light lavender bags, 4 dull gray bags, 5 wavy cyan bags, 2 striped orange bags. +shiny maroon bags contain 3 striped olive bags, 5 dull green bags, 4 shiny cyan bags. +dotted red bags contain 5 light violet bags, 4 plaid chartreuse bags. +dim salmon bags contain 1 dim blue bag, 3 dotted indigo bags, 4 pale crimson bags, 3 drab blue bags. +pale magenta bags contain 5 pale violet bags, 1 dark blue bag. +clear coral bags contain 2 faded turquoise bags, 2 shiny cyan bags, 4 dull red bags. +dim black bags contain 4 dim aqua bags, 5 pale blue bags. +clear cyan bags contain 2 light violet bags, 5 drab salmon bags, 4 dark teal bags. +dull gray bags contain 2 bright lavender bags, 3 pale plum bags, 5 dull plum bags. +dull salmon bags contain 4 posh violet bags, 3 mirrored indigo bags, 3 plaid tomato bags. +pale cyan bags contain 2 pale chartreuse bags, 4 light brown bags, 1 plaid beige bag, 3 light maroon bags. +faded indigo bags contain 3 dim maroon bags, 3 mirrored violet bags. +wavy orange bags contain 3 plaid purple bags. +dim plum bags contain 2 wavy tomato bags. +pale turquoise bags contain 2 faded lime bags. +drab orange bags contain 2 mirrored turquoise bags, 5 plaid tomato bags, 3 dotted blue bags, 5 wavy red bags. +mirrored cyan bags contain 5 muted chartreuse bags, 4 dim cyan bags, 5 posh fuchsia bags. +vibrant purple bags contain 5 dotted turquoise bags. +posh red bags contain 4 faded turquoise bags, 2 light violet bags. +muted crimson bags contain 5 shiny fuchsia bags. +drab magenta bags contain 1 dull fuchsia bag. +wavy tan bags contain 1 mirrored plum bag. +vibrant tomato bags contain 3 plaid blue bags, 3 clear fuchsia bags, 5 dark yellow bags. +mirrored gold bags contain 3 muted purple bags, 5 dark indigo bags, 5 dotted brown bags, 1 mirrored olive bag. +mirrored plum bags contain 3 faded turquoise bags. +muted gray bags contain 4 light bronze bags. +light olive bags contain 3 bright lavender bags, 4 wavy orange bags, 3 clear lavender bags. +faded tan bags contain 4 vibrant red bags, 1 drab bronze bag, 5 mirrored plum bags. +posh plum bags contain 4 dotted gold bags, 4 dotted plum bags, 2 vibrant gold bags. +faded maroon bags contain 5 dim red bags. +drab teal bags contain 5 faded chartreuse bags, 2 faded silver bags. +clear black bags contain 2 pale red bags, 3 plaid black bags. +mirrored indigo bags contain 3 dim chartreuse bags, 1 wavy violet bag, 1 dull green bag. +pale teal bags contain 4 wavy indigo bags. +drab cyan bags contain 4 dotted plum bags, 5 dim red bags. +striped salmon bags contain 4 clear olive bags, 4 wavy orange bags. +faded bronze bags contain 5 mirrored olive bags, 2 dark green bags. +muted magenta bags contain 2 mirrored beige bags, 1 wavy orange bag, 3 light salmon bags. +wavy plum bags contain 5 light cyan bags, 2 drab turquoise bags. +dark lavender bags contain 2 dim coral bags. +faded lavender bags contain 4 wavy bronze bags, 3 dim yellow bags. +dark maroon bags contain 5 striped orange bags. +clear fuchsia bags contain 1 dull brown bag, 4 posh red bags, 3 plaid purple bags. +shiny magenta bags contain 2 striped maroon bags, 5 mirrored olive bags, 2 drab lime bags. +wavy coral bags contain 4 posh maroon bags, 5 dim white bags, 5 pale indigo bags, 5 dotted maroon bags. +dark silver bags contain 3 posh plum bags. +shiny blue bags contain 1 wavy indigo bag, 4 dark magenta bags, 4 light turquoise bags. +clear lavender bags contain 1 bright violet bag, 4 wavy cyan bags, 2 dim blue bags, 5 posh violet bags. +shiny orange bags contain 2 pale tomato bags, 1 pale teal bag. +mirrored beige bags contain 5 dotted gold bags, 1 faded violet bag, 4 striped gray bags. +bright cyan bags contain 4 muted tomato bags, 1 drab turquoise bag, 4 bright yellow bags. +vibrant fuchsia bags contain 4 striped tan bags, 1 dark black bag, 4 plaid olive bags, 2 wavy aqua bags. +pale olive bags contain 4 posh yellow bags, 4 pale plum bags. +dotted crimson bags contain 3 dim gray bags, 1 mirrored lime bag. +vibrant orange bags contain 5 striped orange bags, 3 plaid blue bags. +light brown bags contain 4 dotted chartreuse bags. +muted plum bags contain 1 muted indigo bag, 5 plaid yellow bags, 1 vibrant silver bag, 1 drab turquoise bag. +dotted chartreuse bags contain 5 dotted red bags, 5 light lavender bags, 4 pale black bags, 3 muted tomato bags. +bright chartreuse bags contain 5 dim salmon bags, 5 shiny salmon bags, 4 bright plum bags, 2 dark lavender bags. +dim gray bags contain 3 dull indigo bags. +faded fuchsia bags contain 2 muted blue bags, 1 mirrored blue bag, 2 dotted green bags, 5 mirrored olive bags. +striped tomato bags contain 4 dull gray bags, 1 vibrant plum bag, 3 mirrored coral bags. +clear turquoise bags contain 4 light orange bags, 3 faded black bags, 5 mirrored lavender bags, 5 posh white bags. +dotted gray bags contain 4 mirrored turquoise bags, 5 light lavender bags, 1 vibrant yellow bag, 4 dull bronze bags. +shiny beige bags contain 3 plaid silver bags, 2 faded chartreuse bags, 2 vibrant lavender bags, 2 wavy olive bags. +pale red bags contain 4 mirrored olive bags. +mirrored silver bags contain 2 vibrant maroon bags, 5 plaid chartreuse bags, 4 vibrant plum bags, 5 faded white bags. +plaid aqua bags contain 5 faded aqua bags, 4 dotted fuchsia bags. +dull yellow bags contain 5 bright turquoise bags, 3 posh plum bags, 1 pale white bag. +faded orange bags contain 3 dotted bronze bags, 1 mirrored tan bag. +wavy green bags contain 1 wavy turquoise bag. +posh tan bags contain 5 striped lavender bags, 4 posh tomato bags. +wavy crimson bags contain 4 pale lavender bags, 2 mirrored tan bags, 5 plaid beige bags. +striped yellow bags contain 3 shiny green bags, 5 dark gold bags, 4 drab teal bags, 3 drab olive bags. +pale plum bags contain 2 dull indigo bags, 1 dotted plum bag, 1 bright yellow bag. +pale yellow bags contain 2 bright green bags, 5 dull beige bags, 3 light coral bags, 3 dull red bags. +striped silver bags contain 1 clear crimson bag, 4 shiny salmon bags. +bright silver bags contain 2 shiny black bags, 3 faded gold bags, 5 bright yellow bags. +shiny red bags contain 1 pale turquoise bag, 5 shiny beige bags. +posh chartreuse bags contain 5 dotted maroon bags, 5 shiny bronze bags, 1 shiny cyan bag, 3 pale aqua bags. +wavy teal bags contain 4 mirrored plum bags, 4 drab silver bags, 3 pale green bags, 1 mirrored lime bag. +posh olive bags contain 2 dim salmon bags, 1 faded black bag, 1 light lime bag. +dark fuchsia bags contain 3 mirrored indigo bags. +dark cyan bags contain 4 muted indigo bags, 4 shiny crimson bags, 2 drab turquoise bags. +posh magenta bags contain 5 bright blue bags, 1 dull turquoise bag. +muted red bags contain 3 light violet bags, 2 dark cyan bags. +vibrant gold bags contain 2 dotted chartreuse bags, 5 pale brown bags, 1 mirrored brown bag, 5 plaid lavender bags. +muted purple bags contain 3 dim blue bags, 3 wavy red bags, 1 clear lavender bag. +dim magenta bags contain 5 muted tan bags, 4 striped olive bags, 5 vibrant gold bags. +faded plum bags contain 1 faded black bag, 1 muted green bag. +light violet bags contain 3 mirrored turquoise bags, 1 dull bronze bag. +faded salmon bags contain 1 pale salmon bag, 1 light teal bag. +posh black bags contain 2 wavy purple bags. +plaid white bags contain 1 shiny salmon bag, 3 posh purple bags. +mirrored green bags contain 3 bright tan bags, 1 plaid white bag, 3 mirrored plum bags. +dark red bags contain 2 bright purple bags, 2 muted white bags, 5 drab cyan bags, 5 plaid olive bags. +vibrant teal bags contain 5 striped olive bags, 1 pale olive bag. +dotted green bags contain 3 dark cyan bags. +dark indigo bags contain 3 bright brown bags, 3 drab white bags, 2 muted purple bags, 2 plaid silver bags. +drab tan bags contain 3 dotted gray bags, 2 faded black bags, 1 dull brown bag, 2 drab salmon bags. +vibrant chartreuse bags contain 5 pale brown bags. +mirrored olive bags contain 2 dim blue bags, 2 shiny gold bags, 4 light lavender bags. +light silver bags contain 3 drab orange bags, 5 light plum bags, 2 dotted olive bags. +light indigo bags contain 4 pale yellow bags, 1 vibrant violet bag, 4 dull cyan bags, 5 dotted tomato bags. +pale orange bags contain 4 pale silver bags, 4 vibrant tomato bags. +vibrant bronze bags contain 5 dark yellow bags. +dull beige bags contain 4 dotted gray bags, 4 pale lavender bags, 5 light lavender bags, 3 shiny coral bags. +bright gray bags contain 3 bright silver bags. +vibrant green bags contain 4 muted tan bags, 3 light lavender bags, 5 light magenta bags. +plaid violet bags contain 4 bright lime bags, 2 mirrored olive bags, 4 faded blue bags. +striped bronze bags contain 1 plaid chartreuse bag. +dim crimson bags contain 3 bright yellow bags, 1 dull gray bag. +posh purple bags contain 3 light fuchsia bags, 5 pale black bags, 5 wavy orange bags, 3 drab blue bags. +clear beige bags contain 4 plaid black bags. +striped gray bags contain 2 pale green bags, 4 light fuchsia bags. +plaid olive bags contain 2 mirrored gray bags. +muted green bags contain 1 plaid coral bag. +clear salmon bags contain 4 muted black bags, 1 bright white bag, 1 drab tomato bag, 2 shiny orange bags. +dark aqua bags contain 5 light bronze bags, 1 wavy turquoise bag. +drab tomato bags contain 5 dim chartreuse bags. +wavy magenta bags contain 3 posh brown bags. +dull crimson bags contain 1 mirrored tan bag, 4 dotted crimson bags, 5 vibrant indigo bags. +plaid turquoise bags contain 1 dark bronze bag, 4 bright maroon bags. +dim cyan bags contain 4 plaid red bags, 4 bright silver bags, 5 vibrant gold bags. +faded blue bags contain 3 plaid salmon bags, 3 clear cyan bags, 1 wavy aqua bag, 4 mirrored teal bags. +light orange bags contain 4 posh chartreuse bags, 3 shiny maroon bags, 4 dim teal bags, 4 drab chartreuse bags. +bright white bags contain 5 drab chartreuse bags. +clear red bags contain 1 dull magenta bag, 1 light cyan bag. +drab gold bags contain 4 plaid violet bags, 5 muted gold bags. +muted chartreuse bags contain 1 plaid crimson bag, 4 vibrant red bags, 1 drab turquoise bag, 5 posh black bags. +mirrored black bags contain 1 dim white bag, 1 clear gold bag. +bright indigo bags contain 1 vibrant gold bag, 2 pale purple bags. +muted indigo bags contain 2 dull plum bags. +striped tan bags contain 2 dotted chartreuse bags. +dim tan bags contain 2 dim red bags, 4 light violet bags, 1 clear beige bag. +muted tomato bags contain 1 faded gold bag, 2 bright yellow bags, 3 dotted plum bags. +vibrant turquoise bags contain 2 light tan bags, 4 wavy salmon bags, 1 dark tan bag, 1 dull tan bag. +dotted magenta bags contain 4 plaid blue bags, 1 plaid turquoise bag, 5 striped silver bags. +dark orange bags contain 3 faded bronze bags. +light tomato bags contain 2 dull bronze bags, 1 pale brown bag, 4 bright violet bags. +dim teal bags contain 5 dull brown bags. +muted lavender bags contain 4 dark yellow bags, 4 shiny teal bags, 2 faded aqua bags, 5 wavy cyan bags. +bright beige bags contain 3 muted black bags, 4 bright blue bags. +light purple bags contain 1 pale lavender bag, 2 shiny aqua bags. +plaid blue bags contain 4 dull beige bags, 3 dull brown bags, 3 dotted crimson bags. +striped lavender bags contain 3 dotted chartreuse bags. +bright tomato bags contain 1 posh violet bag, 3 shiny aqua bags. +wavy indigo bags contain 4 mirrored olive bags, 1 faded turquoise bag, 1 vibrant coral bag, 4 bright gray bags. +pale black bags contain 5 bright silver bags, 3 mirrored turquoise bags. +mirrored turquoise bags contain no other bags. +bright plum bags contain 2 faded turquoise bags. +shiny yellow bags contain 1 clear gold bag. +plaid bronze bags contain 1 dotted teal bag, 3 faded white bags, 2 shiny green bags. +striped beige bags contain 3 vibrant teal bags. +wavy cyan bags contain 5 posh yellow bags. +light tan bags contain 2 vibrant red bags. +pale brown bags contain 2 bright yellow bags, 4 pale lavender bags, 5 mirrored turquoise bags, 1 drab turquoise bag. +bright teal bags contain 3 dark green bags, 2 dull white bags. +drab yellow bags contain 5 dotted purple bags. +shiny cyan bags contain 4 vibrant yellow bags. +vibrant silver bags contain 5 mirrored yellow bags, 5 dull indigo bags, 3 faded cyan bags, 4 faded turquoise bags. +clear plum bags contain 4 pale lavender bags. +posh teal bags contain 2 muted tan bags. +striped crimson bags contain 1 dull plum bag, 2 shiny fuchsia bags, 4 dim maroon bags, 3 bright yellow bags. +dull lavender bags contain 2 clear fuchsia bags, 5 pale silver bags, 5 dim salmon bags, 4 muted salmon bags. +posh indigo bags contain 5 faded chartreuse bags, 5 dark green bags, 5 dark blue bags. +wavy blue bags contain 5 muted yellow bags. +dull magenta bags contain 5 pale brown bags. +mirrored bronze bags contain 3 posh turquoise bags. +posh aqua bags contain 1 dim white bag, 2 clear tomato bags, 2 pale maroon bags. +pale purple bags contain 2 dotted fuchsia bags. +mirrored chartreuse bags contain 5 plaid yellow bags, 5 posh tan bags, 4 vibrant silver bags, 3 drab green bags. +dotted black bags contain 5 muted aqua bags, 1 wavy lime bag, 2 bright lime bags. +plaid chartreuse bags contain 2 bright yellow bags, 2 faded gold bags, 1 pale lavender bag. +dotted plum bags contain 4 dull bronze bags, 4 dim blue bags. +clear gold bags contain 2 bright tan bags, 5 wavy teal bags. +dark crimson bags contain 4 bright teal bags, 2 wavy gray bags, 1 bright chartreuse bag. +faded gray bags contain 2 mirrored magenta bags. +dim gold bags contain 3 drab white bags. +clear green bags contain 2 pale beige bags. +dotted gold bags contain 3 dull indigo bags. +striped lime bags contain 2 dotted chartreuse bags. +clear brown bags contain 4 dark olive bags, 2 striped yellow bags, 4 dotted red bags, 5 dotted plum bags. +striped gold bags contain 1 wavy white bag, 3 posh tomato bags, 4 light magenta bags. +muted brown bags contain 1 clear gold bag. +plaid tomato bags contain 4 plaid plum bags, 2 pale chartreuse bags. +dark salmon bags contain 5 pale plum bags, 3 striped lime bags, 4 dotted gray bags. +drab brown bags contain 1 wavy orange bag, 4 dark cyan bags, 1 drab white bag. +pale gray bags contain 3 bright crimson bags, 1 bright yellow bag. +plaid maroon bags contain 1 pale coral bag. +dim violet bags contain 5 wavy blue bags, 4 shiny coral bags, 4 pale black bags, 3 posh yellow bags. +faded white bags contain 2 pale plum bags. +mirrored orange bags contain 3 striped maroon bags, 1 dull bronze bag, 2 pale aqua bags. +wavy black bags contain 1 faded violet bag, 1 plaid purple bag, 5 dim coral bags, 2 mirrored plum bags. +dim silver bags contain 2 muted brown bags, 1 posh plum bag. +dark tomato bags contain 5 dull magenta bags, 2 faded aqua bags, 3 vibrant lime bags, 3 drab silver bags. +dotted silver bags contain 2 dotted red bags. +muted yellow bags contain 4 drab purple bags, 3 striped olive bags. +shiny lavender bags contain 5 plaid purple bags, 2 vibrant crimson bags, 4 dull olive bags. +clear tomato bags contain 4 shiny bronze bags. +dark turquoise bags contain 5 dim brown bags. +drab coral bags contain 3 dull orange bags. +dotted beige bags contain 1 wavy lavender bag, 5 dull orange bags, 4 dull lime bags, 3 dull blue bags. +dark teal bags contain 3 muted indigo bags, 5 dark gold bags, 3 dull green bags, 2 plaid tan bags. +light lavender bags contain 2 dim maroon bags, 4 muted tomato bags, 4 dull plum bags. +dim lavender bags contain 4 light magenta bags, 4 shiny fuchsia bags, 5 wavy chartreuse bags, 1 faded chartreuse bag. +vibrant brown bags contain 4 dull bronze bags, 1 clear green bag, 3 posh orange bags, 3 mirrored silver bags. +pale tan bags contain 3 bright tomato bags, 5 pale maroon bags, 3 wavy teal bags. +muted black bags contain 1 light lime bag. +posh lime bags contain 3 bright crimson bags, 4 posh beige bags, 1 bright cyan bag. +light aqua bags contain 4 posh olive bags, 4 light tan bags, 4 wavy tan bags, 2 dotted blue bags. +dotted tan bags contain 3 dark yellow bags, 4 posh silver bags, 3 dark beige bags. +shiny black bags contain no other bags. +mirrored fuchsia bags contain 1 bright purple bag, 3 posh lime bags, 5 dim black bags. +dim purple bags contain 3 muted indigo bags. +wavy white bags contain 2 pale olive bags. +bright magenta bags contain 5 dull aqua bags, 3 dull green bags, 2 shiny turquoise bags. +drab white bags contain 1 plaid yellow bag, 2 shiny green bags, 5 posh beige bags, 5 plaid tan bags. +mirrored crimson bags contain 2 shiny teal bags. +pale white bags contain 2 muted indigo bags. +shiny bronze bags contain 5 mirrored crimson bags, 3 pale brown bags, 4 clear chartreuse bags. +clear blue bags contain 1 drab chartreuse bag, 4 striped turquoise bags, 1 plaid aqua bag, 5 pale aqua bags. +shiny brown bags contain 1 dotted bronze bag, 4 shiny fuchsia bags, 4 drab fuchsia bags, 4 dark lavender bags. +dotted teal bags contain 4 dull olive bags, 4 clear black bags. +posh gray bags contain 1 wavy salmon bag. +dark white bags contain 4 pale lime bags, 4 plaid beige bags, 5 dull fuchsia bags, 1 pale yellow bag. +dull cyan bags contain 4 muted lavender bags, 2 plaid tan bags, 2 dim blue bags. +dark olive bags contain 2 dim indigo bags, 1 dark brown bag, 5 dark yellow bags, 4 dull gray bags. +vibrant tan bags contain 4 bright tan bags, 1 pale tomato bag. +drab beige bags contain 4 muted magenta bags, 2 bright plum bags, 3 pale beige bags. +clear magenta bags contain 2 dull indigo bags, 5 vibrant green bags. +posh yellow bags contain no other bags. +vibrant magenta bags contain 2 dark green bags. +posh blue bags contain 2 muted chartreuse bags, 3 vibrant coral bags. +striped violet bags contain 1 dotted orange bag, 5 striped red bags, 5 dull lime bags. +dark yellow bags contain 2 shiny turquoise bags. +bright turquoise bags contain 2 bright yellow bags, 2 posh violet bags, 4 bright plum bags. +pale silver bags contain 4 vibrant bronze bags, 4 faded purple bags, 1 shiny green bag, 1 plaid lavender bag. +muted white bags contain 3 mirrored olive bags. +light green bags contain 5 shiny plum bags, 4 pale lavender bags, 5 faded gold bags. +drab lime bags contain 2 plaid beige bags. +pale chartreuse bags contain 4 dotted brown bags, 1 dark black bag, 3 mirrored plum bags, 1 faded black bag. +mirrored violet bags contain 5 plaid beige bags. +vibrant white bags contain 5 muted tomato bags. +faded violet bags contain 1 dull brown bag, 1 mirrored brown bag. +drab bronze bags contain 3 dim indigo bags, 1 dim magenta bag, 1 bright gray bag. +posh lavender bags contain 1 wavy black bag, 2 wavy magenta bags. +vibrant aqua bags contain 2 light lavender bags, 1 faded crimson bag, 4 dark green bags, 3 mirrored white bags. +bright green bags contain 1 dark gray bag. +shiny turquoise bags contain 2 bright yellow bags. +pale aqua bags contain 3 shiny gold bags, 2 drab silver bags, 3 drab salmon bags. +faded silver bags contain 3 striped teal bags, 5 mirrored indigo bags. +shiny indigo bags contain 3 wavy olive bags, 3 dim blue bags, 2 faded gold bags, 4 clear fuchsia bags. +vibrant yellow bags contain 5 dark chartreuse bags, 3 dull indigo bags, 1 bright tan bag. +shiny aqua bags contain 3 striped olive bags, 2 shiny teal bags, 5 pale teal bags. +bright maroon bags contain 2 striped lime bags. +dark purple bags contain 5 dotted brown bags, 1 bright olive bag, 3 drab orange bags, 1 mirrored olive bag. +drab lavender bags contain 5 wavy beige bags, 4 bright gold bags, 3 wavy cyan bags. +dull white bags contain 4 posh teal bags, 4 mirrored turquoise bags, 1 muted purple bag. +clear silver bags contain 1 dull lime bag, 2 dim plum bags, 5 wavy maroon bags, 3 striped cyan bags. +bright lavender bags contain 1 muted tomato bag. +pale crimson bags contain 1 striped tan bag, 4 dotted red bags, 3 dotted fuchsia bags, 5 dull brown bags. +posh maroon bags contain 3 dark magenta bags, 3 pale gray bags. +vibrant lime bags contain 1 dull maroon bag, 4 light purple bags, 5 dull orange bags, 1 dull purple bag. +drab turquoise bags contain no other bags. +dark bronze bags contain 2 light tomato bags, 1 vibrant gold bag, 3 posh yellow bags, 5 light lavender bags. +muted cyan bags contain 3 dotted black bags, 1 faded violet bag, 5 bright violet bags. +dim tomato bags contain 3 drab chartreuse bags, 1 striped coral bag, 3 pale tan bags. +light teal bags contain 3 pale gray bags. +muted olive bags contain 1 dull green bag, 3 bright violet bags, 1 dark yellow bag. +mirrored tan bags contain 3 dark salmon bags, 1 vibrant red bag, 1 dull gray bag. +light turquoise bags contain 5 posh red bags, 1 dim chartreuse bag, 3 vibrant beige bags, 2 mirrored lavender bags. +dark brown bags contain 2 clear fuchsia bags, 2 dull bronze bags, 3 striped aqua bags, 1 shiny gold bag. +striped orange bags contain 3 shiny gold bags, 1 bright crimson bag, 3 vibrant gold bags. +bright bronze bags contain 3 faded cyan bags, 3 dim blue bags, 2 faded gold bags, 2 bright tan bags. +dotted orange bags contain 4 dim magenta bags, 1 faded white bag, 1 muted tan bag. +dull red bags contain 3 posh yellow bags, 3 pale plum bags. +clear orange bags contain 5 wavy chartreuse bags, 5 dull aqua bags, 1 faded bronze bag, 5 faded chartreuse bags. +dark blue bags contain 2 striped lime bags. +wavy brown bags contain 4 shiny green bags. +wavy purple bags contain 2 dim maroon bags, 1 vibrant coral bag, 4 posh teal bags, 2 dark teal bags. +muted tan bags contain 5 bright violet bags, 4 dotted red bags, 5 dull beige bags, 1 dim gray bag. +posh crimson bags contain 3 dark bronze bags, 3 pale salmon bags, 2 muted beige bags, 2 bright aqua bags. +pale blue bags contain 3 wavy black bags, 5 dotted brown bags, 5 drab chartreuse bags, 5 bright gray bags. +striped plum bags contain 4 light turquoise bags. +posh green bags contain 5 dull cyan bags, 4 muted tan bags, 1 faded silver bag, 3 vibrant black bags. +mirrored yellow bags contain 5 shiny fuchsia bags, 3 bright tan bags, 4 drab fuchsia bags. +striped brown bags contain 4 wavy turquoise bags. +dim bronze bags contain 4 faded black bags, 1 striped lavender bag. +plaid cyan bags contain 5 posh lime bags, 2 wavy white bags, 3 posh crimson bags. +plaid brown bags contain 2 dark bronze bags. +vibrant blue bags contain 4 wavy orange bags, 4 drab silver bags, 2 muted tan bags. +dull violet bags contain 5 posh black bags, 4 shiny tomato bags. +striped magenta bags contain 3 faded white bags, 1 vibrant bronze bag. +striped coral bags contain 1 dull blue bag, 5 faded lime bags, 4 vibrant coral bags. +plaid lime bags contain 1 shiny black bag, 3 mirrored coral bags. +dim indigo bags contain 4 dim coral bags, 3 wavy indigo bags, 3 vibrant red bags, 3 wavy orange bags. +pale violet bags contain 2 drab purple bags. +striped turquoise bags contain 4 drab teal bags, 5 striped bronze bags. +striped indigo bags contain 3 striped purple bags, 4 shiny beige bags. +light coral bags contain 3 bright coral bags, 5 pale teal bags, 5 dull red bags, 3 mirrored tomato bags. +drab plum bags contain 4 dull white bags, 3 clear crimson bags, 2 wavy lavender bags. +dim maroon bags contain no other bags. +shiny crimson bags contain 2 dull indigo bags, 1 bright cyan bag. +dull aqua bags contain 3 dark yellow bags. +drab violet bags contain 4 striped aqua bags. +shiny gold bags contain 2 pale brown bags, 2 dotted chartreuse bags, 1 vibrant gold bag, 4 dull magenta bags. +plaid indigo bags contain 4 striped purple bags, 3 clear brown bags. +muted gold bags contain 1 shiny cyan bag. +dotted lime bags contain 3 dotted olive bags, 4 light tan bags, 4 bright bronze bags, 3 vibrant plum bags. +vibrant red bags contain 2 wavy red bags, 4 dotted chartreuse bags, 5 dim coral bags. +faded lime bags contain 5 drab turquoise bags, 4 pale lavender bags. +striped black bags contain 2 light white bags, 4 posh lime bags, 3 posh chartreuse bags. +posh brown bags contain 1 muted white bag, 2 striped teal bags, 1 faded chartreuse bag. +dotted aqua bags contain 5 dull orange bags. +clear yellow bags contain 5 pale fuchsia bags, 2 posh cyan bags. +faded crimson bags contain 4 vibrant black bags. +dull tan bags contain 1 plaid crimson bag. +dark chartreuse bags contain 1 mirrored turquoise bag. +clear purple bags contain 1 dotted magenta bag, 2 striped lavender bags. +pale indigo bags contain 2 drab tan bags, 2 shiny indigo bags. +plaid coral bags contain 2 dark olive bags, 1 pale aqua bag, 5 shiny bronze bags. +faded purple bags contain 4 dull aqua bags, 2 drab turquoise bags, 5 wavy crimson bags, 2 faded turquoise bags. +pale gold bags contain 3 plaid blue bags, 3 muted plum bags, 4 wavy tomato bags, 3 clear lavender bags. +plaid plum bags contain 1 plaid lavender bag, 3 wavy purple bags. +vibrant violet bags contain 1 posh teal bag, 4 dull gray bags, 5 dim aqua bags, 5 striped yellow bags. +light maroon bags contain 5 clear blue bags. +clear olive bags contain 4 posh yellow bags, 4 dotted olive bags, 2 faded chartreuse bags. +dotted indigo bags contain 1 muted crimson bag, 5 wavy purple bags, 3 dotted crimson bags, 4 dotted chartreuse bags. +muted coral bags contain 3 faded teal bags, 3 pale crimson bags, 1 posh fuchsia bag. +striped olive bags contain 1 plaid chartreuse bag, 1 dull indigo bag, 1 shiny salmon bag, 1 shiny crimson bag. +dull maroon bags contain 4 dull bronze bags, 1 mirrored brown bag, 5 wavy white bags, 5 clear teal bags. +bright aqua bags contain 2 light bronze bags, 3 bright violet bags, 5 posh fuchsia bags. +drab fuchsia bags contain 1 pale black bag. +plaid orange bags contain 2 muted orange bags. +faded aqua bags contain 4 striped orange bags, 3 striped aqua bags. +dull coral bags contain 2 dull aqua bags, 5 dim white bags, 1 striped tan bag. +muted blue bags contain 1 mirrored turquoise bag, 4 bright lavender bags, 4 dull magenta bags. +striped cyan bags contain 1 shiny tan bag, 5 dark cyan bags, 2 pale chartreuse bags, 3 muted gold bags. +muted violet bags contain 4 muted bronze bags, 5 mirrored tan bags, 5 bright yellow bags. +dull blue bags contain 3 striped fuchsia bags, 2 plaid aqua bags, 1 mirrored lime bag. +bright olive bags contain 1 pale turquoise bag, 2 vibrant gray bags, 5 posh chartreuse bags, 4 shiny lime bags. +drab red bags contain 1 light lime bag, 1 mirrored black bag, 4 pale purple bags, 2 drab purple bags. +mirrored brown bags contain 3 dull bronze bags, 3 bright lavender bags. +dotted brown bags contain 1 plaid turquoise bag, 1 dull plum bag. +shiny gray bags contain 2 pale magenta bags. +posh fuchsia bags contain 1 clear gold bag, 5 muted tomato bags, 4 muted white bags, 1 dark brown bag. +shiny green bags contain 5 posh teal bags, 2 dark brown bags, 1 faded turquoise bag. +shiny teal bags contain 1 bright coral bag, 2 plaid aqua bags, 2 vibrant yellow bags. +pale lime bags contain 5 shiny chartreuse bags, 2 striped gold bags. +bright tan bags contain 5 drab turquoise bags, 2 dotted plum bags. +wavy maroon bags contain 3 striped yellow bags, 2 plaid red bags, 4 pale teal bags. +light gray bags contain 3 wavy teal bags, 1 clear brown bag, 5 striped tan bags, 3 muted magenta bags. +dark tan bags contain 5 posh purple bags. +light lime bags contain 4 light brown bags, 3 faded violet bags, 5 bright plum bags. +bright gold bags contain 1 shiny crimson bag, 4 wavy red bags. +drab crimson bags contain 2 dotted purple bags, 4 plaid purple bags, 4 vibrant black bags. +pale maroon bags contain 1 dim gray bag. +wavy chartreuse bags contain 3 bright lavender bags. +plaid gold bags contain 5 posh lavender bags. +plaid yellow bags contain 3 shiny black bags. +dim red bags contain 2 muted indigo bags, 1 shiny aqua bag, 1 dim gray bag. +faded turquoise bags contain 2 shiny coral bags. +mirrored purple bags contain 3 muted beige bags, 4 faded blue bags. +dark black bags contain 4 bright coral bags. +dull indigo bags contain no other bags. +dark lime bags contain 1 shiny chartreuse bag, 5 drab plum bags, 2 dim yellow bags. +dim yellow bags contain 4 dotted plum bags, 2 dim coral bags, 3 dotted red bags. +shiny silver bags contain 5 drab tan bags, 1 bright cyan bag. +posh bronze bags contain 5 dotted salmon bags, 1 light aqua bag. +dull tomato bags contain 1 clear red bag, 1 dull green bag, 1 dark blue bag, 1 striped maroon bag. +bright fuchsia bags contain 1 dark cyan bag. +striped red bags contain 5 mirrored lime bags, 4 dull magenta bags, 2 vibrant yellow bags. +striped green bags contain 2 dim white bags. +wavy fuchsia bags contain 3 muted fuchsia bags, 3 drab blue bags. +posh violet bags contain 2 plaid red bags, 3 faded turquoise bags, 1 faded white bag. +vibrant maroon bags contain 1 clear fuchsia bag, 5 wavy purple bags, 2 dull gold bags. +dim olive bags contain 2 mirrored yellow bags, 2 muted magenta bags, 3 drab coral bags. +muted turquoise bags contain 1 drab white bag, 4 vibrant crimson bags, 5 dark teal bags, 1 drab bronze bag. +light white bags contain 5 vibrant gold bags, 2 faded silver bags, 1 bright beige bag. +dark beige bags contain 4 shiny white bags, 3 wavy chartreuse bags, 1 dotted red bag, 5 plaid crimson bags. +wavy gold bags contain 3 posh teal bags. +muted bronze bags contain 2 dull bronze bags, 2 muted black bags. +wavy lime bags contain 3 dim violet bags, 5 posh violet bags, 1 light white bag, 2 posh olive bags. +clear gray bags contain 2 pale purple bags. +vibrant black bags contain 5 plaid black bags. +dotted olive bags contain 4 dotted fuchsia bags. +drab gray bags contain 3 shiny chartreuse bags, 1 dim yellow bag. +shiny tomato bags contain 1 bright coral bag, 4 mirrored coral bags. +dotted coral bags contain 2 plaid cyan bags, 3 light crimson bags, 1 light white bag, 3 drab aqua bags. +drab blue bags contain 3 bright coral bags, 3 dim coral bags. +mirrored blue bags contain 5 dotted brown bags, 4 clear chartreuse bags, 2 bright gold bags, 3 striped lavender bags. +muted aqua bags contain 2 bright turquoise bags. +bright yellow bags contain no other bags. \ No newline at end of file diff --git a/day07/packBag.spec.ts b/day07/packBag.spec.ts deleted file mode 100644 index 62ec841..0000000 --- a/day07/packBag.spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { loadString } from '../lib/loader' -import { parseRules } from './parseRules' -/** - * These rules specify the required contents for 9 bag types. In this example, - * every faded blue bag is empty, every vibrant plum bag contains 11 bags - * (5 faded blue and 6 dotted black), and so on. - */ -const sample = `light red bags contain 1 bright white bag, 2 muted yellow bags. -dark orange bags contain 3 bright white bags, 4 muted yellow bags. -bright white bags contain 1 shiny gold bag. -muted yellow bags contain 2 shiny gold bags, 9 faded blue bags. -shiny gold bags contain 1 dark olive bag, 2 vibrant plum bags. -dark olive bags contain 3 faded blue bags, 4 dotted black bags. -vibrant plum bags contain 5 faded blue bags, 6 dotted black bags. -faded blue bags contain no other bags. -dotted black bags contain no other bags.` - -describe('packBag', () => { - /** - * You have a shiny gold bag. If you wanted to carry it in at least one - * other bag, how many different bag colors would be valid for the outermost - * bag? (In other words: how many colors can, eventually, contain at least - * one shiny gold bag?) - * - * In the above rules, the following options would be available to you: - * - * A bright white bag, which can hold your shiny gold bag directly. - * A muted yellow bag, which can hold your shiny gold bag directly, plus some other bags. - * A dark orange bag, which can hold bright white and muted yellow bags, either of which could then hold your shiny gold bag. - * A light red bag, which can hold bright white and muted yellow bags, either of which could then hold your shiny gold bag. - * So, in this example, the number of bag colors that can eventually contain at least one shiny gold bag is 4. - */ - it('should pack a shiny gold bag', () => { - const rules = parseRules(loadString(sample)) - const packager = packBag(rules) - const colors = Object.keys(packager('shiny gold')) - expect(colors).toEqual([ - 'bright white', - 'muted yellow', - 'dark orange', - 'light red', - ]) - }) -}) diff --git a/day07/packBag.ts b/day07/packBag.ts new file mode 100644 index 0000000..3b17655 --- /dev/null +++ b/day07/packBag.ts @@ -0,0 +1,22 @@ +import { Bag, Bags } from './parseRules' + +const unique = (value: unknown, index: number, arr: unknown[]) => + arr.indexOf(value) === index + +const findContainingBag = (bags: Bags) => (bag: Bag): string[] => { + // Find the bags that can contain this bag + const parents = Object.values(bags).filter( + ({ children }) => children?.[bag.color] !== undefined, + ) + if (parents.length === 0) return [bag.color] + return [ + ...parents.map(({ color }) => color), + ...parents.map(findContainingBag(bags)).flat(), + ].filter(unique) +} + +/** + * Determine which bags are needed to package a bag with the given color. + */ +export const packBag = (bags: Bags) => (color: string): string[] => + findContainingBag(bags)(bags[color]).flat() diff --git a/day07/parseRules.ts b/day07/parseRules.ts index ce565e0..266df53 100644 --- a/day07/parseRules.ts +++ b/day07/parseRules.ts @@ -3,32 +3,34 @@ export type Bag = { children?: Record } +export type Bags = Record + const ruleDef = /^(?[a-z ]+) bags contain (?.+)/ const contentsRuleDef = /^(?[0-9]+) (?[a-z ]+) bags?/ export const parseRuleLine = (rule: string): Bag | undefined => { const match = ruleDef.exec(rule) - if (match === null) return + if (match?.groups === undefined) return const children = match.groups.contents .split(',') .map((s) => s.trim()) .filter((s) => s !== undefined) - .filter((s) => !/no other bags/.test(s)) + .filter((s) => !s.includes('no other bags')) .map((s) => contentsRuleDef.exec(s)) - .reduce( - (children, child) => ({ + .reduce((children, child) => { + if (child?.groups === undefined) return children + return { ...children, [child?.groups.color]: parseInt(child?.groups.amount, 10), - }), - {}, - ) + } + }, {}) return { - color: match.groups.color as string, + color: match.groups.color, children: Object.keys(children).length === 0 ? undefined : children, } } -export const parseRules = (rules: string[]): Record => +export const parseRules = (rules: string[]): Bags => rules.reduce((bags, rule) => { const bag = parseRuleLine(rule) if (bag === undefined) return bags diff --git a/day07/solution.spec.ts b/day07/solution.spec.ts new file mode 100644 index 0000000..8303767 --- /dev/null +++ b/day07/solution.spec.ts @@ -0,0 +1,41 @@ +import { loader, loadString } from '../lib/loader' +import { packBag } from './packBag' +import { parseRules } from './parseRules' + +const load = loader(7) +const input = load('input') +/** + * These rules specify the required contents for 9 bag types. In this example, + * every faded blue bag is empty, every vibrant plum bag contains 11 bags + * (5 faded blue and 6 dotted black), and so on. + */ +const sample = `light red bags contain 1 bright white bag, 2 muted yellow bags. +dark orange bags contain 3 bright white bags, 4 muted yellow bags. +bright white bags contain 1 shiny gold bag. +muted yellow bags contain 2 shiny gold bags, 9 faded blue bags. +shiny gold bags contain 1 dark olive bag, 2 vibrant plum bags. +dark olive bags contain 3 faded blue bags, 4 dotted black bags. +vibrant plum bags contain 5 faded blue bags, 6 dotted black bags. +faded blue bags contain no other bags. +dotted black bags contain no other bags.` + +describe('Day 7: Handy Haversacks', () => { + describe('Part 1', () => { + it('should solve the sample', () => { + const rules = parseRules(loadString(sample)) + const packager = packBag(rules) + const bags = packager('shiny gold') + expect(bags).toHaveLength(4) + expect(bags.includes('bright white')).toEqual(true) + expect(bags.includes('muted yellow')).toEqual(true) + expect(bags.includes('dark orange')).toEqual(true) + expect(bags.includes('light red')).toEqual(true) + }) + it('should solve', () => { + const rules = parseRules(input) + const packager = packBag(rules) + const bags = packager('shiny gold') + expect(bags).toHaveLength(378) + }) + }) +}) From a9e2cc1f8cf400ad820ca980a391037a39b57e8b Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Mon, 7 Dec 2020 09:31:57 +0100 Subject: [PATCH 030/110] feat(day07): part 2 --- day07/countBags.ts | 22 ++++++++++++++++++++++ day07/solution.spec.ts | 29 +++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 day07/countBags.ts diff --git a/day07/countBags.ts b/day07/countBags.ts new file mode 100644 index 0000000..5a70bd8 --- /dev/null +++ b/day07/countBags.ts @@ -0,0 +1,22 @@ +import { Bag, Bags } from './parseRules' + +const countChildren = (bags: Bags) => (bag: Bag): number => { + // Bag has no children, so no more bags are needed + if (bag.children === undefined) return 0 + + return Object.entries(bag.children).reduce( + (total, [color, count]) => + total + + // Count all the child bags + count + + // and add the amount of bags they contain multiplied by the number of bags + count * countChildren(bags)(bags[color]), + 0, + ) +} + +/** + * Count how many bags are need to transport the given bag + */ +export const countBags = (bags: Bags) => (color: string): number => + countChildren(bags)(bags[color]) diff --git a/day07/solution.spec.ts b/day07/solution.spec.ts index 8303767..2c52e7d 100644 --- a/day07/solution.spec.ts +++ b/day07/solution.spec.ts @@ -1,4 +1,5 @@ import { loader, loadString } from '../lib/loader' +import { countBags } from './countBags' import { packBag } from './packBag' import { parseRules } from './parseRules' @@ -19,6 +20,14 @@ vibrant plum bags contain 5 faded blue bags, 6 dotted black bags. faded blue bags contain no other bags. dotted black bags contain no other bags.` +const sample2 = `shiny gold bags contain 2 dark red bags. +dark red bags contain 2 dark orange bags. +dark orange bags contain 2 dark yellow bags. +dark yellow bags contain 2 dark green bags. +dark green bags contain 2 dark blue bags. +dark blue bags contain 2 dark violet bags. +dark violet bags contain no other bags.` + describe('Day 7: Handy Haversacks', () => { describe('Part 1', () => { it('should solve the sample', () => { @@ -34,8 +43,24 @@ describe('Day 7: Handy Haversacks', () => { it('should solve', () => { const rules = parseRules(input) const packager = packBag(rules) - const bags = packager('shiny gold') - expect(bags).toHaveLength(378) + expect(packager('shiny gold')).toHaveLength(378) + }) + }) + describe('Part 2', () => { + it('should solve the sample', () => { + const rules = parseRules(loadString(sample)) + const counter = countBags(rules) + expect(counter('shiny gold')).toEqual(32) + }) + it('should solve the second sample', () => { + const rules = parseRules(loadString(sample2)) + const counter = countBags(rules) + expect(counter('shiny gold')).toEqual(126) + }) + it('should solve', () => { + const rules = parseRules(input) + const counter = countBags(rules) + expect(counter('shiny gold')).toEqual(27526) }) }) }) From 13f0ae0228d5c5e24a129b0580c890f01d26b2bf Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Mon, 7 Dec 2020 09:34:44 +0100 Subject: [PATCH 031/110] docs: improve docs --- day07/packBag.ts | 4 ++++ day07/parseRules.ts | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/day07/packBag.ts b/day07/packBag.ts index 3b17655..6e21aaa 100644 --- a/day07/packBag.ts +++ b/day07/packBag.ts @@ -8,9 +8,13 @@ const findContainingBag = (bags: Bags) => (bag: Bag): string[] => { const parents = Object.values(bags).filter( ({ children }) => children?.[bag.color] !== undefined, ) + // No one contains this bag, so it's just that if (parents.length === 0) return [bag.color] + return [ + // Return the parents ...parents.map(({ color }) => color), + // and the parents of the parents ...parents.map(findContainingBag(bags)).flat(), ].filter(unique) } diff --git a/day07/parseRules.ts b/day07/parseRules.ts index 266df53..238b9c6 100644 --- a/day07/parseRules.ts +++ b/day07/parseRules.ts @@ -8,14 +8,19 @@ export type Bags = Record const ruleDef = /^(?[a-z ]+) bags contain (?.+)/ const contentsRuleDef = /^(?[0-9]+) (?[a-z ]+) bags?/ +/** + * Parses a single rule line + */ export const parseRuleLine = (rule: string): Bag | undefined => { const match = ruleDef.exec(rule) if (match?.groups === undefined) return const children = match.groups.contents + // children counts are separated by comma .split(',') .map((s) => s.trim()) - .filter((s) => s !== undefined) + // handle special case of no children .filter((s) => !s.includes('no other bags')) + // parse the child rule .map((s) => contentsRuleDef.exec(s)) .reduce((children, child) => { if (child?.groups === undefined) return children @@ -30,6 +35,9 @@ export const parseRuleLine = (rule: string): Bag | undefined => { } } +/** + * Parse the bag in a record with the color as key + */ export const parseRules = (rules: string[]): Bags => rules.reduce((bags, rule) => { const bag = parseRuleLine(rule) From dad6eb8ce18c80d9a5d6c904401765f15be2b7f4 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Tue, 8 Dec 2020 09:48:38 +0100 Subject: [PATCH 032/110] feat(day08): part 1 --- day08/handheld.ts | 32 +++ day08/input.txt | 613 +++++++++++++++++++++++++++++++++++++++++ day08/solution.spec.ts | 27 ++ 3 files changed, 672 insertions(+) create mode 100644 day08/handheld.ts create mode 100644 day08/input.txt create mode 100644 day08/solution.spec.ts diff --git a/day08/handheld.ts b/day08/handheld.ts new file mode 100644 index 0000000..7aaf0cc --- /dev/null +++ b/day08/handheld.ts @@ -0,0 +1,32 @@ +export const boot = (bootCode: string[]): number => { + const bootInstructions = bootCode + .map((s) => s.split(' ')) + .map(([i, a]) => [i, parseInt(a, 10)]) + let acc = 0 + let ptr = 0 + const lineExecutions = {} as Record + let ins, arg + do { + if (lineExecutions[ptr] !== undefined) return acc + lineExecutions[ptr] = true + ins = bootInstructions[ptr]?.[0] + arg = bootInstructions[ptr]?.[1] + if (ins === undefined) return acc // normal termination + switch (ins) { + case 'nop': + ptr++ + break + case 'acc': + acc += arg as number + ptr++ + break + case 'jmp': + ptr += arg as number + break + default: + console.warn(`Unknown instruction: ${ins} ${arg}`) + ptr++ + } + } while (ins !== undefined) + return acc +} diff --git a/day08/input.txt b/day08/input.txt new file mode 100644 index 0000000..37da8aa --- /dev/null +++ b/day08/input.txt @@ -0,0 +1,613 @@ +nop +456 +nop +38 +acc +9 +jmp +153 +acc +15 +nop +560 +jmp +452 +acc +26 +acc +42 +jmp +376 +acc -5 +acc +12 +acc -5 +jmp +15 +jmp +1 +acc -9 +jmp +533 +acc +19 +acc +33 +acc +34 +jmp -6 +nop +404 +nop +140 +acc +0 +jmp +123 +acc +45 +acc +0 +jmp +496 +jmp +487 +acc +9 +acc +34 +jmp +484 +acc +0 +acc -14 +jmp +466 +acc +40 +acc +6 +acc +30 +jmp +444 +nop +386 +jmp +215 +acc +43 +acc +5 +nop -4 +jmp +535 +jmp -13 +acc +3 +acc +7 +acc +49 +acc -1 +jmp +245 +acc +9 +acc +31 +nop +142 +jmp +554 +acc +3 +jmp +493 +nop +399 +jmp +232 +acc -16 +acc +33 +jmp +410 +acc +33 +acc +5 +acc -17 +jmp +272 +acc -3 +acc +37 +jmp +181 +jmp -12 +nop +344 +acc +5 +acc -16 +jmp +290 +nop +530 +acc +15 +acc +3 +jmp +343 +acc +2 +acc +19 +jmp +298 +acc +43 +acc +25 +acc -19 +jmp +439 +acc +43 +acc +45 +acc +20 +jmp +355 +acc +13 +acc +24 +acc -15 +nop +396 +jmp +215 +acc -7 +acc +17 +jmp +441 +acc -8 +acc -19 +jmp +505 +jmp +282 +acc -17 +acc -8 +acc +20 +jmp +359 +acc +26 +acc +14 +acc +47 +acc +3 +jmp +298 +acc +31 +nop +205 +acc +0 +acc +7 +jmp +389 +acc -5 +acc +47 +jmp +94 +acc -13 +jmp +358 +acc -13 +jmp +134 +acc +8 +acc -19 +jmp +312 +acc +43 +acc +17 +jmp +97 +jmp +48 +nop +253 +acc +48 +acc -7 +acc -2 +jmp +23 +acc +26 +acc +14 +acc -14 +acc +17 +jmp +18 +acc +14 +acc +8 +jmp +341 +acc +35 +jmp +227 +acc +15 +acc -7 +jmp -95 +acc -19 +jmp -59 +jmp -31 +acc -6 +acc -4 +acc +24 +jmp +84 +acc -15 +jmp +82 +nop +74 +acc +8 +acc +9 +acc +13 +jmp +194 +jmp +376 +acc +34 +nop -16 +jmp -90 +acc +4 +acc +43 +nop +215 +jmp -147 +acc +0 +acc +11 +acc -15 +acc +23 +jmp +130 +acc +40 +jmp +106 +acc -4 +acc -18 +acc +18 +nop +329 +jmp +230 +acc +19 +nop +172 +acc +43 +jmp +304 +acc +44 +nop +213 +nop +195 +acc +6 +jmp -79 +acc +41 +acc -11 +acc +18 +acc -9 +jmp -25 +acc +27 +acc -6 +acc +31 +jmp -56 +acc +5 +acc +12 +acc +32 +acc +34 +jmp -189 +acc +32 +acc +5 +acc -16 +jmp +301 +nop +108 +nop -108 +jmp -141 +acc -12 +jmp +273 +acc +3 +jmp +140 +acc +7 +acc -11 +acc -17 +nop +194 +jmp -122 +acc -14 +nop +186 +acc +24 +jmp +277 +nop +341 +acc +18 +jmp -64 +acc +45 +acc +42 +jmp +52 +acc +39 +nop +91 +nop -8 +jmp +217 +acc +44 +acc +15 +jmp +72 +acc +24 +jmp -231 +acc -16 +nop +55 +nop +262 +acc +40 +jmp +234 +jmp -14 +acc +31 +nop -177 +acc +40 +jmp +343 +acc -8 +jmp -169 +acc +30 +acc +12 +acc -11 +jmp +41 +acc +9 +acc -9 +jmp +65 +acc +38 +acc +14 +jmp +335 +acc -19 +acc +38 +acc +16 +acc -11 +jmp +230 +jmp -71 +acc +48 +acc -13 +nop -255 +jmp +1 +jmp -220 +acc +2 +jmp +157 +jmp -105 +acc -16 +acc -5 +jmp -196 +acc +30 +jmp +139 +jmp +83 +acc -3 +acc -12 +jmp +254 +jmp -60 +acc +33 +jmp -37 +acc +17 +acc -14 +jmp +93 +nop +178 +acc +38 +acc +47 +jmp -89 +jmp +271 +acc +43 +acc +32 +jmp -240 +acc +26 +acc +32 +acc +30 +nop +284 +jmp +169 +acc -7 +acc +37 +jmp +102 +acc +4 +jmp +86 +jmp -123 +acc +0 +acc -14 +acc +18 +jmp +1 +jmp -5 +jmp -36 +jmp +148 +acc -17 +acc -14 +acc +28 +acc +15 +jmp +79 +jmp -289 +acc +42 +acc -5 +acc +13 +jmp +240 +acc -10 +acc -18 +acc -16 +jmp +103 +acc +21 +jmp +32 +nop +118 +acc +22 +acc -16 +acc +15 +jmp -186 +acc -2 +acc -14 +acc +22 +acc +16 +jmp +73 +acc -6 +jmp -225 +acc -18 +nop +113 +acc +50 +acc -6 +jmp +181 +acc +41 +jmp +1 +nop +92 +acc +23 +jmp +190 +acc +39 +acc +0 +acc +33 +jmp +111 +nop -63 +nop -81 +acc +9 +acc +35 +jmp +50 +acc +11 +jmp -295 +nop +230 +acc +34 +acc +12 +acc +47 +jmp +126 +acc +0 +nop -1 +acc +19 +acc -16 +jmp -360 +acc +29 +acc -2 +jmp -110 +acc +2 +acc +50 +jmp -36 +jmp -107 +jmp +178 +acc -11 +jmp +181 +nop +115 +nop +186 +jmp +95 +jmp +1 +nop +148 +acc +2 +acc +49 +jmp +173 +acc +38 +jmp +178 +acc +28 +acc +6 +acc +15 +jmp +110 +acc +49 +nop +100 +jmp +57 +acc +45 +nop +65 +acc +43 +acc +12 +jmp -272 +jmp -260 +nop +100 +jmp -224 +jmp +142 +jmp +52 +jmp -34 +jmp -110 +acc +35 +nop -112 +jmp +16 +jmp -18 +jmp -157 +jmp +81 +acc +1 +jmp -107 +acc +16 +acc +23 +jmp -255 +acc +22 +jmp +42 +nop +168 +acc +41 +jmp -311 +jmp -163 +jmp +118 +nop +4 +acc +18 +jmp +54 +jmp -414 +nop -181 +acc +10 +acc +23 +jmp -321 +nop -322 +acc -9 +jmp +101 +nop -7 +acc +35 +acc +46 +jmp -312 +nop +64 +nop -386 +jmp -280 +acc +16 +jmp -156 +acc +13 +nop -131 +jmp +1 +jmp -416 +jmp +15 +jmp -94 +jmp -330 +nop +93 +nop -205 +acc +48 +jmp -19 +jmp -70 +nop +21 +acc -5 +acc +19 +jmp +62 +acc +22 +jmp -448 +jmp -77 +acc +26 +acc -2 +jmp +70 +acc -2 +acc +21 +jmp -195 +nop -114 +jmp +107 +acc +37 +acc +6 +jmp -436 +acc +48 +jmp +96 +jmp -121 +acc +0 +jmp -74 +jmp +1 +acc +27 +acc +2 +jmp -279 +acc +7 +acc +0 +jmp +1 +jmp -413 +acc +6 +jmp -180 +acc +18 +acc +10 +jmp -437 +jmp -338 +nop -456 +jmp -463 +acc +1 +nop -54 +jmp -168 +acc +27 +jmp -479 +acc +42 +jmp -408 +jmp +85 +acc -16 +acc +24 +jmp -391 +jmp -206 +nop +8 +jmp +1 +acc +38 +nop -473 +jmp -94 +acc +10 +acc -14 +jmp -425 +acc +17 +nop -208 +acc +39 +jmp -265 +acc +3 +jmp -284 +acc +19 +acc +5 +nop -111 +acc +22 +jmp -309 +acc +12 +acc +39 +jmp -151 +acc +33 +acc -14 +jmp -450 +acc +16 +nop +50 +jmp -188 +acc -13 +acc +15 +acc +4 +jmp -484 +acc +27 +jmp -98 +acc +34 +jmp -120 +jmp -537 +acc +43 +acc -8 +acc -6 +jmp -405 +acc -8 +nop -179 +acc -11 +jmp -264 +acc +24 +jmp -280 +acc -6 +acc +1 +jmp -353 +acc -18 +jmp -58 +acc +1 +acc -7 +acc -2 +acc +44 +jmp -115 +nop -328 +acc +27 +acc +2 +jmp +20 +acc +14 +acc +34 +jmp -460 +nop -445 +acc -9 +acc +24 +acc -11 +jmp -72 +jmp -434 +jmp -370 +acc +35 +acc +43 +acc +45 +acc +44 +jmp -287 +jmp -546 +nop -474 +acc -6 +jmp -357 +nop -163 +nop -218 +nop -342 +jmp -570 +acc +44 +acc +4 +acc +35 +acc +6 +jmp -541 +jmp -274 +acc +48 +acc -18 +jmp -171 +acc -13 +acc -14 +acc +25 +acc +26 +jmp +1 \ No newline at end of file diff --git a/day08/solution.spec.ts b/day08/solution.spec.ts new file mode 100644 index 0000000..a951b0c --- /dev/null +++ b/day08/solution.spec.ts @@ -0,0 +1,27 @@ +import { loader, loadString } from '../lib/loader' +import { boot } from './handheld' + +const load = loader(8) +const input = load('input') +const sample = loadString(`nop +0 +acc +1 +jmp +4 +acc +3 +jmp -3 +acc -99 +acc +1 +jmp -4 +acc +6`) + +describe('Day 8: Handheld Halting', () => { + describe('Part 1', () => { + it('should solve the sample', () => { + const handheldBootCode = boot(sample) + expect(handheldBootCode).toEqual(5) + }) + it('should solve the', () => { + const handheldBootCode = boot(input) + expect(handheldBootCode).toEqual(1087) + }) + }) +}) From 4cae087e9754912f846fe70bc9c23a009538e590 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Tue, 8 Dec 2020 10:27:59 +0100 Subject: [PATCH 033/110] feat(day08): part 2 --- day08/handheld.ts | 8 ++++---- day08/solution.spec.ts | 43 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/day08/handheld.ts b/day08/handheld.ts index 7aaf0cc..5eb19dd 100644 --- a/day08/handheld.ts +++ b/day08/handheld.ts @@ -1,4 +1,4 @@ -export const boot = (bootCode: string[]): number => { +export const boot = (bootCode: string[]): [number, number] => { const bootInstructions = bootCode .map((s) => s.split(' ')) .map(([i, a]) => [i, parseInt(a, 10)]) @@ -7,11 +7,11 @@ export const boot = (bootCode: string[]): number => { const lineExecutions = {} as Record let ins, arg do { - if (lineExecutions[ptr] !== undefined) return acc + if (lineExecutions[ptr] !== undefined) return [-1, acc] lineExecutions[ptr] = true ins = bootInstructions[ptr]?.[0] arg = bootInstructions[ptr]?.[1] - if (ins === undefined) return acc // normal termination + if (ins === undefined) return [0, acc] // normal termination switch (ins) { case 'nop': ptr++ @@ -28,5 +28,5 @@ export const boot = (bootCode: string[]): number => { ptr++ } } while (ins !== undefined) - return acc + return [-1, acc] } diff --git a/day08/solution.spec.ts b/day08/solution.spec.ts index a951b0c..cfbca12 100644 --- a/day08/solution.spec.ts +++ b/day08/solution.spec.ts @@ -12,16 +12,53 @@ acc -99 acc +1 jmp -4 acc +6`) +const sample2 = loadString(`nop +0 +acc +1 +jmp +4 +acc +3 +jmp -3 +acc -99 +acc +1 +nop -4 +acc +6`) describe('Day 8: Handheld Halting', () => { describe('Part 1', () => { it('should solve the sample', () => { const handheldBootCode = boot(sample) - expect(handheldBootCode).toEqual(5) + expect(handheldBootCode).toEqual([-1, 5]) }) - it('should solve the', () => { + it('should solve', () => { const handheldBootCode = boot(input) - expect(handheldBootCode).toEqual(1087) + expect(handheldBootCode).toEqual([-1, 1087]) + }) + }) + describe('Part 2', () => { + it('should solve the sample', () => { + const handheldBootCode = boot(sample2) + expect(handheldBootCode).toEqual([0, 8]) + }) + it('should solve', () => { + // Find all the jumps + const jmps = input.reduce((jmps, i, k) => { + if (i.startsWith('jmp')) return [...jmps, k] + return jmps + }, [] as number[]) + + // Change one jpm instruction after another and run the program + expect( + jmps.reduce( + (exit, line) => { + if (exit[0] === 0) return exit + return boot([ + ...input.slice(0, line), + input[line].replace('jmp', 'nop'), + ...input.slice(line + 1), + ]) + }, + [-1, 0], + ), + ).toEqual([0, 780]) }) }) }) From a97bc88879a02f5c7b9f5654cb265e4f2e4ee82b Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Tue, 8 Dec 2020 10:30:11 +0100 Subject: [PATCH 034/110] refactor: improve readability --- day08/handheld.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/day08/handheld.ts b/day08/handheld.ts index 5eb19dd..a4a1c85 100644 --- a/day08/handheld.ts +++ b/day08/handheld.ts @@ -1,4 +1,10 @@ +/** + * Run the boot program with loop protection + * and return an exit code (-1 on error) and + * the value of the accumulator. + */ export const boot = (bootCode: string[]): [number, number] => { + // Parse the instructions const bootInstructions = bootCode .map((s) => s.split(' ')) .map(([i, a]) => [i, parseInt(a, 10)]) @@ -8,7 +14,7 @@ export const boot = (bootCode: string[]): [number, number] => { let ins, arg do { if (lineExecutions[ptr] !== undefined) return [-1, acc] - lineExecutions[ptr] = true + lineExecutions[ptr] = true // Record line executions ins = bootInstructions[ptr]?.[0] arg = bootInstructions[ptr]?.[1] if (ins === undefined) return [0, acc] // normal termination @@ -25,8 +31,8 @@ export const boot = (bootCode: string[]): [number, number] => { break default: console.warn(`Unknown instruction: ${ins} ${arg}`) - ptr++ + return [-2, acc] } } while (ins !== undefined) - return [-1, acc] + return [-3, acc] } From fac40ec0c1b76fbd03594ba9b9c5110baf7f4f05 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 9 Dec 2020 07:59:19 +0100 Subject: [PATCH 035/110] feat(day09): part 1 --- day09/findInvalidNumber.ts | 14 + day09/input.txt | 1000 ++++++++++++++++++++++++++++++++++++ day09/solution.spec.ts | 35 ++ 3 files changed, 1049 insertions(+) create mode 100644 day09/findInvalidNumber.ts create mode 100644 day09/input.txt create mode 100644 day09/solution.spec.ts diff --git a/day09/findInvalidNumber.ts b/day09/findInvalidNumber.ts new file mode 100644 index 0000000..0809051 --- /dev/null +++ b/day09/findInvalidNumber.ts @@ -0,0 +1,14 @@ +import { uniqueCombinations } from '../lib/uniqueCombinations' + +const sum = (numbers: number[]) => numbers.reduce((total, n) => total + n, 0) + +export const findInvalidNumber = (preambleLength: number) => ( + input: number[], +): number | undefined => { + const c = uniqueCombinations(2) + return input.find((n, k, arr) => { + if (k < preambleLength) return false + const preamble = c(arr.slice(k - preambleLength, k)) + return preamble.map(sum).find((s) => s === n) === undefined + }) +} diff --git a/day09/input.txt b/day09/input.txt new file mode 100644 index 0000000..92ed3da --- /dev/null +++ b/day09/input.txt @@ -0,0 +1,1000 @@ +14 +9 +43 +18 +13 +24 +3 +38 +33 +8 +41 +4 +32 +15 +31 +44 +17 +34 +21 +10 +50 +37 +2 +23 +6 +47 +5 +9 +11 +16 +12 +18 +7 +13 +26 +14 +19 +8 +20 +15 +29 +58 +17 +22 +21 +24 +25 +10 +27 +31 +33 +23 +28 +30 +34 +32 +35 +38 +49 +18 +26 +36 +37 +47 +39 +56 +40 +42 +43 +41 +44 +45 +46 +48 +50 +51 +53 +79 +73 +69 +117 +54 +55 +90 +57 +62 +75 +114 +85 +94 +110 +81 +98 +153 +86 +89 +204 +96 +101 +103 +104 +152 +169 +124 +135 +109 +143 +171 +119 +132 +137 +207 +166 +167 +184 +185 +170 +175 +182 +187 +190 +197 +233 +204 +212 +244 +299 +228 +339 +241 +246 +269 +415 +319 +298 +349 +337 +333 +444 +357 +345 +362 +365 +562 +377 +387 +401 +416 +541 +469 +472 +474 +647 +591 +487 +515 +567 +617 +686 +1158 +793 +670 +678 +702 +864 +710 +856 +781 +817 +764 +1251 +1214 +885 +941 +943 +946 +961 +1002 +1082 +1456 +1269 +1184 +2104 +1364 +1348 +2032 +1372 +1742 +1412 +1474 +1792 +1545 +1649 +2305 +2358 +1826 +2725 +1828 +3282 +2043 +1907 +1963 +2910 +2266 +2814 +2453 +2532 +2712 +2957 +2720 +2784 +3903 +3019 +3123 +4131 +4006 +3789 +3871 +3654 +4811 +3735 +3791 +5866 +4309 +4416 +4439 +4229 +4719 +5576 +5237 +8578 +5244 +6447 +5504 +8510 +7445 +9570 +7920 +6777 +8725 +7389 +12460 +7606 +13305 +15899 +9992 +14957 +8748 +12843 +8855 +14092 +8948 +9956 +10741 +10481 +10748 +11951 +25705 +12281 +26647 +14697 +14166 +25855 +19473 +16244 +24048 +16354 +16461 +36446 +22914 +17603 +20704 +28195 +17803 +18811 +29429 +18904 +20437 +41380 +24914 +22699 +46409 +26447 +26978 +57624 +33639 +33847 +32598 +41141 +39160 +33957 +70570 +34064 +35406 +36414 +80323 +50894 +36614 +36707 +48333 +63592 +39341 +43136 +66445 +59313 +49146 +92952 +99043 +99227 +73028 +66237 +69012 +66555 +70771 +68021 +107362 +69470 +70478 +71820 +73121 +91469 +76048 +73321 +107478 +108353 +122905 +142591 +92282 +108459 +115383 +125194 +142791 +137491 +135567 +132792 +199928 +134576 +163289 +138499 +334504 +205037 +197014 +142298 +144941 +267785 +149369 +271642 +165603 +237223 +200635 +207665 +227849 +200741 +352606 +259770 +257986 +431074 +310544 +267368 +283440 +291667 +273075 +304102 +402068 +287239 +294310 +307901 +314972 +345682 +350004 +350110 +437245 +612376 +401376 +408300 +435514 +636046 +695539 +675143 +547009 +525354 +540443 +684816 +550808 +1076162 +560314 +567385 +933654 +581549 +595140 +602211 +664976 +968614 +695686 +700114 +751486 +809676 +1044346 +926730 +1318871 +960868 +1065797 +1091251 +1225951 +1646557 +2157048 +1121992 +1153019 +1519422 +1127699 +1155454 +1277235 +1176689 +1183760 +1197351 +1267187 +1360662 +1626844 +1395800 +1712354 +2213243 +1736406 +1887598 +1992527 +2088567 +2026665 +2187789 +2218950 +2277446 +2329708 +2249691 +2280718 +2283153 +2304388 +2311459 +3516878 +2453924 +2544422 +5605445 +2464538 +3353189 +3949649 +3132206 +3108154 +5319995 +5686055 +3914263 +3880125 +5220773 +4115232 +4214454 +4437480 +4468641 +4554079 +4563871 +4530409 +5807113 +4587541 +4615847 +4998346 +6378801 +10826218 +5008960 +5596744 +7018617 +6485395 +6240360 +6988279 +7022417 +9022720 +8530110 +7794388 +7995357 +8329686 +8552712 +8906121 +13145957 +8999050 +12016963 +12615361 +9528755 +15015505 +14537715 +10007306 +13258977 +10605704 +12027577 +13504012 +11837104 +15518389 +13228639 +14782667 +27928624 +14816805 +15789745 +16525467 +16325043 +16548069 +21016013 +21844410 +17905171 +23751661 +20134459 +26930747 +19536061 +20613010 +22034883 +22442808 +31843432 +25096081 +29553682 +36661215 +25065743 +26619771 +29018384 +36817550 +38968275 +30606550 +41591210 +32114788 +25918798 +36084130 +34453240 +37441232 +38039630 +47100626 +63748297 +57537297 +40149071 +43055818 +42647893 +44477691 +47508551 +54114465 +61883293 +50984541 +56525348 +51685514 +52538569 +54937182 +58033586 +69574825 +93966580 +60372038 +103019931 +62002928 +70537370 +95576927 +75480862 +117862762 +82796964 +178500793 +112987469 +123689290 +85703711 +107880589 +174870762 +103523110 +124512007 +102670055 +120036514 +125474552 +161053517 +107475751 +112970768 +169478679 +122374966 +130909408 +211178263 +132540298 +137483790 +183361451 +278938378 +198674479 +215640823 +293167969 +416857259 +218244009 +188373766 +193179462 +249986559 +206193165 +220446519 +227182062 +210145806 +294953231 +229850717 +235345734 +244959541 +243880176 +382035930 +319283174 +367886032 +270024088 +315901749 +320845241 +371735217 +468230568 +592181736 +381553228 +544939790 +418224483 +394566931 +436043882 +399372627 +416338971 +426639684 +439996523 +474810258 +611886647 +465196451 +473730893 +480305275 +743754981 +710468680 +1175665131 +585925837 +590869329 +636746990 +796207024 +760841764 +891955376 +776120159 +780925855 +793939558 +810905902 +826012311 +1026913211 +835416509 +815711598 +842978655 +906944959 +905192974 +938927344 +1077083098 +945501726 +954036168 +1066231112 +1845872303 +1176795166 +1970734724 +1222672827 +1387076353 +1761213324 +1536961923 +1726427581 +2016010442 +1574865413 +1591831757 +1739441284 +1720904572 +1754638942 +2768626923 +3420737716 +1844120318 +1748171629 +1812137933 +1850694700 +1884429070 +1899537894 +2011732838 +2020267280 +3595132693 +3860130760 +3199214286 +2609749180 +3862427538 +3141715295 +3111827336 +5215224728 +3425560113 +3166697170 +3295769985 +3312736329 +3460345856 +3469076201 +3502810571 +3560309562 +3592291947 +3598866329 +7027362661 +5049908986 +4494178250 +3896161908 +4509287074 +4032000118 +5523077851 +7020655418 +6963156427 +5721576516 +5751464475 +6424563665 +6253542631 +6278524506 +8718035299 +6635773371 +9753576634 +10572986837 +6905028276 +6929422057 +7488453855 +7095102518 +7152601509 +7191158276 +14803485620 +14583556373 +7928162026 +10859318335 +13788374880 +8541287192 +9555077969 +11244654367 +12005007106 +14417875912 +11473040991 +12029988981 +13060337036 +12532067137 +12914297877 +13540801647 +13730875889 +13834450333 +14000130794 +14024524575 +14082023566 +20883477398 +26072868784 +14343759785 +15119320302 +19933169132 +22959163104 +16469449218 +29488247101 +20799732336 +18096365161 +21028118960 +23274643348 +55561115885 +24533378027 +26894787369 +24562056118 +27540932441 +25446365014 +69561246679 +27271677536 +27565326222 +27834581127 +48424409839 +28106548141 +28425783351 +42629743188 +44991152530 +35143492121 +50169430717 +40732901468 +34565814379 +37497568178 +38896097497 +39124484121 +51456843487 +44302762308 +51700426699 +49095434145 +77710363158 +50008421132 +51833733654 +54837003758 +56532331492 +55106258663 +55378225677 +55399907349 +63569275472 +62672362520 +80134644651 +93398196453 +73690298500 +76622052299 +69709306500 +72063382557 +73461911876 +106856750836 +76393665675 +115746536420 +90958217775 +119204694012 +105627765637 +99103855277 +148235200211 +135512870328 +104845424890 +110778133026 +109943262421 +195803642665 +110484484340 +118969182821 +216800013257 +209588339617 +132381669020 +141772689057 +195591235120 +267867025222 +187809918977 +303556455397 +145525294433 +149855577551 +167351883450 +181239090565 +201442702115 +190062073052 +224832459649 +204731620914 +260741871878 +215623557916 +214788687311 +306288127005 +274154358077 +355161802427 +400322856034 +252257173397 +313620759585 +277906963453 +282237246571 +356561376368 +506416953919 +295380871984 +442319246449 +312877177883 +317207461001 +326764384998 +604671348451 +348590974015 +385970711479 +391504775167 +569950489738 +419520308225 +883571249323 +430412245227 +467045860708 +488943045388 +526411531474 +708712236168 +530164136850 +640385144583 +577618118555 +591527723038 +612588332985 +595114424454 +769083631447 +747619706228 +608258049867 +908735184039 +630084638884 +643971845999 +712735096477 +897458105935 +734561685494 +777475486646 +1027778358092 +1197655281556 +849932553452 +919355290615 +1021939968265 +955988906096 +1019107182238 +1260973216968 +1107782255405 +1284356990582 +1169145841593 +1480017192336 +1221612361922 +1203372474321 +1225199063338 +1238342688751 +1356706942476 +1252229895866 +1274056484883 +1562667649929 +2066603947528 +2216762463794 +1753668867732 +1627408040098 +1696830777261 +1769287844067 +2922814709325 +2144554353953 +1938462472853 +3878803615421 +2063771161501 +2126889437643 +2276928096998 +2311154729726 +2372518315914 +4619645486586 +2428571537659 +2424984836243 +2441715163072 +4310980788767 +3379119333509 +2919374592405 +2526286380749 +2836724134812 +4046215941065 +6798178207826 +3324238817359 +3381076907830 +6374751950268 +3466118621328 +3707750316920 +6630565026245 +4065351910496 +8189784404188 +4190660599144 +4340699258499 +8803323487927 +4588082826724 +4683673045640 +4797503152157 +7048217024245 +9967591616650 +5361089755477 +4968001543821 +5907363288579 +6984726502901 +5363010515561 +15174510907089 +8406051168995 +6705315725189 +6790357438687 +8178580059987 +8391423362560 +7656779220472 +8988163751301 +10821225625389 +9024372304139 +8531359857643 +8778743425868 +8874333644784 +8928782085223 +9271755872364 +11782229655058 +9765504695978 +10158592907634 +12347737018462 +10331012059382 +16184236140950 +14237344160345 +11270373804140 +14351174266862 +14447136659159 +13495673163876 +15096739087749 +14883895785176 +17415795666699 +28531973159412 +17519523608944 +16585561305695 +17405693502427 +17803115730007 +17555732161782 +32439627946958 +17653077070652 +20144707448924 +20542129676504 +32652471249531 +24649400481154 +19924097603612 +20489604967016 +21601385863522 +23826685223258 +24766046968016 +48476085704412 +25621548071002 +27846847430738 +31966660268103 +28379568949052 +29980634872925 +34001356972394 +33991254808122 +44910754416940 +61838102238860 +37127690982199 +34961425664209 +41525483467134 +35208809232434 +48336452397754 +37577174674264 +40068805052536 +53568046131625 +40413702570628 +47222933934524 +68448374001588 +42090990830538 +45428071086780 +54746681840941 +50387595039018 +53468395501740 +54001117020054 +56226416379790 +58360203821977 +62380925921446 \ No newline at end of file diff --git a/day09/solution.spec.ts b/day09/solution.spec.ts new file mode 100644 index 0000000..f914356 --- /dev/null +++ b/day09/solution.spec.ts @@ -0,0 +1,35 @@ +import { loader, loadString } from '../lib/loader' +import { findInvalidNumber } from './findInvalidNumber' + +const toInt = (s: string) => parseInt(s, 10) +const load = loader(9) +const sample = loadString(`35 +20 +15 +25 +47 +40 +62 +55 +65 +95 +102 +117 +150 +182 +127 +219 +299 +277 +309 +576`).map(toInt) +const input = load('input').map(toInt) + +describe('Day 9: Encoding Error', () => { + describe('Part 1', () => { + it('should solve the sample', () => + expect(findInvalidNumber(5)(sample)).toEqual(127)) + it('should solve', () => + expect(findInvalidNumber(25)(input)).toEqual(25918798)) + }) +}) From 6c8951459caa23cf6aa92942566c0d9b234935de Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 9 Dec 2020 08:20:51 +0100 Subject: [PATCH 036/110] feat(day09): part 2 --- day09/findInvalidNumber.ts | 3 ++- day09/findSet.ts | 18 ++++++++++++++++++ day09/solution.spec.ts | 11 +++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 day09/findSet.ts diff --git a/day09/findInvalidNumber.ts b/day09/findInvalidNumber.ts index 0809051..d82de3f 100644 --- a/day09/findInvalidNumber.ts +++ b/day09/findInvalidNumber.ts @@ -1,6 +1,7 @@ import { uniqueCombinations } from '../lib/uniqueCombinations' -const sum = (numbers: number[]) => numbers.reduce((total, n) => total + n, 0) +export const sum = (numbers: number[]): number => + numbers.reduce((total, n) => total + n, 0) export const findInvalidNumber = (preambleLength: number) => ( input: number[], diff --git a/day09/findSet.ts b/day09/findSet.ts new file mode 100644 index 0000000..6231bb7 --- /dev/null +++ b/day09/findSet.ts @@ -0,0 +1,18 @@ +// Use backtracking to iterate over growing sets of previous numbers +const sumSet = (input: number[], find: number) => ( + start: number, + size = 2, +): number[] => { + const begin = start - size + if (begin < 0) return [] + const set = input.slice(begin, start) + const setSum = set.reduce((total, n) => total + n, 0) + if (setSum === find) return set + // The set is getting too large + if (setSum > find) return sumSet(input, find)(start - 1) // Move up one line + // Grow the set + return sumSet(input, find)(start, size + 1) +} + +export const findSet = (n: number) => (input: number[]): number[] => + sumSet(input, n)(input.indexOf(n)) diff --git a/day09/solution.spec.ts b/day09/solution.spec.ts index f914356..12d27e6 100644 --- a/day09/solution.spec.ts +++ b/day09/solution.spec.ts @@ -1,5 +1,6 @@ import { loader, loadString } from '../lib/loader' import { findInvalidNumber } from './findInvalidNumber' +import { findSet } from './findSet' const toInt = (s: string) => parseInt(s, 10) const load = loader(9) @@ -32,4 +33,14 @@ describe('Day 9: Encoding Error', () => { it('should solve', () => expect(findInvalidNumber(25)(input)).toEqual(25918798)) }) + describe('Part 2', () => { + it('should solve the sample', () => { + expect(findSet(127)(sample)).toEqual([15, 25, 47, 40]) + }) + it('should solve', () => { + const set = findSet(25918798)(input) + set.sort((a, b) => a - b) + expect(set[0] + set[set.length - 1]).toEqual(3340942) + }) + }) }) From a5630a0e45357b3677f013fc796a4400f2755a54 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 9 Dec 2020 08:30:56 +0100 Subject: [PATCH 037/110] refactor: improve readability --- day09/findInvalidNumber.ts | 15 +++++++++++++-- day09/findSet.ts | 22 +++++++++++++--------- day09/solution.spec.ts | 4 ++-- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/day09/findInvalidNumber.ts b/day09/findInvalidNumber.ts index d82de3f..0e3dde9 100644 --- a/day09/findInvalidNumber.ts +++ b/day09/findInvalidNumber.ts @@ -1,15 +1,26 @@ import { uniqueCombinations } from '../lib/uniqueCombinations' -export const sum = (numbers: number[]): number => +const sum = (numbers: number[]): number => numbers.reduce((total, n) => total + n, 0) +const equal = (n: number) => (compare: number): boolean => compare === n + +/** + * Finds the invalid number in the input: + * To be valid, the number must be the sum of two of those numbers in + * the subset of preambleLength preceeding it. + */ export const findInvalidNumber = (preambleLength: number) => ( input: number[], ): number | undefined => { const c = uniqueCombinations(2) + // Go through all numbers return input.find((n, k, arr) => { + // Skip if it is part of the preamble if (k < preambleLength) return false + // Build a list of all possible pairs of numbers in the preamble const preamble = c(arr.slice(k - preambleLength, k)) - return preamble.map(sum).find((s) => s === n) === undefined + // If there is no pair which's sum equals this number, it is invalid + return preamble.map(sum).find(equal(n)) === undefined }) } diff --git a/day09/findSet.ts b/day09/findSet.ts index 6231bb7..a8b2dbd 100644 --- a/day09/findSet.ts +++ b/day09/findSet.ts @@ -1,18 +1,22 @@ -// Use backtracking to iterate over growing sets of previous numbers -const sumSet = (input: number[], find: number) => ( - start: number, +/** + * Use backtracking to iterate over growing sets of previous numbers in input + * until a continuous set of numbers is found which's sums up the the number + * we are interested in. + */ +export const findSet = ( + input: number[], + interestingNumber: number, + start = input.indexOf(interestingNumber), size = 2, ): number[] => { const begin = start - size if (begin < 0) return [] const set = input.slice(begin, start) const setSum = set.reduce((total, n) => total + n, 0) - if (setSum === find) return set + if (setSum === interestingNumber) return set // The set is getting too large - if (setSum > find) return sumSet(input, find)(start - 1) // Move up one line + if (setSum > interestingNumber) + return findSet(input, interestingNumber, start - 1) // Move up one line // Grow the set - return sumSet(input, find)(start, size + 1) + return findSet(input, interestingNumber, start, size + 1) } - -export const findSet = (n: number) => (input: number[]): number[] => - sumSet(input, n)(input.indexOf(n)) diff --git a/day09/solution.spec.ts b/day09/solution.spec.ts index 12d27e6..20b4652 100644 --- a/day09/solution.spec.ts +++ b/day09/solution.spec.ts @@ -35,10 +35,10 @@ describe('Day 9: Encoding Error', () => { }) describe('Part 2', () => { it('should solve the sample', () => { - expect(findSet(127)(sample)).toEqual([15, 25, 47, 40]) + expect(findSet(sample, 127)).toEqual([15, 25, 47, 40]) }) it('should solve', () => { - const set = findSet(25918798)(input) + const set = findSet(input, 25918798) set.sort((a, b) => a - b) expect(set[0] + set[set.length - 1]).toEqual(3340942) }) From 122e451a2feffeb9824eddd8809fb50b6a35a7c1 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Thu, 10 Dec 2020 09:00:02 +0100 Subject: [PATCH 038/110] feat(day10): part 1 --- day10/input.txt | 106 ++++++++++++++++++++++++++++++++++++++ day10/sample.txt | 11 ++++ day10/sample2.txt | 31 +++++++++++ day10/solution.spec.ts | 31 +++++++++++ day10/stringUpAdapters.ts | 24 +++++++++ 5 files changed, 203 insertions(+) create mode 100644 day10/input.txt create mode 100644 day10/sample.txt create mode 100644 day10/sample2.txt create mode 100644 day10/solution.spec.ts create mode 100644 day10/stringUpAdapters.ts diff --git a/day10/input.txt b/day10/input.txt new file mode 100644 index 0000000..33cc291 --- /dev/null +++ b/day10/input.txt @@ -0,0 +1,106 @@ +66 +7 +73 +162 +62 +165 +157 +158 +137 +125 +138 +59 +36 +40 +94 +95 +13 +35 +136 +96 +156 +155 +24 +84 +42 +171 +142 +3 +104 +149 +83 +129 +19 +122 +68 +103 +74 +118 +20 +110 +54 +127 +88 +31 +135 +26 +126 +2 +51 +91 +16 +65 +128 +119 +67 +48 +111 +29 +49 +12 +132 +17 +41 +166 +75 +146 +50 +30 +1 +164 +112 +34 +18 +72 +97 +145 +11 +117 +58 +78 +152 +90 +172 +163 +89 +107 +45 +37 +79 +159 +141 +105 +10 +115 +69 +170 +25 +100 +80 +4 +85 +169 +106 +57 +116 +23 \ No newline at end of file diff --git a/day10/sample.txt b/day10/sample.txt new file mode 100644 index 0000000..cd1b40b --- /dev/null +++ b/day10/sample.txt @@ -0,0 +1,11 @@ +16 +10 +15 +5 +1 +11 +7 +19 +6 +12 +4 \ No newline at end of file diff --git a/day10/sample2.txt b/day10/sample2.txt new file mode 100644 index 0000000..be5c492 --- /dev/null +++ b/day10/sample2.txt @@ -0,0 +1,31 @@ +28 +33 +18 +42 +31 +14 +46 +20 +48 +47 +24 +23 +49 +45 +19 +38 +39 +11 +1 +32 +25 +35 +8 +17 +7 +9 +4 +2 +34 +10 +3 \ No newline at end of file diff --git a/day10/solution.spec.ts b/day10/solution.spec.ts new file mode 100644 index 0000000..ca4df6c --- /dev/null +++ b/day10/solution.spec.ts @@ -0,0 +1,31 @@ +import { loader } from '../lib/loader' +import { countDifferences, stringUpAdapters } from './stringUpAdapters' + +const toInt = (s: string) => parseInt(s, 10) +const load = loader(10) +const sample = load('sample').map(toInt) +const sample2 = load('sample2').map(toInt) +const input = load('input').map(toInt) + +describe('Day 10: Adapter Array', () => { + describe('Part 1', () => { + it('should solve the sample', () => { + const adapters = stringUpAdapters(sample) + expect(adapters).toEqual([1, 4, 5, 6, 7, 10, 11, 12, 15, 16, 19, 22]) + const differences = countDifferences(adapters) + expect(differences).toEqual({ 1: 7, 3: 5 }) + }) + it('should solve the seconds sample', () => + expect(countDifferences(stringUpAdapters(sample2))).toEqual({ + 1: 22, + 3: 10, + })) + it('should solve the seconds sample', () => + expect( + Object.values(countDifferences(stringUpAdapters(input))).reduce( + (total, r) => total * r, + 1, + ), + ).toEqual(2482)) + }) +}) diff --git a/day10/stringUpAdapters.ts b/day10/stringUpAdapters.ts new file mode 100644 index 0000000..9afb66b --- /dev/null +++ b/day10/stringUpAdapters.ts @@ -0,0 +1,24 @@ +/** + * String up all adapters (by sorting them). + * Finally, your device's built-in adapter is always 3 higher than the highest adapter + */ +export const stringUpAdapters = (adapterRatings: number[]): number[] => { + const sorted = [...adapterRatings].sort((a, b) => a - b) + sorted.push(sorted[sorted.length - 1] + 3) // Add device adapter + return sorted +} + +/** + * Count the rating differences in the string of adapters + */ +export const countDifferences = ( + adapterRatings: number[], +): Record => + adapterRatings.reduce((diff, rating, index, ratings) => { + const previousRating = ratings[index - 1] ?? 0 + const ratingDiff = rating - previousRating + return { + ...diff, + [ratingDiff]: (diff[ratingDiff] ?? 0) + 1, // Increase counter for this rating differences + } + }, {} as Record) From 3d0882a15222a8561ba6ae0aa3d6ecc0cff8cfe4 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Thu, 10 Dec 2020 18:49:59 +0100 Subject: [PATCH 039/110] feat(day10): part 2 ... after 3rd try --- day10/arrangeAdapters.ts | 80 +++++++++++++++++++++++++++++++ day10/countAdapterArrangements.ts | 39 +++++++++++++++ day10/countRoutes.ts | 26 ++++++++++ day10/solution.spec.ts | 32 +++++++++++++ 4 files changed, 177 insertions(+) create mode 100644 day10/arrangeAdapters.ts create mode 100644 day10/countAdapterArrangements.ts create mode 100644 day10/countRoutes.ts diff --git a/day10/arrangeAdapters.ts b/day10/arrangeAdapters.ts new file mode 100644 index 0000000..899d3c5 --- /dev/null +++ b/day10/arrangeAdapters.ts @@ -0,0 +1,80 @@ +import { countDifferences, stringUpAdapters } from './stringUpAdapters' + +const checks = {} as Record + +const hashRatings = (ratings: number[]): string => ratings.toString() + +const isValid = (ratings: number[]): boolean => { + const hash = hashRatings(ratings) + if (checks[hash] === undefined) { + const diffs = countDifferences(ratings) + // All differences must be between 1-3 volts + const diffRatingsValid = Object.keys(diffs).reduce((isValid, rating) => { + if (isValid === false) return false + const r = parseInt(rating, 10) + return r >= 1 && r <= 3 + }, true) + checks[hash] = diffRatingsValid + } + return checks[hash] +} + +/** + * First attempt, mutate the arrangements by removing one or more adapters + * and verifying if this arrangement is valid. + * If yes, remove more adapters until it is not. + * + * This works, but is too slow. + */ +const mutate = ( + ratings: number[], + mutations: number[][], + deviceRating: number = ratings[ratings.length - 1], + deleteFrom = 0, + deleteAmount = 1, + previousPassed = true, +): boolean => { + // We would be deleting the entire list of adapters + if (deleteFrom >= ratings.length) return false + if (deleteFrom + deleteAmount >= ratings.length) return false + // Create the mutation by removing adapters from the given position + const mutation = [ + ...ratings.slice(0, deleteFrom), + ...ratings.slice(deleteFrom + deleteAmount), + ] + // We removed all + if (mutation.length === 0) return false + // We no longer can connect to the device + if (mutation[mutation.length - 1] !== deviceRating) return false + // We already know this is a valid mutations + const mutationHash = hashRatings(mutation) + if (mutations.find((m) => hashRatings(m) === mutationHash)) return false + // We have already checked this mutation + if (checks[mutationHash] !== undefined) { + return mutate(ratings, mutations, deviceRating, deleteFrom + 1, 1, false) + } + if (isValid(mutation)) { + mutations.push(mutation) // Found one + // Continue with this mutation, delete more + mutate(mutation, mutations, deviceRating, deleteFrom - deleteAmount, 1) + mutate( + mutation, + mutations, + deviceRating, + deleteFrom - deleteAmount, + deleteAmount + 1, + ) + // If we found this from a previously valid combination, + // continue with the entire chain and delete more + if (previousPassed) + mutate(ratings, mutations, deviceRating, deleteFrom, deleteAmount + 1) + } + return mutate(ratings, mutations, deviceRating, deleteFrom + 1, 1, false) +} + +export const arrangeAdapters = (ratings: number[]): number[][] => { + const sorted = stringUpAdapters(ratings) + const mutations = [] as number[][] + mutate(sorted, mutations) + return [sorted, ...mutations] +} diff --git a/day10/countAdapterArrangements.ts b/day10/countAdapterArrangements.ts new file mode 100644 index 0000000..8e4186b --- /dev/null +++ b/day10/countAdapterArrangements.ts @@ -0,0 +1,39 @@ +import { stringUpAdapters } from './stringUpAdapters' + +const chainConnections = ( + connections: Record, + chains = 0, + rating = 0, +): number => { + // If there is no more adapter to connect, we have reached the end of the chain + if (connections[rating].length === 0) { + // end of chain + return 1 + } + // For all possible connections to this adapter extend the chain + return connections[rating].reduce( + (total, connection) => + total + chainConnections(connections, chains, connection), + chains, + ) +} + +/** + * Improved implementation: this one first determins all possible adapters one, + * and then creates a chain for all these combinations using backtracking. + */ +export const countAdapterArrangements = (ratings: number[]): number => { + const connections = [0, ...stringUpAdapters(ratings)] + .sort((a, b) => a - b) + .reduce( + (connections, rating, _, ratings) => ({ + ...connections, + [rating]: ratings.filter((r) => { + const diff = r - rating + return diff >= 1 && diff <= 3 + }), + }), + {} as Record, + ) + return chainConnections(connections) +} diff --git a/day10/countRoutes.ts b/day10/countRoutes.ts new file mode 100644 index 0000000..e60a064 --- /dev/null +++ b/day10/countRoutes.ts @@ -0,0 +1,26 @@ +import { stringUpAdapters } from './stringUpAdapters' + +/** + * Third aproach: count the possible routes + * Go through each adapter and count how many routes lead to this adapter. + * There can be at max three adapters leading to this one in the previous + * connection, because of the rating constraint (diff must be 1-3). + */ +export const countRoutes = (ratings: number[]): number => { + const adapters = [0, ...stringUpAdapters(ratings)] // sort by rating + const routes = adapters.map((_, k) => (k === 0 ? 1 : 0)) // Create the map to store the routes needed to reach each adapter + + // there are n adapters + for (let n = 0; n < routes.length; n++) { + // add the number of routes that lead to the preceeding 3 adapters + for (let j = n - 3; j < n; j++) { + if (adapters[n] <= adapters[j] + 3) { + routes[n] += routes[j] + } + } + } + + // the last entry now contains the sum of all possibly combinations leading + // to the last adapter + return routes[routes.length - 1] +} diff --git a/day10/solution.spec.ts b/day10/solution.spec.ts index ca4df6c..3afcb58 100644 --- a/day10/solution.spec.ts +++ b/day10/solution.spec.ts @@ -1,5 +1,8 @@ import { loader } from '../lib/loader' import { countDifferences, stringUpAdapters } from './stringUpAdapters' +import { arrangeAdapters } from './arrangeAdapters' +import { countAdapterArrangements } from './countAdapterArrangements' +import { countRoutes } from './countRoutes' const toInt = (s: string) => parseInt(s, 10) const load = loader(10) @@ -28,4 +31,33 @@ describe('Day 10: Adapter Array', () => { ), ).toEqual(2482)) }) + describe('Part 2', () => { + it('should solve the sample', () => { + const arr = arrangeAdapters(sample) + expect(arr).toHaveLength(8) + expect(arr).toContainEqual([1, 4, 5, 6, 7, 10, 11, 12, 15, 16, 19, 22]) + expect(arr).toContainEqual([1, 4, 5, 6, 7, 10, 12, 15, 16, 19, 22]) + expect(arr).toContainEqual([1, 4, 5, 7, 10, 11, 12, 15, 16, 19, 22]) + expect(arr).toContainEqual([1, 4, 5, 7, 10, 12, 15, 16, 19, 22]) + expect(arr).toContainEqual([1, 4, 6, 7, 10, 11, 12, 15, 16, 19, 22]) + expect(arr).toContainEqual([1, 4, 6, 7, 10, 12, 15, 16, 19, 22]) + expect(arr).toContainEqual([1, 4, 7, 10, 11, 12, 15, 16, 19, 22]) + expect(arr).toContainEqual([1, 4, 7, 10, 12, 15, 16, 19, 22]) + }) + it('should solve the sample (using countAdapterArrangements)', () => { + const arr = countAdapterArrangements(sample) + expect(arr).toEqual(8) + }) + it('should solve the sample (using countAdapterArrangements)', () => + expect(countAdapterArrangements(sample)).toEqual(8)) + + it('should solve the second sample (using countAdapterArrangements)', () => + expect(countAdapterArrangements(sample2)).toEqual(19208)) + + // The two above approaches were too slow + it('should solve the second sample (using countWays)', () => + expect(countRoutes(sample2)).toEqual(19208)) + + it('should solve', () => expect(countRoutes(input)).toEqual(96717311574016)) + }) }) From a0788065dfcf42480e3eb27e780bc16f2f154c81 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 11 Dec 2020 09:07:15 +0100 Subject: [PATCH 040/110] feat(day11): part 1 --- day11/input.txt | 91 ++++++++++++++++++++++++++++++++++ day11/seatingSimulator.ts | 102 ++++++++++++++++++++++++++++++++++++++ day11/solution.spec.ts | 39 +++++++++++++++ 3 files changed, 232 insertions(+) create mode 100644 day11/input.txt create mode 100644 day11/seatingSimulator.ts create mode 100644 day11/solution.spec.ts diff --git a/day11/input.txt b/day11/input.txt new file mode 100644 index 0000000..75548d9 --- /dev/null +++ b/day11/input.txt @@ -0,0 +1,91 @@ +LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLL.LLLLLLL.LLLLLL.LL.LLLL.LLLLLLLLLLLLLLL +LLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLLLLLL.LLLLLLL.LLLL.LLL....LLL.LLL.LLLLLLL.LLL.LLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLL.LLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL +LLLL.LLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLL.LLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLL.LLLL.LLLLLLL.L.LLL.LLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLL.LLL..LL.LLL +LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLL.LLLLLL.LLLL.LL.L.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLL.LLLLLL.L.LLLLLLLLLL.LLL.LLLL.LLLLLLLLLLLLL.LLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLL +....L..L....L...L.......L.LL.....L..L...LLLL.LLL..L.L...LL..L...LL.....L..LL.....L....L.L..L +LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLL.LLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL..LLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL.LL..LLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLL +LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLL..LLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLLLLLLL.LLLLLLLLLLL.LLLL.LLLLLLLLL.L.LLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLL.LLLLLLLLLLL.LLL.LLLLL.LLLLLLLLLLLLLLLLLLLLL..LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +.L..L......L.L....L...L..........L.L....L...LL....LL....LL...LLL....LL..L...L...L.........L. +LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLL.LL.LLLLLLLLLLLLLLLLLLLLL..LLLLLLLLLLLLLLLLLL.LLLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLL.LL.LLLLLLL.LLLLLLL.L.LLL.LLLL.LLLLLLLLLLL +LLLLLL.LL.LLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLL.LL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLL +LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLL..LLLLLLLLLL +LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL.L.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLL.LL.L.LLLLLLLLLLLLLL.L.LLLLLLLLLLL +LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL +LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL +..L.L.L..L.L.....LL..L........L..L....L...LL.........L.L.L.L..L......L.........L..L....L.... +LLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLL.L.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLL.L.LLLLLLLLLLLLLLL.LLLL +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLL +LLLL.LLLL.LLLLLLLLLL..LLLLLLLLL.LLLLLLLLLLL.LLL.LLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLL +LLLL.LLLL.LLL..LLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLL.LLLL.LLLLLLLLLLL +LLLLLLLLLLLLLLLL.LLLL.LLLLLLL.L.LL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLL.L.LLLLLLLL.LL.LLLLLLLL +LLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLL +L...L.......LL.LL.L....L...L.....L.......L.........L.L.L..LL.L.L.L.L..L....L.L...L.L.LL..... +LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLL..LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL +LLLLL.LLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL.LLL.LLLLLL. +LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL..LLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLL. +LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL..LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LL +..LLL.L..L..L..L..L..L.L...LL..L.....LLL.L..LL.....LLL.......L.L...L........LL........L....L +LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLLLLLLL +LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLL +LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL +L.LLLLLLL.LLLL.LLLLLL.LLLLLLLLL.LL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +LL.LL...L......L.L.....L.........L....L...L..L..LLL.L...L......L.L.....LL..LL..LLL....L..L.L +LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLL +LL.LLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLL.L.LLLLLLLLL +LLLLLLL.L.LLLL.LLLL.L.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LL +L..L.L....L......LLLL...L....LL...L..LLL......LLL.LL.LLL...LL..L...LLL........L.....LL.L.LLL +LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLL.LL.LLLLLLLL.LLLLLLLLLLL +LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.L.LLLLLLL.LLLLLLL.LLLLLLL.L.LL.LLLLL.LLLLLLLLLLL +LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLL..LLLLLL.LLLL.LLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL +LL.......L......L...LL.......LL.LL.LL.L.LL.L..L.......L.L.LLLL.LL...LL......LLL..L....LLL... +LLLLLLLLL.LLL..LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLLLLLL.LLLLL.LLLLLLLL.LL.LLLLLLLLL.L.LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLL +LLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLLLLL.L.LLLLLLLL.LLLLLLLLLLL +LLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL..LLLLLLLL.LLLLLLLLLLLLLLLLLLLL +LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLL.LLLLLLLLL +LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLL.L.LLLLLLLLLLLLLLLLLLLL +...L..L..L..L...L.........L.L.L..LLL.....LL......L..LLL..L.L.......L.L.L..LLL...........L... +LLLLLLLLL.LLLL..LLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLL.LLL.LLLLLLLL.LLLLLLLLLLL +LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLL.L.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.L.LLLLLLLLL +LLLLLLLLL.LLLL.LLL..L.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.L.LLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLLL.LLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLL.LLLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLL.LLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLL.LLLLLLL.LL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL..LLLLLLLLLLLLLLLLLLL +..L.LLL.....L....L.L.L..L.L..L.L..LL.......L.L.L......L..L..L..L..L.......L...LL..LL..L...LL +LLLLLLLLL.LL.LLLL.LLL.LLLLLLLLLL.LLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL..LLLLLL.L.LLLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLL.LL.LLLLLL.LLLLLL.L.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLLLLLLLLL.LL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLL.LLLLLL.L.LLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLL.LLLL..LLLLLLLL.LLLLLLLLLLL +LLLLLLLLLLLLL..LLLLLLLLLLLLLLLL.LLLL.L.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL..LL.LLLLL.LLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLL.L +LLLL.LLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLL.LLLL +LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL..LLLLLLLLLLL.LLLLLLLLL.L.LLLLLLLLLLLLLLL.LLLLLLLL..LLLLLLLLLL +LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL +LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL +LLLLLLLLL.LLLLLLL.LLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLL..LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +L.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLL.LLLLLL..LLLLLLLLLLLLLLLLLL.LLL.LLLLLLL \ No newline at end of file diff --git a/day11/seatingSimulator.ts b/day11/seatingSimulator.ts new file mode 100644 index 0000000..913e86f --- /dev/null +++ b/day11/seatingSimulator.ts @@ -0,0 +1,102 @@ +enum Tile { + Empty = 'L', + Occupied = '#', +} +enum Direction { + N, + NE, + E, + SE, + S, + SW, + W, + NW, + NONE, +} + +const is = ( + world: string[][], + row: number, + col: number, + state: Tile, + dir = Direction.NONE, +): boolean => { + switch (dir) { + case Direction.NONE: + if (row < 0) return false + if (row >= world.length) return false + if (col < 0) return false + if (col >= world[row].length) return false + return world[row][col] === state + case Direction.N: + return is(world, row - 1, col, state) + case Direction.NE: + return is(world, row - 1, col + 1, state) + case Direction.E: + return is(world, row, col + 1, state) + case Direction.SE: + return is(world, row + 1, col + 1, state) + case Direction.S: + return is(world, row + 1, col, state) + case Direction.SW: + return is(world, row + 1, col - 1, state) + case Direction.W: + return is(world, row, col - 1, state) + case Direction.NW: + return is(world, row - 1, col - 1, state) + default: + console.error(`Unknown direction ${dir}.`) + return false + } +} + +export const render = (world: string[][]): string => + world.map((s) => s.join('')).join('\n') + +const iteration = (current: string[][]): string[][] => { + const next = [] + for (let row = 0; row < current.length; row++) { + next[row] = [] as string[] + for (let col = 0; col < current[0].length; col++) { + let occupied = 0 + occupied += is(current, row, col, Tile.Occupied, Direction.N) ? 1 : 0 + occupied += is(current, row, col, Tile.Occupied, Direction.NE) ? 1 : 0 + occupied += is(current, row, col, Tile.Occupied, Direction.E) ? 1 : 0 + occupied += is(current, row, col, Tile.Occupied, Direction.SE) ? 1 : 0 + occupied += is(current, row, col, Tile.Occupied, Direction.S) ? 1 : 0 + occupied += is(current, row, col, Tile.Occupied, Direction.SW) ? 1 : 0 + occupied += is(current, row, col, Tile.Occupied, Direction.W) ? 1 : 0 + occupied += is(current, row, col, Tile.Occupied, Direction.NW) ? 1 : 0 + if (current[row][col] === Tile.Empty) { + next[row][col] = occupied === 0 ? Tile.Occupied : current[row][col] + } else if (current[row][col] === Tile.Occupied) { + next[row][col] = occupied >= 4 ? Tile.Empty : current[row][col] + } else { + next[row][col] = current[row][col] + } + } + } + return next +} + +/** + * Run until equilibrium is reached + */ +export const seatingSimulator = (world: string): string[][] => { + const start = world + .split('\n') + .map((s) => s.trim().split('')) + .filter((s) => s.length > 0) + + let prevOccupied = -1 + let occ = -1 + let gen = start + do { + prevOccupied = occ + gen = iteration(gen) + occ = render(gen) + .split('') + .filter((s) => s === '#').length + } while (occ != prevOccupied) + return gen +} diff --git a/day11/solution.spec.ts b/day11/solution.spec.ts new file mode 100644 index 0000000..38d5e03 --- /dev/null +++ b/day11/solution.spec.ts @@ -0,0 +1,39 @@ +import { loader } from '../lib/loader' +import { render } from './seatingSimulator' +import { seatingSimulator } from './seatingSimulator' + +const load = loader(11) +const sample = ` +L.LL.LL.LL +LLLLLLL.LL +L.L.L..L.. +LLLL.LL.LL +L.LL.LL.LL +L.LLLLL.LL +..L.L..... +LLLLLLLLLL +L.LLLLLL.L +L.LLLLL.LL` + +const input = load('input') + +describe('Day 11: Seating System', () => { + describe('Part 1', () => { + it('should solve the sample', () => { + const stable = seatingSimulator(sample) + expect( + render(stable) + .split('') + .filter((s) => s === '#').length, + ).toEqual(37) + }) + it('should solve the sample', () => { + const stable = seatingSimulator(input.join('\n')) + expect( + render(stable) + .split('') + .filter((s) => s === '#').length, + ).toEqual(2164) + }) + }) +}) From 4872fd8409e2a0c983462f12d0a74d2fb24c4f1b Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 11 Dec 2020 09:58:38 +0100 Subject: [PATCH 041/110] feat(day11): part 2 --- day11/seatingSimulator.spec.ts | 36 ++++++++ day11/seatingSimulator.ts | 153 +++++++++++++++++++++++++-------- day11/solution.spec.ts | 28 +++--- 3 files changed, 170 insertions(+), 47 deletions(-) create mode 100644 day11/seatingSimulator.spec.ts diff --git a/day11/seatingSimulator.spec.ts b/day11/seatingSimulator.spec.ts new file mode 100644 index 0000000..9031a4c --- /dev/null +++ b/day11/seatingSimulator.spec.ts @@ -0,0 +1,36 @@ +import { loadString, isOccupied, Direction } from './seatingSimulator' + +describe('seatingSimulator', () => { + describe('isOccupied', () => { + const world1 = loadString(`.......#. + ...#..... + .#....... + ......... + ..#L....# + ....#.... + ......... + #........ + ...#.....`) + it.each([ + [Direction.E], + [Direction.SE], + [Direction.S], + [Direction.SW], + [Direction.W], + [Direction.NW], + [Direction.N], + [Direction.NE], + ])('should see a seat in direction %s', (direction) => + expect(isOccupied(world1, 4, 3, direction, direction)).toEqual(1), + ) + + it('should only see one seat', () => { + const world2 = loadString( + `............. + .L.L.#.#.#.#. + .............`, + ) + expect(isOccupied(world2, 1, 1, Direction.E, Direction.E)).toEqual(0) + }) + }) +}) diff --git a/day11/seatingSimulator.ts b/day11/seatingSimulator.ts index 913e86f..f7a7868 100644 --- a/day11/seatingSimulator.ts +++ b/day11/seatingSimulator.ts @@ -2,7 +2,7 @@ enum Tile { Empty = 'L', Occupied = '#', } -enum Direction { +export enum Direction { N, NE, E, @@ -14,59 +14,102 @@ enum Direction { NONE, } -const is = ( +/** + * Determines whether a seat is occupied by going in direction dir from the start + * row and col. + * Optionally it will walk down the direction until it finds a seat to evaluate. + */ +export const isOccupied = ( world: string[][], row: number, col: number, - state: Tile, dir = Direction.NONE, -): boolean => { + walk = Direction.NONE, +): number => { switch (dir) { case Direction.NONE: - if (row < 0) return false - if (row >= world.length) return false - if (col < 0) return false - if (col >= world[row].length) return false - return world[row][col] === state + if (row < 0) return 0 + if (row >= world.length) return 0 + if (col < 0) return 0 + if (col >= world[row].length) return 0 + if (world[row][col] === Tile.Occupied) return 1 + if (world[row][col] === Tile.Empty) return 0 + switch (walk) { + case Direction.NONE: + return 0 + case Direction.N: + return isOccupied(world, row - 1, col, Direction.NONE, walk) + case Direction.NE: + return isOccupied(world, row - 1, col + 1, Direction.NONE, walk) + case Direction.E: + return isOccupied(world, row, col + 1, Direction.NONE, walk) + case Direction.SE: + return isOccupied(world, row + 1, col + 1, Direction.NONE, walk) + case Direction.S: + return isOccupied(world, row + 1, col, Direction.NONE, walk) + case Direction.SW: + return isOccupied(world, row + 1, col - 1, Direction.NONE, walk) + case Direction.W: + return isOccupied(world, row, col - 1, Direction.NONE, walk) + case Direction.NW: + return isOccupied(world, row - 1, col - 1, Direction.NONE, walk) + default: + console.error(`Unknown direction ${dir}.`) + return 0 + } case Direction.N: - return is(world, row - 1, col, state) + return isOccupied(world, row - 1, col, Direction.NONE, walk) case Direction.NE: - return is(world, row - 1, col + 1, state) + return isOccupied(world, row - 1, col + 1, Direction.NONE, walk) case Direction.E: - return is(world, row, col + 1, state) + return isOccupied(world, row, col + 1, Direction.NONE, walk) case Direction.SE: - return is(world, row + 1, col + 1, state) + return isOccupied(world, row + 1, col + 1, Direction.NONE, walk) case Direction.S: - return is(world, row + 1, col, state) + return isOccupied(world, row + 1, col, Direction.NONE, walk) case Direction.SW: - return is(world, row + 1, col - 1, state) + return isOccupied(world, row + 1, col - 1, Direction.NONE, walk) case Direction.W: - return is(world, row, col - 1, state) + return isOccupied(world, row, col - 1, Direction.NONE, walk) case Direction.NW: - return is(world, row - 1, col - 1, state) + return isOccupied(world, row - 1, col - 1, Direction.NONE, walk) default: console.error(`Unknown direction ${dir}.`) - return false + return 0 } } export const render = (world: string[][]): string => world.map((s) => s.join('')).join('\n') -const iteration = (current: string[][]): string[][] => { +/** + * All decisions are based on the number of occupied seats adjacent to a given + * seat (one of the eight positions immediately up, down, left, right, or + * diagonal from the seat). The following rules are applied to every seat + * simultaneously: + * + * - If a seat is empty (L) and there are no occupied seats adjacent to it, + * the seat becomes occupied. + * - If a seat is occupied (#) and four or more seats adjacent to it are also + * occupied, the seat becomes empty. + * - Otherwise, the seat's state does not change. + * + * Floor (.) never changes; seats don't move, and nobody sits on the floor. + */ +export const part1rules = (current: string[][]): string[][] => { const next = [] for (let row = 0; row < current.length; row++) { next[row] = [] as string[] for (let col = 0; col < current[0].length; col++) { let occupied = 0 - occupied += is(current, row, col, Tile.Occupied, Direction.N) ? 1 : 0 - occupied += is(current, row, col, Tile.Occupied, Direction.NE) ? 1 : 0 - occupied += is(current, row, col, Tile.Occupied, Direction.E) ? 1 : 0 - occupied += is(current, row, col, Tile.Occupied, Direction.SE) ? 1 : 0 - occupied += is(current, row, col, Tile.Occupied, Direction.S) ? 1 : 0 - occupied += is(current, row, col, Tile.Occupied, Direction.SW) ? 1 : 0 - occupied += is(current, row, col, Tile.Occupied, Direction.W) ? 1 : 0 - occupied += is(current, row, col, Tile.Occupied, Direction.NW) ? 1 : 0 + occupied += isOccupied(current, row, col, Direction.N) + occupied += isOccupied(current, row, col, Direction.NE) + occupied += isOccupied(current, row, col, Direction.E) + occupied += isOccupied(current, row, col, Direction.SE) + occupied += isOccupied(current, row, col, Direction.S) + occupied += isOccupied(current, row, col, Direction.SW) + occupied += isOccupied(current, row, col, Direction.W) + occupied += isOccupied(current, row, col, Direction.NW) if (current[row][col] === Tile.Empty) { next[row][col] = occupied === 0 ? Tile.Occupied : current[row][col] } else if (current[row][col] === Tile.Occupied) { @@ -80,23 +123,65 @@ const iteration = (current: string[][]): string[][] => { } /** - * Run until equilibrium is reached + * Same as part one, but instead of considering just the eight immediately + * adjacent seats, consider the first seat in each of those eight directions. + * + * Also, it now takes five or more visible occupied seats for an occupied seat + * to become empty. */ -export const seatingSimulator = (world: string): string[][] => { - const start = world +export const part2rules = (current: string[][]): string[][] => { + const next = [] + for (let row = 0; row < current.length; row++) { + next[row] = [] as string[] + for (let col = 0; col < current[0].length; col++) { + let occupied = 0 + occupied += isOccupied(current, row, col, Direction.N, Direction.N) + occupied += isOccupied(current, row, col, Direction.NE, Direction.NE) + occupied += isOccupied(current, row, col, Direction.E, Direction.E) + occupied += isOccupied(current, row, col, Direction.SE, Direction.SE) + occupied += isOccupied(current, row, col, Direction.S, Direction.S) + occupied += isOccupied(current, row, col, Direction.SW, Direction.SW) + occupied += isOccupied(current, row, col, Direction.W, Direction.W) + occupied += isOccupied(current, row, col, Direction.NW, Direction.NW) + if (current[row][col] === Tile.Empty) { + next[row][col] = occupied === 0 ? Tile.Occupied : current[row][col] + } else if (current[row][col] === Tile.Occupied) { + next[row][col] = occupied >= 5 ? Tile.Empty : current[row][col] + } else { + next[row][col] = current[row][col] + } + } + } + return next +} + +export const occupied = (world: string[][]): number => + render(world) + .split('') + .filter((s) => s === '#').length + +export const loadString = (world: string): string[][] => + world .split('\n') .map((s) => s.trim().split('')) .filter((s) => s.length > 0) +/** + * Run until equilibrium is reached + */ +export const seatingSimulator = ( + world: string, + rules: (world: string[][]) => string[][], +): string[][] => { + const start = loadString(world) + let prevOccupied = -1 let occ = -1 let gen = start do { prevOccupied = occ - gen = iteration(gen) - occ = render(gen) - .split('') - .filter((s) => s === '#').length + gen = rules(gen) + occ = occupied(gen) } while (occ != prevOccupied) return gen } diff --git a/day11/solution.spec.ts b/day11/solution.spec.ts index 38d5e03..add295a 100644 --- a/day11/solution.spec.ts +++ b/day11/solution.spec.ts @@ -1,5 +1,5 @@ import { loader } from '../lib/loader' -import { render } from './seatingSimulator' +import { occupied, part1rules, part2rules } from './seatingSimulator' import { seatingSimulator } from './seatingSimulator' const load = loader(11) @@ -20,20 +20,22 @@ const input = load('input') describe('Day 11: Seating System', () => { describe('Part 1', () => { it('should solve the sample', () => { - const stable = seatingSimulator(sample) - expect( - render(stable) - .split('') - .filter((s) => s === '#').length, - ).toEqual(37) + const stable = seatingSimulator(sample, part1rules) + expect(occupied(stable)).toEqual(37) }) it('should solve the sample', () => { - const stable = seatingSimulator(input.join('\n')) - expect( - render(stable) - .split('') - .filter((s) => s === '#').length, - ).toEqual(2164) + const stable = seatingSimulator(input.join('\n'), part1rules) + expect(occupied(stable)).toEqual(2164) + }) + }) + describe('Part 2', () => { + it('should solve the sample', () => { + const stable = seatingSimulator(sample, part2rules) + expect(occupied(stable)).toEqual(26) + }) + it('should solve the sample', () => { + const stable = seatingSimulator(input.join('\n'), part2rules) + expect(occupied(stable)).toEqual(1974) }) }) }) From 1c138c506679ed667acc99738cd8cc769301be9a Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 12 Dec 2020 10:33:44 +0100 Subject: [PATCH 042/110] feat(day12): part 1 --- day12/input.txt | 768 +++++++++++++++++++++++++++++++++++++++++ day12/navigate.ts | 87 +++++ day12/solution.spec.ts | 26 ++ 3 files changed, 881 insertions(+) create mode 100644 day12/input.txt create mode 100644 day12/navigate.ts create mode 100644 day12/solution.spec.ts diff --git a/day12/input.txt b/day12/input.txt new file mode 100644 index 0000000..5931b41 --- /dev/null +++ b/day12/input.txt @@ -0,0 +1,768 @@ +S1 +F17 +S3 +F56 +W5 +F11 +N4 +F94 +W4 +S1 +L180 +E2 +F38 +S3 +F46 +L90 +N2 +S3 +W3 +L90 +E1 +L180 +F73 +L90 +E1 +N3 +R90 +S5 +E5 +L90 +W2 +F1 +E5 +R270 +W3 +S4 +W5 +F55 +E2 +L90 +W5 +L90 +E1 +L90 +F9 +W5 +F21 +E4 +F63 +E1 +F48 +N1 +F80 +E5 +L90 +N1 +E1 +S4 +R180 +F48 +F87 +N5 +W2 +F90 +S4 +E5 +F76 +F37 +R180 +E5 +F51 +S3 +R90 +F79 +F25 +L90 +W1 +F100 +S2 +E3 +L90 +N1 +W4 +F41 +S5 +L90 +W5 +L90 +W2 +S4 +W3 +F75 +L90 +F20 +E5 +N5 +R90 +F99 +N4 +N1 +L90 +N5 +N2 +E2 +S4 +F29 +L180 +N1 +W3 +L90 +W3 +L180 +F84 +F25 +E1 +S3 +R90 +F64 +L90 +E1 +F40 +N3 +R90 +N3 +F67 +F37 +L90 +F17 +E4 +F87 +N3 +W5 +S2 +R90 +E4 +N1 +W4 +F75 +E2 +F18 +R90 +F6 +S4 +F13 +E1 +L270 +F50 +W2 +R90 +W4 +S5 +R90 +F14 +L180 +N5 +L180 +F78 +E1 +S3 +R90 +E2 +R270 +E4 +S1 +L90 +L180 +F91 +W3 +W5 +F45 +N4 +F44 +L90 +N3 +L90 +S2 +L90 +F76 +W3 +R90 +F3 +W3 +F24 +L90 +F83 +W2 +F19 +S4 +L90 +N4 +E5 +L180 +N5 +W5 +F67 +S3 +R90 +E4 +F51 +L90 +E5 +L90 +F79 +E2 +N2 +W4 +E2 +L90 +F41 +E4 +N2 +L90 +N2 +L90 +N3 +F51 +F79 +N2 +W2 +N5 +W4 +F60 +N3 +R90 +W4 +S1 +F59 +W1 +F3 +N5 +L180 +N5 +F23 +N4 +E3 +R90 +F14 +W4 +F86 +L90 +N2 +S1 +W3 +R90 +N1 +F25 +L90 +F22 +E5 +F88 +L270 +F14 +N5 +F32 +N1 +F98 +S1 +W2 +E5 +L180 +E4 +S2 +F46 +L180 +W4 +F87 +E2 +F83 +R90 +S5 +F68 +E5 +F95 +N1 +F43 +E2 +F64 +S3 +F5 +S1 +W3 +L90 +E4 +L90 +F63 +S3 +F44 +N4 +R90 +F95 +S5 +W1 +N4 +W4 +F87 +W3 +N3 +L180 +W4 +R180 +N2 +E2 +N2 +L90 +W5 +R90 +W1 +F22 +L180 +N4 +W1 +S1 +R90 +N3 +R180 +S5 +W4 +R90 +E3 +S1 +E3 +N1 +L270 +F96 +E2 +N1 +F98 +W4 +L90 +W1 +W4 +R90 +W2 +S3 +F64 +S3 +F67 +N2 +R180 +S5 +F13 +N4 +F53 +W1 +N1 +L90 +F54 +S1 +E2 +F28 +R90 +W3 +L90 +E3 +N4 +F34 +R90 +F51 +L90 +F24 +R180 +W4 +N2 +F88 +F78 +S2 +E1 +N2 +L180 +F58 +E4 +R90 +N4 +L90 +N5 +R180 +N5 +R270 +W3 +F41 +S4 +F61 +R90 +F71 +S1 +F9 +R90 +F47 +W2 +N4 +L180 +W5 +F52 +L90 +N4 +F11 +W3 +L90 +W5 +N4 +F10 +S1 +F75 +S5 +L90 +S2 +F28 +L90 +F80 +E3 +R180 +E4 +F42 +E4 +F85 +N1 +W4 +R90 +E2 +F38 +R90 +F77 +F95 +L90 +S5 +F86 +R90 +N1 +E2 +R90 +N3 +F28 +R180 +N5 +F25 +E3 +F52 +N4 +E3 +N4 +E3 +F37 +L180 +N1 +E2 +L180 +E5 +F82 +N4 +F100 +N3 +E3 +L90 +W3 +S1 +R270 +E5 +W5 +R90 +F44 +F15 +R180 +S3 +L90 +E4 +F44 +R90 +N1 +E4 +N4 +F62 +R90 +S4 +L180 +S1 +F13 +E3 +F70 +L270 +F52 +L270 +F80 +L90 +F89 +N4 +F79 +W5 +F55 +R90 +F62 +E4 +F91 +R180 +E2 +F74 +R90 +F18 +L90 +E3 +N5 +E2 +R90 +W2 +R180 +N3 +F69 +W3 +R90 +F92 +E2 +F48 +N2 +L90 +S3 +F49 +E3 +L180 +F6 +R90 +S5 +F58 +F67 +E5 +S2 +L90 +W5 +F3 +S1 +F73 +W1 +E4 +R180 +N3 +E2 +F72 +L90 +S1 +F31 +W1 +F44 +L180 +F100 +W3 +N1 +W5 +L90 +S2 +N3 +R90 +W4 +S5 +F62 +E5 +F55 +L180 +W2 +L90 +E1 +F45 +S3 +W2 +F49 +N4 +L90 +E3 +N2 +R180 +E5 +N1 +N5 +E5 +R90 +W3 +F73 +E3 +F66 +L90 +S2 +E3 +F100 +S3 +W2 +S4 +W5 +R180 +E4 +S3 +S1 +W2 +R90 +F22 +R90 +F76 +L270 +S5 +F95 +L90 +N3 +F16 +R270 +S3 +N5 +F66 +R90 +F63 +W5 +F37 +N2 +L90 +W1 +F68 +R90 +F98 +E4 +S3 +R90 +E2 +S1 +F91 +E1 +F42 +E1 +F13 +S4 +F10 +R180 +E4 +R90 +N2 +W4 +L180 +N5 +R90 +N3 +F26 +R90 +F42 +L180 +E5 +S3 +L90 +S3 +E3 +F79 +R270 +E4 +F54 +N5 +W3 +F16 +W1 +S3 +R90 +F100 +S1 +W3 +N2 +E1 +S4 +F1 +R180 +F66 +W2 +R90 +W2 +F27 +E2 +F16 +R90 +S3 +F61 +E1 +F4 +L90 +N5 +F45 +L90 +N1 +L90 +F50 +W1 +R90 +N1 +F44 +S2 +F53 +S5 +F59 +E4 +S3 +E2 +N5 +E2 +L90 +E4 +L90 +N1 +L90 +N5 +F31 +R180 +N2 +F18 +E2 +F27 +L90 +F57 +R90 +F40 +R180 +E2 +F94 +S3 +E2 +S4 +E4 +R90 +L90 +E5 +N5 +E1 +N3 +F97 +S3 +F16 +E3 +W5 +F80 +S1 +W2 +S4 +F18 +N4 +E5 +R90 +N1 +F43 +N4 +E4 +N1 +E2 +W1 +F99 +W4 +F79 +F20 +E3 +F63 +W4 +F21 +E1 +F82 +E3 +R90 +F8 +N5 +W2 +L180 +W5 +F13 +S2 +L90 +N3 +R180 +N4 +F9 +L90 +F39 \ No newline at end of file diff --git a/day12/navigate.ts b/day12/navigate.ts new file mode 100644 index 0000000..355d575 --- /dev/null +++ b/day12/navigate.ts @@ -0,0 +1,87 @@ +export enum Direction { + N, + E, + S, + W, +} +type Position = { x: number; y: number } + +const instructionRx = /^(?N|S|E|W|L|R|F)(?[0-9]+)$/ + +const headingToDirection = (heading: number): Direction => { + switch (heading % 360) { + case 0: + return Direction.N + case 90: + case -270: + return Direction.E + case -90: + case 270: + return Direction.W + case 180: + case -180: + return Direction.S + default: + console.warn(`Unknown heading: ${heading % 360}`) + return Direction.N + } +} + +const move = (pos: Position) => (dir: Direction, n: number) => { + switch (dir) { + case Direction.N: + pos.y -= n + break + case Direction.S: + pos.y += n + break + case Direction.E: + pos.x += n + break + case Direction.W: + pos.x -= n + break + } +} + +export const navigate = ( + instructions: string[], + startDirection = 90, +): Position => { + const pos = { x: 0, y: 0 } + const mv = move(pos) + let heading = startDirection + + instructions.forEach((s) => { + const m = instructionRx.exec(s) + if (m === null) { + console.warn(`Invalid instruction: ${s}!`) + } + const { dir, amount } = m?.groups as any + const n = parseInt(amount, 10) + switch (dir) { + case 'N': + mv(Direction.N, n) + break + case 'S': + mv(Direction.S, n) + break + case 'E': + mv(Direction.E, n) + break + case 'W': + mv(Direction.W, n) + break + case 'L': + heading -= n + break + case 'R': + heading += n + break + case 'F': + mv(headingToDirection(heading), n) + break + } + }) + return pos +} diff --git a/day12/solution.spec.ts b/day12/solution.spec.ts new file mode 100644 index 0000000..dbab447 --- /dev/null +++ b/day12/solution.spec.ts @@ -0,0 +1,26 @@ +import { loader, loadString } from '../lib/loader' +import { navigate } from './navigate' + +const load = loader(12) +const input = load('input') + +describe('Day 12: Rain Risk', () => { + describe('Part 1', () => { + it('should solve the sample', () => { + const { x, y } = navigate( + loadString( + `F10 + N3 + F7 + R90 + F11`, + ), + ) + expect(Math.abs(x) + Math.abs(y)).toEqual(25) + }) + it('should solve', () => { + const { x, y } = navigate(input) + expect(Math.abs(x) + Math.abs(y)).toEqual(441) + }) + }) +}) From e31c0f050475b3cffddab6d24dd969807ff4a891 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 12 Dec 2020 11:21:34 +0100 Subject: [PATCH 043/110] feat(day12): part 2 --- day12/navigate.ts | 104 ++++++++++++++++++++++++++++++++++------- day12/solution.spec.ts | 40 ++++++++++------ 2 files changed, 115 insertions(+), 29 deletions(-) diff --git a/day12/navigate.ts b/day12/navigate.ts index 355d575..f0f7ee8 100644 --- a/day12/navigate.ts +++ b/day12/navigate.ts @@ -8,8 +8,13 @@ type Position = { x: number; y: number } const instructionRx = /^(?N|S|E|W|L|R|F)(?[0-9]+)$/ -const headingToDirection = (heading: number): Direction => { - switch (heading % 360) { +/** + * Translates the heading to a direction + * + * Note: Turn instructions are only given in 90 degree steps. + */ +const headingToDirection = (headingInDegrees: number): Direction => { + switch (headingInDegrees % 360) { case 0: return Direction.N case 90: @@ -22,11 +27,15 @@ const headingToDirection = (heading: number): Direction => { case -180: return Direction.S default: - console.warn(`Unknown heading: ${heading % 360}`) + console.warn(`Unknown heading: ${headingInDegrees % 360}`) return Direction.N } } +/** + * Move the given position in the given direction. + * pos is modified in place. + */ const move = (pos: Position) => (dir: Direction, n: number) => { switch (dir) { case Direction.N: @@ -44,14 +53,78 @@ const move = (pos: Position) => (dir: Direction, n: number) => { } } -export const navigate = ( +/** + * Convert degrees to radians + */ +const degreesToRadians = (deg: number): number => (deg * Math.PI) / 180 + +/** + * Rotate the given position for the given angle around 0,0 + * pos is modified in place. + */ +const rotate = (pos: Position) => (angleInDegrees: number) => { + const s = Math.sin(degreesToRadians(angleInDegrees)) + const c = Math.cos(degreesToRadians(angleInDegrees)) + + const newX = pos.x * c - pos.y * s + const newY = pos.x * s + pos.y * c + + pos.x = Math.round(newX) + pos.y = Math.round(newY) +} + +/** + * Implements the relative navigation where instructions are applied relative + * to the waypoint + */ +export const navigateRelative = ( + instructions: string[], + waypoint: Position, +): Position => { + const shipPosition = { x: 0, y: 0 } + navigate({ + instructions, + moveTo: move(waypoint), + changeDir: rotate(waypoint), + forward: (n: number) => { + shipPosition.x += waypoint.x * n + shipPosition.y += waypoint.y * n + }, + }) + return shipPosition +} + +/** + * Implements the absolute navigation where instructions are applied to the ship + */ +export const navigateAbsolute = ( instructions: string[], - startDirection = 90, + shipHeading = 90, ): Position => { - const pos = { x: 0, y: 0 } - const mv = move(pos) - let heading = startDirection + const shipPosition = { x: 0, y: 0 } + const moveShip = move(shipPosition) + navigate({ + instructions, + forward: (n: number) => moveShip(headingToDirection(shipHeading), n), + moveTo: moveShip, + changeDir: (n: number) => { + shipHeading += n + }, + }) + return shipPosition +} +const navigate = ({ + instructions, + moveTo, + changeDir, + forward, +}: { + instructions: string[] + moveTo: (dir: Direction, amount: number) => void + changeDir: (amount: number) => void + forward: (amount: number) => void +}): void => { instructions.forEach((s) => { const m = instructionRx.exec(s) if (m === null) { @@ -61,27 +134,26 @@ export const navigate = ( const n = parseInt(amount, 10) switch (dir) { case 'N': - mv(Direction.N, n) + moveTo(Direction.N, n) break case 'S': - mv(Direction.S, n) + moveTo(Direction.S, n) break case 'E': - mv(Direction.E, n) + moveTo(Direction.E, n) break case 'W': - mv(Direction.W, n) + moveTo(Direction.W, n) break case 'L': - heading -= n + changeDir(-n) break case 'R': - heading += n + changeDir(n) break case 'F': - mv(headingToDirection(heading), n) + forward(n) break } }) - return pos } diff --git a/day12/solution.spec.ts b/day12/solution.spec.ts index dbab447..4e6401c 100644 --- a/day12/solution.spec.ts +++ b/day12/solution.spec.ts @@ -1,26 +1,40 @@ import { loader, loadString } from '../lib/loader' -import { navigate } from './navigate' +import { navigateAbsolute, navigateRelative } from './navigate' const load = loader(12) +const sample = loadString( + `F10 + N3 + F7 + R90 + F11`, +) const input = load('input') +const manhatten = ( + { x: x1, y: y1 }: { x: number; y: number }, + { x: x2, y: y2 } = { x: 0, y: 0 }, +): number => Math.abs(x1 - x2) + Math.abs(y1 - y2) + describe('Day 12: Rain Risk', () => { describe('Part 1', () => { it('should solve the sample', () => { - const { x, y } = navigate( - loadString( - `F10 - N3 - F7 - R90 - F11`, - ), - ) - expect(Math.abs(x) + Math.abs(y)).toEqual(25) + const pos = navigateAbsolute(sample, 90) + expect(manhatten(pos)).toEqual(25) + }) + it('should solve', () => { + const pos = navigateAbsolute(input, 90) + expect(manhatten(pos)).toEqual(441) + }) + }) + describe('Part 2', () => { + it('should solve the sample', () => { + const pos = navigateRelative(sample, { x: 10, y: -1 }) + expect(manhatten(pos)).toEqual(286) }) it('should solve', () => { - const { x, y } = navigate(input) - expect(Math.abs(x) + Math.abs(y)).toEqual(441) + const pos = navigateRelative(input, { x: 10, y: -1 }) + expect(manhatten(pos)).toEqual(40014) }) }) }) From 45d587f2152d5179203bc99df287c6009cbd0f13 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sun, 13 Dec 2020 11:09:32 +0100 Subject: [PATCH 044/110] feat(day13): part 1 --- day13/findShuttle.ts | 30 ++++++++++++++++++++++++++++++ day13/solution.spec.ts | 20 ++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 day13/findShuttle.ts create mode 100644 day13/solution.spec.ts diff --git a/day13/findShuttle.ts b/day13/findShuttle.ts new file mode 100644 index 0000000..acdf43e --- /dev/null +++ b/day13/findShuttle.ts @@ -0,0 +1,30 @@ +export const findShuttle = ( + notes: string[], +): { bus: number; waitTime: number } => { + // Read arrival time from notes + const arrivaleTime = parseInt(notes[0], 10) + // Read bus linses from notes + const buslines = notes[1] + .split(',') + .filter((s) => s !== 'x') + .map((s) => parseInt(s, 10)) + + // Calculate the next time of each bus arriving that is after the arrival time + const schedulAfterArrival = buslines.reduce( + (schedule, line) => ({ + ...schedule, + [line]: Math.ceil(arrivaleTime / line) * line, + }), + {} as Record, + ) + + // Sort by closes arrivale time and pick the bus that arrives first + const [bus, waitTime] = Object.entries(schedulAfterArrival).sort( + ([, timeA], [, timeB]) => timeA - timeB, + )[0] + + return { + waitTime: waitTime - arrivaleTime, + bus: parseInt(bus, 10), + } +} diff --git a/day13/solution.spec.ts b/day13/solution.spec.ts new file mode 100644 index 0000000..f2d9611 --- /dev/null +++ b/day13/solution.spec.ts @@ -0,0 +1,20 @@ +import { loadString } from '../lib/loader' +import { findShuttle } from './findShuttle' + +const sample = `939 +7,13,x,x,59,x,31,19` +const input = `1003240 +19,x,x,x,x,x,x,x,x,41,x,x,x,37,x,x,x,x,x,787,x,x,x,x,x,x,x,x,x,x,x,x,13,x,x,x,x,x,x,x,x,x,23,x,x,x,x,x,29,x,571,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,17` + +describe('Day 13: Shuttle Search', () => { + describe('Part 1', () => { + it('should solve the sample', () => { + const { bus, waitTime } = findShuttle(loadString(sample)) + expect(bus * waitTime).toEqual(295) + }) + it('should solve', () => { + const { bus, waitTime } = findShuttle(loadString(input)) + expect(bus * waitTime).toEqual(3997) + }) + }) +}) From 1ac378735f5c434f4e214dde169707f7df1d8d5d Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sun, 13 Dec 2020 16:19:19 +0100 Subject: [PATCH 045/110] feat(day13): part 2 --- day13/findTime.ts | 24 ++++++++++++++++++++++++ day13/solution.spec.ts | 7 +++++++ 2 files changed, 31 insertions(+) create mode 100644 day13/findTime.ts diff --git a/day13/findTime.ts b/day13/findTime.ts new file mode 100644 index 0000000..ca8754c --- /dev/null +++ b/day13/findTime.ts @@ -0,0 +1,24 @@ +/** + * Find the time required by multiplying each bus with the time of the + * previous' bus iterations needed to arrive on the correct time + */ +export const findTime = (times: string): number => { + const slots = times.split(',').reduce((slots, k, n) => { + if (k === 'x') return slots + return [...slots, [parseInt(k, 10), n]] + }, [] as number[][]) + + let time = 0 + // start with the first bus' timeslot + let inc = slots[0][0] + // now go over all other buses + for (let bus = 1; bus < slots.length; bus++) { + // increment time until the next bus arrives at the desired time + while ((time + slots[bus][1]) % slots[bus][0] != 0) { + time += inc + } + // the next bus needs it's time multiplied by all previous busses + inc *= slots[bus][0] + } + return time +} diff --git a/day13/solution.spec.ts b/day13/solution.spec.ts index f2d9611..5c3f33b 100644 --- a/day13/solution.spec.ts +++ b/day13/solution.spec.ts @@ -1,5 +1,6 @@ import { loadString } from '../lib/loader' import { findShuttle } from './findShuttle' +import { findTime } from './findTime' const sample = `939 7,13,x,x,59,x,31,19` @@ -17,4 +18,10 @@ describe('Day 13: Shuttle Search', () => { expect(bus * waitTime).toEqual(3997) }) }) + describe('Part 2', () => { + it('should solve the sample', () => + expect(findTime(loadString(sample)[1])).toEqual(1068781)) + it('should solve', () => + expect(findTime(loadString(input)[1])).toEqual(500033211739354)) + }) }) From d923cca1a1f7267a30a3ec3f3182901179f29776 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Mon, 14 Dec 2020 14:57:36 +0100 Subject: [PATCH 046/110] feat(day14): part 1 --- day14/input.txt | 578 +++++++++++++++++++++++++++++++++++++++++ day14/run.ts | 34 +++ day14/solution.spec.ts | 25 ++ 3 files changed, 637 insertions(+) create mode 100644 day14/input.txt create mode 100644 day14/run.ts create mode 100644 day14/solution.spec.ts diff --git a/day14/input.txt b/day14/input.txt new file mode 100644 index 0000000..b9ca38f --- /dev/null +++ b/day14/input.txt @@ -0,0 +1,578 @@ +mask = 1101000X0110100X1X1X00001010XX00X0X0 +mem[48482] = 6450058 +mem[5309] = 2219920 +mem[27274] = 43286042 +mem[40233] = 504849 +mask = 1X1101XX1110X000101100XX001X000100X1 +mem[40763] = 53122377 +mem[24930] = 244 +mem[60497] = 16546 +mem[60898] = 654 +mask = 1011100X10111XX0011XX010001X1XX0X100 +mem[35453] = 378 +mem[445] = 17680 +mem[19816] = 1045213 +mem[496] = 222512 +mask = X00100X100100011001011000X0X0110000X +mem[25953] = 120906 +mem[42177] = 14177504 +mem[12302] = 31911950 +mem[33869] = 46903 +mask = 10011X1111100X1110001X0000110000XX01 +mem[43400] = 15586 +mem[5165] = 24662 +mem[3053] = 496403 +mask = 10110110X1X0011XX0110010X11011X0010X +mem[23273] = 359 +mem[8290] = 1906218 +mem[4777] = 33822 +mem[24904] = 92027 +mem[55979] = 348 +mask = X0X1100010X1XX010X0000X00001XX100000 +mem[63411] = 198864361 +mem[2323] = 12235447 +mem[53128] = 3559 +mem[37957] = 978071 +mem[12837] = 57030 +mem[18230] = 7330 +mask = 11X100X111X0001101X01101X11XX0110001 +mem[20551] = 95829554 +mem[52592] = 3255 +mem[14690] = 66824 +mem[53729] = 16600 +mem[14246] = 48015 +mem[49654] = 13036614 +mem[12199] = 78275448 +mask = 100XX00100X0X011001X1010010110X00X11 +mem[11978] = 57478 +mem[23642] = 1593 +mem[26097] = 6120 +mem[54294] = 1426 +mem[25730] = 2662370 +mem[48051] = 283445930 +mask = 0X01111X111X00X11010000010XX001X000X +mem[48807] = 1811127 +mem[54732] = 130682 +mem[14556] = 127239 +mem[8434] = 329378888 +mem[65311] = 30415 +mem[38753] = 129645 +mask = 1101X1X11110X011X0X000XXX00010000110 +mem[58126] = 5447027 +mem[61916] = 262525830 +mem[29247] = 53096 +mask = X010011001100001101111001000X0X0X000 +mem[27274] = 20355 +mem[24280] = 94406194 +mem[46969] = 32599 +mask = 10110110111XXXXX1011X11X111010101XX1 +mem[13208] = 1476 +mem[17525] = 174267 +mem[40650] = 47095 +mem[6880] = 23668444 +mem[18597] = 210524 +mem[61423] = 11469 +mem[28797] = 72808658 +mask = 1101X11X11X001111X101XX001X100X00000 +mem[10402] = 382156 +mem[11615] = 91849 +mem[55387] = 38274 +mem[41608] = 99166858 +mask = 10XXXX1X111000X1101X0X10110010101010 +mem[64410] = 16272 +mem[53605] = 39 +mem[43920] = 231262355 +mem[24494] = 101085 +mem[2266] = 7434 +mem[6405] = 490 +mem[20768] = 56259 +mask = 1101111X11100X11100001X00X00100000X1 +mem[12148] = 1542 +mem[14674] = 32572259 +mem[13208] = 1048025 +mem[10573] = 2522 +mem[25144] = 65748456 +mask = 1X0X1X01X11000XX0X10101100X111X01000 +mem[216] = 3249 +mem[61137] = 125226363 +mem[20373] = 8025 +mem[10889] = 447307190 +mask = 1X01111111100X1110X00110XX1110XX1X0X +mem[43138] = 1515 +mem[59301] = 99565475 +mem[24915] = 103737871 +mem[20768] = 514918 +mem[11898] = 685393 +mem[36252] = 2583474 +mem[5165] = 129314 +mask = 1011100011X1X00XX1X00X1XX01X01111011 +mem[34243] = 6266385 +mem[32449] = 3199 +mem[37594] = 12713 +mem[33859] = 85810 +mem[61637] = 4581168 +mem[40941] = 2511 +mask = 10011XX1XX1X0X011X0100110011110X0000 +mem[11494] = 359697 +mem[45551] = 128326843 +mem[12702] = 427072 +mask = 1X01X0X111100X110010001X001111X000X0 +mem[19264] = 1388 +mem[14556] = 2634 +mem[56860] = 913 +mem[46144] = 410717 +mem[26110] = 286330629 +mem[13224] = 70224078 +mem[51706] = 1781457 +mask = 11X10011111X0X11X0X00XX100XX01000011 +mem[1827] = 352974 +mem[53395] = 1253519 +mem[5593] = 204616 +mem[24059] = 9680329 +mem[51280] = 893 +mem[18437] = 1179 +mask = 10110X101110X001001111X01X1110011000 +mem[27171] = 219265 +mem[47619] = 677 +mem[36434] = 924 +mem[10402] = 23151360 +mask = 1001X1111110001X10000X0X001110101101 +mem[19629] = 665 +mem[52439] = 250 +mem[8361] = 28482 +mask = 101110X110X0X0100110X0110X1010011X11 +mem[20558] = 558 +mem[26949] = 7777 +mem[22160] = 171308 +mem[15631] = 328260 +mem[45856] = 230942 +mask = 110100111100001X101X010000110X0X0010 +mem[30840] = 683 +mem[41251] = 652 +mem[10584] = 103692712 +mem[5860] = 3950330 +mem[61507] = 647961 +mem[43181] = 13247 +mask = X0110110X11011X01011X10001X010111X00 +mem[19238] = 39433935 +mem[19155] = 2409 +mem[16137] = 5550 +mask = 101X1XX0111XX01110100010X00110X01100 +mem[43920] = 947024008 +mem[2335] = 2498 +mem[15363] = 65058906 +mask = 110100X1X11X0011001X01X1000001010000 +mem[31189] = 13626 +mem[41212] = 161 +mem[53454] = 12060062 +mem[47394] = 8828 +mask = 1011X0X011100011X01X0X101000X1110010 +mem[64452] = 5096 +mem[4245] = 745302 +mem[46144] = 3353 +mem[25610] = 1258 +mask = 0101001XX110001101X00X10X1X001010X01 +mem[1677] = 23846073 +mem[50713] = 1754903 +mem[34243] = 619756 +mask = X10110111X1101110010001111111X0X001X +mem[20746] = 11327 +mem[60677] = 55286634 +mem[18904] = 33122 +mem[42335] = 4994 +mask = X101100X1X10001X0X100011X011X0X01001 +mem[32832] = 20230 +mem[54205] = 1405755 +mem[27010] = 1483 +mem[25730] = 416967 +mask = 11110X11111X0X11000001X11XX0X0X00101 +mem[20547] = 993 +mem[32667] = 3520 +mask = 11010XXX011XX000101X1X0011X000001001 +mem[24634] = 245639 +mem[59394] = 184364 +mem[60948] = 20401794 +mem[9342] = 60279080 +mem[17142] = 10401929 +mem[40232] = 3268 +mask = XX011111111000X110XX00101X1X10100000 +mem[6405] = 2064 +mem[31624] = 208587070 +mem[2258] = 3965844 +mem[14742] = 6124264 +mem[2985] = 1824 +mem[4950] = 3019502 +mem[8036] = 157 +mask = 1X01001X11X00011X01001X01011XX01101X +mem[41340] = 163017 +mem[46907] = 1047 +mem[2512] = 1340 +mem[33913] = 20303 +mem[58546] = 153629023 +mem[19536] = 109607 +mask = X01X0X10X1100001X01110101X0X1X00101X +mem[25394] = 131964 +mem[18030] = 99092 +mem[19264] = 12572 +mask = X011X0X110101010011000X00010XX111000 +mem[12088] = 165 +mem[46867] = 6359415 +mem[52891] = 29571 +mem[37957] = 1880 +mem[38886] = 32297 +mem[47674] = 40454 +mask = 1010XX1011100011X01000X1X0111X011010 +mem[62632] = 184293833 +mem[43181] = 6802 +mem[29534] = 17997 +mem[55058] = 527832513 +mem[17560] = 876465884 +mem[33007] = 195444229 +mask = 111100X11X100X11X0100100X0X0X1000000 +mem[22371] = 620962 +mem[27171] = 13951 +mem[23941] = 285120 +mem[53371] = 2727 +mask = 101110011X111011X1000000X101X1X01X00 +mem[57437] = 4447669 +mem[62084] = 14810 +mem[20380] = 2 +mask = X01X100X10X11001X00001X00001X0001111 +mem[10604] = 29217 +mem[40103] = 20019 +mem[5593] = 1282 +mask = XX0100111X100011011X100XX11101X10111 +mem[29655] = 188308404 +mem[16108] = 987052 +mem[27684] = 1845758 +mem[8627] = 30072056 +mem[24904] = 28977792 +mem[24100] = 11388269 +mask = 11X1100XX01X001101100111110000100011 +mem[9003] = 63644817 +mem[23905] = 249772171 +mem[41608] = 566869 +mask = X001X0011110X011X0101X10001010000X1X +mem[19837] = 1474559 +mem[6082] = 213612431 +mem[25394] = 746122 +mask = 101110X1111X101X01100000100101111X10 +mem[41906] = 2538917 +mem[43592] = 738 +mem[38721] = 69444 +mem[24036] = 6469 +mask = 0011100010X111X100001001XX000X000101 +mem[32354] = 709541 +mem[18383] = 3835385 +mem[1313] = 1178709 +mem[30236] = 6347401 +mask = 11011X001X10X0X1X0000100001010000000 +mem[64686] = 4029603 +mem[37187] = 269 +mem[41728] = 15291311 +mem[703] = 176262655 +mem[23732] = 473740 +mem[4238] = 2073061 +mask = 1101011111101X1X0010110X0XX110001X10 +mem[24443] = 487215 +mem[44567] = 898248 +mem[41636] = 11946 +mem[21254] = 1162908 +mask = X01110X11X1X101X01100X0000X01011X101 +mem[41555] = 13384162 +mem[51011] = 12307 +mem[54861] = 435 +mem[61876] = 10233 +mem[3849] = 14042 +mem[25473] = 273 +mem[10402] = 17072 +mask = 100100101110XX110X100110X010000XXXX1 +mem[13744] = 663718668 +mem[18696] = 361798 +mem[21207] = 851454 +mem[21194] = 21025 +mask = 1XX101XXX11X000X10111110111000X1X001 +mem[48482] = 107005 +mem[26156] = 15617 +mem[49747] = 65227757 +mem[52440] = 112190 +mem[36683] = 26159 +mem[19486] = 3181 +mask = X011X0X01XX1000101XX0010X11001110010 +mem[4510] = 7353062 +mem[10923] = 25067923 +mem[16714] = 173017 +mem[41162] = 12385087 +mem[25346] = 1388660 +mask = X10110011110001100101111001X000X1X01 +mem[27395] = 52406 +mem[63935] = 70016372 +mem[61748] = 1598 +mask = 1101101XX111011X001X00001111100X0111 +mem[2512] = 629921058 +mem[48026] = 247446319 +mem[48328] = 2018 +mem[9614] = 49871 +mem[25296] = 53536568 +mask = 10X110X0101X10011X00X010001XX0101011 +mem[62912] = 108898 +mem[22160] = 5738253 +mem[37655] = 5684656 +mem[292] = 103716917 +mem[40727] = 6480899 +mem[43121] = 2495962 +mem[8256] = 9752 +mask = 111X011111100000XX110110110X1X0X10X0 +mem[42306] = 3814 +mem[22173] = 104438687 +mem[60145] = 51698 +mem[44805] = 14155 +mem[23905] = 15867565 +mask = 1X01111X1X1001X110X000XX0000X0000010 +mem[7284] = 513301 +mem[14240] = 9298 +mem[9803] = 254768 +mem[36226] = 722 +mask = 10110111X1101000X011101001X10010101X +mem[19105] = 1399632 +mem[40477] = 14030402 +mem[9180] = 258090132 +mem[2864] = 1722022 +mem[6880] = 31 +mask = 1011100X1X11X001X100X0100X100X1X0X10 +mem[3335] = 303249475 +mem[33869] = 89890 +mem[40724] = 3168 +mem[44588] = 3236692 +mem[43374] = 875137580 +mem[39986] = 327100054 +mem[16676] = 47668 +mask = 1011X00110111100011XX00X00X11111X001 +mem[46881] = 2251035 +mem[31188] = 860796 +mem[15313] = 88528 +mem[33666] = 645 +mem[9205] = 45363830 +mem[57565] = 604 +mem[13224] = 1342 +mask = 10X10X101X10011X101100X101X01X001000 +mem[25292] = 3155 +mem[18230] = 27276287 +mem[16051] = 270672 +mask = 1XX10001101X0011011011000101X11X0011 +mem[46144] = 8381238 +mem[22497] = 2356142 +mem[8433] = 70526 +mem[44424] = 8986 +mem[18442] = 508814 +mask = 101110011X1110X10XX000000X01X1X111XX +mem[20373] = 1622495 +mem[44697] = 127381 +mem[20688] = 4500 +mem[16805] = 923777 +mem[32947] = 8080048 +mask = 0001X101XX10011110000X00000110X00000 +mem[31189] = 51277 +mem[1279] = 7010 +mem[40666] = 1361051 +mem[20337] = 6622 +mem[44409] = 245840 +mem[2587] = 231888105 +mask = 100X00111011XXXXX0X0100111X000010110 +mem[38644] = 122518 +mem[14690] = 853513 +mem[27280] = 499865495 +mask = 1XX1001011110110X011111011101XX0X100 +mem[5253] = 104635924 +mem[9220] = 469551991 +mem[54123] = 603 +mask = 1X01111111100X11101001X110X110100101 +mem[28857] = 4958 +mem[26793] = 43481 +mem[26110] = 2002 +mem[13670] = 737550271 +mem[48748] = 2175 +mem[15379] = 956329 +mask = X001111X101X01111010000100100000100X +mem[5038] = 1896 +mem[1219] = 1590 +mem[2335] = 6839 +mem[44175] = 3246581 +mem[10128] = 861384 +mask = 10X100X1001X0X11011010100100X11000X1 +mem[25953] = 500230911 +mem[56860] = 3606219 +mem[3909] = 4193582 +mem[20077] = 13280564 +mem[42329] = 2622 +mem[19629] = 2920217 +mask = 1000X0111XX1XX11001000011X10110X0110 +mem[65286] = 10087505 +mem[39772] = 5587787 +mem[49314] = 25559 +mem[27912] = 135405924 +mem[46907] = 7910 +mem[36657] = 1549461 +mem[37088] = 74 +mask = 1101001XXX100X1100X0000010110010110X +mem[26128] = 3098182 +mem[19238] = 6294862 +mem[35146] = 4761321 +mem[13782] = 407506 +mem[57435] = 1986 +mem[56396] = 1173362 +mask = 10X110011X11100X01101010X0X0X0010101 +mem[26478] = 5717 +mem[7980] = 895287 +mem[26719] = 254026 +mem[58541] = 444 +mem[43236] = 1222225 +mask = 10101010111100XX101000010X01X0101101 +mem[19246] = 1542 +mem[30987] = 1317750 +mem[15786] = 214473235 +mem[33835] = 989447 +mem[49063] = 63501903 +mem[50294] = 351534 +mem[4146] = 12924485 +mask = 1101100X11X00X1100X00X1X00011000X00X +mem[49673] = 11520693 +mem[8936] = 422236363 +mem[22275] = 116474 +mask = 101110011X11X011000X0XX00X000X011X01 +mem[44344] = 518186197 +mem[20820] = 2429569 +mem[25541] = 30403114 +mask = 1X0X1011111X0111X0100111001111X00X10 +mem[47674] = 15040841 +mem[54205] = 9684 +mem[52058] = 38432 +mem[20458] = 522505115 +mem[16470] = 96407696 +mask = 101110001011X0010100X01011X0001000X0 +mem[2903] = 9215 +mem[24100] = 10412 +mem[65308] = 3449 +mask = 11110100011X00001011011X111101XX0001 +mem[1383] = 20524 +mem[43138] = 1853 +mem[53] = 13474143 +mem[53737] = 139742 +mem[36626] = 111978547 +mem[6473] = 296847 +mask = X00100X11010X01X011001XX101011001X00 +mem[14690] = 2176 +mem[49976] = 138885734 +mem[63369] = 58 +mem[24904] = 127774567 +mem[45788] = 935 +mem[15363] = 3333 +mask = 100100111X100011001X1011010111000XX0 +mem[44478] = 18487 +mem[25541] = 10395 +mem[2258] = 208737 +mem[33632] = 355267 +mask = 1X01001X1XX00111011000101XX10X01X100 +mem[46117] = 129267954 +mem[18953] = 496 +mem[3156] = 23246 +mem[22307] = 471295 +mem[56163] = 6733185 +mem[1324] = 2074915 +mask = 1X0100X1XX1000110X1001100001X10XX0X0 +mem[33913] = 191232 +mem[11074] = 586 +mem[6405] = 52666 +mask = X10X10X01110001X0110X011100100XX1001 +mem[2512] = 177970 +mem[58654] = 2392973 +mem[4166] = 3276 +mem[39753] = 1233 +mem[61980] = 474314617 +mem[37355] = 58269 +mask = X011100X1111X01100101000000X00110X1X +mem[33118] = 5010 +mem[4760] = 111160 +mem[37689] = 823166 +mem[15678] = 1634 +mask = XX0101X111100111100000X0X0X0110X1XX1 +mem[17229] = 4665 +mem[22930] = 1040260 +mem[1324] = 260 +mem[31615] = 5434357 +mem[545] = 215622 +mask = 10110111X11X000110X10100110X0XX01110 +mem[44567] = 220705 +mem[53112] = 1089 +mask = X0010X101X1X11110X1X0110X0X1X0000000 +mem[7] = 1698581 +mem[53112] = 112679 +mem[63935] = 6201 +mask = 1010011011X1111X1011001000X010001X1X +mem[27421] = 22548 +mem[20688] = 29314044 +mem[35943] = 66340108 +mem[17023] = 115252 +mem[47844] = 1957 +mem[20801] = 243380907 +mem[58453] = 1786 +mask = 10X11110X0XX0101X01010101101000X001X +mem[56724] = 25322561 +mem[23838] = 128622093 +mem[14602] = 1871 +mem[9600] = 482868337 +mem[13919] = 427123809 +mask = 110100010110X011X11X11X001XX1X100010 +mem[26083] = 962249 +mem[48067] = 107 +mem[6405] = 979668 +mask = 10110X10111X0110101X010X110010X0000X +mem[27181] = 581 +mem[1935] = 1700145 +mem[31816] = 7821892 +mem[62084] = 16529134 +mem[63391] = 3109 +mem[64545] = 30527 +mask = X101X11X11100111100XX0000X0X101X1001 +mem[8381] = 33407838 +mem[40566] = 15796331 +mem[18597] = 68546 +mem[25473] = 7358888 +mem[41562] = 4109 +mem[8797] = 4761 +mask = 1101001111100011X110X0010001X1X10001 +mem[48089] = 50505 +mem[8627] = 111289788 +mem[49063] = 7497 +mask = 10X1X011XX10X01X0110110X0X0101100011 +mem[6133] = 237 +mem[65302] = 776 +mem[24930] = 240012 +mem[49747] = 1455 +mem[25610] = 77345999 +mem[65463] = 830 +mem[18804] = 409066 +mask = 10X11001111X1001000X01XX11111101XX11 +mem[52439] = 54286 +mem[27158] = 334127093 +mem[50444] = 1667 +mem[1037] = 9375588 +mem[15887] = 95826 +mem[18383] = 4398280 +mask = XX01101111X101110X1X1X010101100001X0 +mem[38753] = 1944309 +mem[56903] = 103577 +mem[52840] = 85 +mem[47810] = 954770 +mem[31815] = 1660528 +mask = 101X011X1X11111110110000001010000X11 +mem[59096] = 180976584 +mem[64686] = 16261 +mem[31497] = 671389398 +mem[23216] = 4065503 +mem[55058] = 1248965 +mem[56396] = 3400500 +mask = 1X011011111001X1X01X000X10X1001X1010 +mem[20173] = 4586 +mem[61916] = 424482839 +mem[63391] = 6915265 \ No newline at end of file diff --git a/day14/run.ts b/day14/run.ts new file mode 100644 index 0000000..397c451 --- /dev/null +++ b/day14/run.ts @@ -0,0 +1,34 @@ +/** + * Returns the value with the given mask applied + */ +const mask = (value: number, mask: string): number => { + // Convert to 36 bit long binary string + const valueAsBinary = [...value.toString(2).padStart(36, '0')] + for (let i = 0; i < 36; i++) { + const maskVal = mask[mask.length - i - 1] + if (maskVal !== 'X') { + // Overwrite value bit with mask bit + valueAsBinary[valueAsBinary.length - i - 1] = maskVal + } + } + return parseInt(valueAsBinary.join(''), 2) +} + +export const run = (program: string[]): Record => + program.reduce( + (context, instruction) => { + const [cmd, value] = instruction.split(' = ') + if (cmd === 'mask') { + context.mask = value + } else { + const addr = parseInt(/mem\[([0-9]+)\]/.exec(cmd)?.[1] as string, 10) + const v = parseInt(value, 10) + context.memory[addr] = mask(v, context.mask) + } + return context + }, + { + memory: {} as Record, + mask: 'X'.repeat(36), + }, + ).memory diff --git a/day14/solution.spec.ts b/day14/solution.spec.ts new file mode 100644 index 0000000..c569f89 --- /dev/null +++ b/day14/solution.spec.ts @@ -0,0 +1,25 @@ +import { loader, loadString } from '../lib/loader' +import { run } from './run' + +const sample = `mask = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X +mem[8] = 11 +mem[7] = 101 +mem[8] = 0` + +const load = loader(14) +const input = load('input') + +describe('Day 14: Docking Data', () => { + describe('Part 1', () => { + it('should solve the sample', () => { + const mem = run(loadString(sample)) + expect(mem[8] + mem[7]).toEqual(165) + }) + it('should solve the sample', () => { + const mem = run(input) + expect(Object.values(mem).reduce((sum, v) => v + sum, 0)).toEqual( + 15403588588538, + ) + }) + }) +}) From b590b76988178ce353ac4c865235ed5f36419077 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Tue, 15 Dec 2020 09:31:29 +0100 Subject: [PATCH 047/110] feat(day15): part 1 --- day15/memoryGame.ts | 29 +++++++++++++++++++++++++++++ day15/solution.spec.ts | 24 ++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 day15/memoryGame.ts create mode 100644 day15/solution.spec.ts diff --git a/day15/memoryGame.ts b/day15/memoryGame.ts new file mode 100644 index 0000000..fd42f40 --- /dev/null +++ b/day15/memoryGame.ts @@ -0,0 +1,29 @@ +export const memoryGame = (numbers: number[], iterations: number): number => { + const spokenTurn = {} as Record + let speak + let lastSpoken + for (let turn = 0; turn < iterations; turn++) { + // Carry over what was said in the last turn + lastSpoken = speak + // They begin by taking turns reading from a list of starting numbers + if (turn < numbers.length) { + speak = numbers[turn] + } else { + // Now, consider the last number spoken + + const lastSpokenTurn = spokenTurn[lastSpoken as number] as + | number + | undefined + if (lastSpokenTurn === undefined) { + // If it is the first time the number is spoken return 0 + speak = 0 + } else { + // Otherwise, announce how many turns apart the number is from when it was previously spoken. + speak = turn - lastSpokenTurn + } + } + // Record what was said in the last turn + spokenTurn[lastSpoken ?? -1] = turn + } + return speak ?? -1 +} diff --git a/day15/solution.spec.ts b/day15/solution.spec.ts new file mode 100644 index 0000000..7339127 --- /dev/null +++ b/day15/solution.spec.ts @@ -0,0 +1,24 @@ +import { memoryGame } from './memoryGame' + +describe('Day 15: Rambunctious Recitation', () => { + describe('Part 1', () => { + const numbers = [0, 3, 6] + it.each([ + [1, 0], + [2, 3], + [3, 6], + [4, 0], + [5, 3], + [6, 3], + [7, 1], + [8, 0], + [9, 4], + [10, 0], + [2020, 436], + ])('the spoken number in turn %d should be %d', (turn, expected) => + expect(memoryGame(numbers, turn)).toEqual(expected), + ) + it('should solve', () => + expect(memoryGame([0, 5, 4, 1, 10, 14, 7], 2020)).toEqual(203)) + }) +}) From cb1190d0cd89507b9f2bc681aedbafc18242973b Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Tue, 15 Dec 2020 09:48:30 +0100 Subject: [PATCH 048/110] feat(day15): part 2 --- day15/memoryGame.ts | 1 - day15/solution.spec.ts | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/day15/memoryGame.ts b/day15/memoryGame.ts index fd42f40..0f8b3dd 100644 --- a/day15/memoryGame.ts +++ b/day15/memoryGame.ts @@ -10,7 +10,6 @@ export const memoryGame = (numbers: number[], iterations: number): number => { speak = numbers[turn] } else { // Now, consider the last number spoken - const lastSpokenTurn = spokenTurn[lastSpoken as number] as | number | undefined diff --git a/day15/solution.spec.ts b/day15/solution.spec.ts index 7339127..a3a7e14 100644 --- a/day15/solution.spec.ts +++ b/day15/solution.spec.ts @@ -21,4 +21,9 @@ describe('Day 15: Rambunctious Recitation', () => { it('should solve', () => expect(memoryGame([0, 5, 4, 1, 10, 14, 7], 2020)).toEqual(203)) }) + describe('Part 2', () => { + // This takes 5 minutes + it.skip('should solve', () => + expect(memoryGame([0, 5, 4, 1, 10, 14, 7], 2020)).toEqual(9007186)) + }) }) From 745850319810b91bc76ed1bdfae6be0897054c3f Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 16 Dec 2020 17:22:19 +0100 Subject: [PATCH 049/110] feat(day16): part 1 and started part 2 --- day16/isValidTicket.ts | 44 ++++++++ day16/rules.txt | 20 ++++ day16/solution.spec.ts | 98 +++++++++++++++++ day16/solveFields.ts | 66 ++++++++++++ day16/test.ts | 14 +++ day16/tickets.txt | 236 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 478 insertions(+) create mode 100644 day16/isValidTicket.ts create mode 100644 day16/rules.txt create mode 100644 day16/solution.spec.ts create mode 100644 day16/solveFields.ts create mode 100644 day16/test.ts create mode 100644 day16/tickets.txt diff --git a/day16/isValidTicket.ts b/day16/isValidTicket.ts new file mode 100644 index 0000000..0ca911a --- /dev/null +++ b/day16/isValidTicket.ts @@ -0,0 +1,44 @@ +export type Rules = Record + +export const parseRules = (rules: string[]): Rules => + rules.reduce((rules, rule) => { + const m = /^(?[^:]+): (?[0-9]+)-(?[0-9]+) or (?[0-9]+)-(?[0-9]+)$/.exec( + rule, + ) + if (m === null) { + console.error(`Could not parse rule ${rule}!`) + return rules + } + return { + ...rules, + [m.groups?.class as string]: [ + [ + parseInt(m.groups?.from1 as string, 10), + parseInt(m.groups?.to1 as string, 10), + ] as [number, number], + [ + parseInt(m.groups?.from2 as string, 10), + parseInt(m.groups?.to2 as string, 10), + ] as [number, number], + ], + } + }, {} as Rules) + +/** + * Returns the invalid numbers in a ticket + */ +export const findInvalidNumbers = (rules: Rules) => ( + ticket: number[], +): number[] => + ticket.filter((n) => { + const range = Object.values(rules).find( + (ruleRanges) => + ruleRanges.find(([from, to]) => { + if (n < from) return false + if (n > to) return false + return true + }) !== undefined, + ) + const isInRange = range !== undefined + return !isInRange + }) diff --git a/day16/rules.txt b/day16/rules.txt new file mode 100644 index 0000000..a503013 --- /dev/null +++ b/day16/rules.txt @@ -0,0 +1,20 @@ +departure location: 26-715 or 727-972 +departure station: 45-164 or 175-960 +departure platform: 43-247 or 270-972 +departure track: 25-306 or 330-949 +departure date: 26-635 or 660-961 +departure time: 42-773 or 793-961 +arrival location: 28-928 or 943-952 +arrival station: 36-593 or 613-966 +arrival platform: 33-280 or 297-951 +arrival track: 44-358 or 371-974 +class: 39-815 or 839-955 +duration: 39-573 or 589-959 +price: 49-846 or 865-962 +route: 30-913 or 924-954 +row: 29-865 or 890-965 +seat: 44-667 or 683-969 +train: 32-473 or 482-969 +type: 40-424 or 432-953 +wagon: 49-156 or 164-960 +zone: 34-521 or 534-971 \ No newline at end of file diff --git a/day16/solution.spec.ts b/day16/solution.spec.ts new file mode 100644 index 0000000..207282b --- /dev/null +++ b/day16/solution.spec.ts @@ -0,0 +1,98 @@ +import { loader, loadString } from '../lib/loader' +import { findInvalidNumbers, parseRules } from './isValidTicket' +import { solveFields } from './solveFields' + +const sampleRules = loadString(`class: 1-3 or 5-7 +row: 6-11 or 33-44 +seat: 13-40 or 45-50`) + +const load = loader(16) +const rules = load('rules') +const tickets = load('tickets') + +describe('Day 16: Ticket Translation', () => { + describe('parseRules', () => { + it('should parse the rules', () => + expect(parseRules(sampleRules)).toEqual({ + class: [ + [1, 3], + [5, 7], + ], + row: [ + [6, 11], + [33, 44], + ], + seat: [ + [13, 40], + [45, 50], + ], + })) + }) + describe('findInvalidNumbers', () => { + it.each([ + [[7, 1, 14], []], + [[7, 3, 47], []], + [[40, 4, 50], [4]], + [[55, 2, 20], [55]], + [[38, 6, 12], [12]], + ])('the ticket %s invalid numbers are %s', (ticket, invalidNumbers) => + expect(findInvalidNumbers(parseRules(sampleRules))(ticket)).toEqual( + invalidNumbers, + ), + ) + }) + describe('Part 1', () => { + const ticketScanningErrorRate = ( + rules: string[], + tickets: string[], + ): number => + tickets + .map((s) => s.split(',').map((s) => parseInt(s, 10))) + .map(findInvalidNumbers(parseRules(rules))) + .flat() + .reduce((sum, n) => n + sum, 0) + + it('should solve the sample', () => + expect( + ticketScanningErrorRate( + sampleRules, + loadString(`7,3,47 + 40,4,50 + 55,2,20 + 38,6,12`), + ), + ).toEqual(71)) + it('should solve', () => + expect(ticketScanningErrorRate(rules, tickets)).toEqual(21081)) + }) + describe('Part 2', () => { + it('should solve the sample', () => { + const step2sampleTickets = loadString(` + 3,9,18 + 15,1,5 + 5,14,9`).map((s) => s.split(',').map((s) => parseInt(s, 10))) + const sample2Rules = parseRules( + loadString(`class: 0-1 or 4-19 + row: 0-5 or 8-19 + seat: 0-13 or 16-19`), + ) + const validTickets = step2sampleTickets.filter( + (t) => findInvalidNumbers(sample2Rules)(t).length === 0, + ) + expect(validTickets).toHaveLength(3) + + expect(solveFields(sample2Rules)(step2sampleTickets)).toEqual([ + 'row', + 'class', + 'seat', + ]) + }) + it.skip('should solve', () => { + expect( + solveFields(parseRules(rules))( + tickets.map((s) => s.split(',').map((s) => parseInt(s, 10))), + ), + ).toEqual(['row', 'class', 'seat']) + }) + }) +}) diff --git a/day16/solveFields.ts b/day16/solveFields.ts new file mode 100644 index 0000000..5b0df8e --- /dev/null +++ b/day16/solveFields.ts @@ -0,0 +1,66 @@ +import { Rules } from './isValidTicket' + +const combine = (categories: T[]) => { + const combinations: T[][] = [] + const g = (categories: T[], parents: T[] = []) => { + if (categories.length === 0) { + combinations.push(parents) + return + } + categories.forEach((cat) => { + g( + categories.filter((c) => [...parents, cat].includes(c) === false), + [...parents, cat], + ) + }) + } + g(categories) + return combinations +} + +export const solveFields = (rules: Rules, filter?: string) => ( + validTickets: number[][], +): string[] => { + const allCategories = Object.keys(rules) + const filteredCategories = allCategories.filter((s) => + filter === undefined ? true : s.startsWith(filter), + ) + const combinations = combine(filteredCategories) + const missing = allCategories.length - filteredCategories.length + + for (let i = 0; i <= missing; i++) { + for (const c of combinations) { + let validCombination = [] as string[] + ;(() => { + const ranges = [ + ...'-' + .repeat(i) + .split('') + .map(() => [ + [0, Number.MAX_SAFE_INTEGER], + [0, Number.MAX_SAFE_INTEGER], + ]), + ...c.map((c) => rules[c]), + ...'-' + .repeat(missing - i) + .split('') + .map(() => [ + [0, Number.MAX_SAFE_INTEGER], + [0, Number.MAX_SAFE_INTEGER], + ]), + ] + for (const t of validTickets) { + for (let l = 0; l < t.length; l++) { + const n = t[l] + const [[from1, to1], [from2, to2]] = ranges[l] + const valid = (n >= from1 && n <= to1) || (n >= from2 && n <= to2) + if (!valid) return + } + } + validCombination = c + })() + if (validCombination.length > 0) return validCombination + } + } + return [] +} diff --git a/day16/test.ts b/day16/test.ts new file mode 100644 index 0000000..42b6e25 --- /dev/null +++ b/day16/test.ts @@ -0,0 +1,14 @@ +import { loader } from '../lib/loader' +import { parseRules } from './isValidTicket' +import { solveFields } from './solveFields' + +const load = loader(16) +const rules = load('rules') +const tickets = load('tickets') + +console.log( + solveFields( + parseRules(rules), + 'departure', + )(tickets.map((s) => s.split(',').map((s) => parseInt(s, 10)))), +) diff --git a/day16/tickets.txt b/day16/tickets.txt new file mode 100644 index 0000000..bee67ee --- /dev/null +++ b/day16/tickets.txt @@ -0,0 +1,236 @@ +279,705,188,357,892,488,741,247,572,176,760,306,410,861,507,906,179,501,808,245 +51,436,407,893,228,722,213,239,813,460,415,571,95,98,116,138,811,552,164,813 +407,242,909,340,99,906,566,749,880,708,273,843,737,244,244,461,903,198,806,64 +83,740,373,298,441,199,633,271,397,437,693,624,461,372,296,684,122,795,754,124 +294,541,629,865,767,632,434,189,86,799,891,667,466,707,419,197,225,627,243,750 +158,405,551,439,803,149,737,773,220,910,341,798,536,209,753,199,273,141,617,122 +457,176,371,757,456,192,304,803,256,627,695,762,232,400,755,520,706,926,200,382 +566,92,846,448,743,796,54,210,442,623,423,247,52,262,386,747,337,514,145,635 +729,403,105,108,514,434,752,244,175,291,147,78,520,708,843,494,409,392,744,572 +799,76,122,195,129,298,242,547,563,909,750,438,178,632,514,273,858,397,708,151 +482,119,106,800,341,112,804,846,436,566,890,925,515,886,763,236,793,420,908,133 +665,335,739,444,989,246,461,57,684,443,842,146,80,372,152,133,306,628,206,753 +519,350,70,729,633,949,500,664,726,572,844,211,694,399,912,416,199,97,219,691 +379,747,806,134,757,763,334,404,893,909,103,795,522,546,559,394,132,77,457,401 +78,142,536,664,128,804,795,906,204,947,339,388,778,96,766,709,118,227,85,305 +182,465,484,349,383,94,508,345,61,238,299,540,555,735,353,438,378,500,403,289 +132,735,427,356,147,233,905,456,373,712,128,71,559,191,270,350,299,709,453,110 +446,445,408,494,423,3,357,625,702,390,511,896,79,712,493,452,510,205,193,554 +416,667,449,483,803,348,566,569,753,378,762,497,690,208,81,740,522,187,357,276 +890,927,405,213,694,733,76,516,429,489,398,537,540,621,486,727,141,204,145,505 +757,354,134,684,83,73,482,846,800,547,206,808,106,763,685,877,771,221,194,591 +445,857,432,384,630,418,185,108,569,621,619,451,809,763,744,590,698,520,457,247 +769,800,271,50,685,895,125,692,217,419,379,473,18,66,80,381,74,65,57,385 +454,348,573,88,351,551,358,896,380,468,630,400,104,405,591,201,556,542,939,346 +126,236,111,226,241,159,378,686,68,208,810,534,742,356,182,243,302,943,409,540 +120,755,700,704,483,378,666,397,520,209,137,276,361,353,687,709,438,108,129,688 +350,274,153,297,177,909,69,547,762,715,395,729,412,185,53,205,943,807,347,874 +344,472,705,183,192,431,200,53,110,666,332,209,896,376,454,713,768,98,215,148 +417,903,567,89,330,739,447,894,488,57,409,542,274,532,148,737,746,661,753,747 +331,194,101,513,145,81,0,198,226,843,807,88,62,223,904,86,901,737,509,753 +480,270,382,439,707,343,91,458,383,119,808,82,60,684,147,454,110,545,807,405 +760,617,358,697,690,796,55,449,205,510,340,61,66,215,565,650,567,241,229,242 +419,626,848,662,230,392,687,278,625,298,230,756,765,210,840,71,401,633,351,148 +211,544,797,975,432,89,105,713,555,376,115,53,690,703,948,274,809,591,844,541 +628,204,110,450,408,544,812,505,417,769,494,148,147,537,727,902,924,771,202,429 +177,428,57,407,564,243,143,382,500,134,177,304,215,405,624,865,843,486,551,796 +690,454,56,467,144,209,490,458,353,807,731,762,180,990,423,727,444,247,152,391 +675,83,107,514,537,411,444,223,121,154,452,811,180,196,567,591,110,896,696,534 +61,387,141,813,932,793,277,410,902,630,230,272,80,337,493,205,461,797,507,495 +204,124,997,550,378,388,551,189,138,391,560,139,222,149,467,627,702,220,68,436 +273,179,231,383,683,943,499,665,214,508,209,218,127,614,814,63,353,464,290,905 +120,100,143,278,592,486,493,18,149,707,196,302,538,844,145,796,482,764,772,238 +179,561,395,841,699,626,509,126,399,796,771,445,208,700,331,156,285,152,418,755 +116,949,434,491,172,618,416,842,793,947,182,908,629,216,194,846,796,634,496,390 +395,381,94,116,466,402,4,418,511,793,697,927,448,904,454,619,94,110,95,493 +379,521,684,715,944,692,892,276,901,924,373,525,593,238,435,108,512,801,111,944 +733,246,898,356,150,498,195,57,750,210,119,663,823,378,418,66,744,573,538,924 +625,389,928,891,291,305,84,109,794,399,926,181,95,459,464,278,401,347,459,713 +688,275,683,517,559,297,948,439,907,347,710,181,76,739,739,454,548,736,432,989 +237,118,394,111,208,378,138,171,696,412,399,109,210,331,125,205,632,634,696,490 +614,222,593,103,810,55,762,503,945,541,182,693,75,124,400,414,710,213,177,781 +927,689,185,155,852,703,927,189,386,51,155,53,280,928,634,76,543,456,815,806 +990,410,149,206,666,384,394,903,345,97,77,214,473,244,152,618,534,242,560,208 +70,220,193,447,202,77,420,733,627,686,513,948,121,746,900,488,453,284,589,192 +897,707,928,247,434,623,516,854,703,416,589,905,739,485,468,341,799,491,683,451 +377,507,192,518,208,352,217,554,390,910,194,878,699,109,927,182,735,705,146,415 +548,101,144,738,801,455,372,571,899,301,350,271,155,337,714,791,436,619,133,304 +460,400,122,744,132,754,624,570,572,500,566,436,17,513,699,749,483,709,403,738 +181,57,627,947,429,758,593,512,504,101,799,842,155,843,901,633,555,563,211,144 +322,928,464,714,793,621,731,71,551,509,910,354,708,388,809,666,208,623,543,467 +61,331,911,372,765,445,494,621,631,472,519,352,345,409,338,152,154,763,55,658 +405,438,749,236,551,593,895,539,846,246,749,513,259,376,106,82,467,194,440,564 +549,924,407,756,689,692,105,349,943,50,80,622,282,438,63,235,748,846,912,946 +557,550,557,415,483,544,621,802,520,566,397,274,425,846,57,493,800,537,556,742 +120,572,517,114,423,499,634,110,357,435,684,349,861,707,483,434,389,702,661,61 +98,976,516,114,927,899,566,104,903,796,758,633,538,411,148,499,553,383,506,227 +80,510,571,571,837,518,111,139,550,843,387,76,305,544,543,456,683,707,124,711 +450,710,277,420,123,843,59,123,151,414,712,197,929,202,663,896,400,749,75,486 +545,504,550,621,143,815,543,517,837,502,765,590,513,398,338,558,107,573,468,50 +574,865,925,711,122,812,442,732,738,743,758,460,948,572,140,102,896,372,499,543 +222,450,273,686,384,806,619,153,58,378,356,628,355,191,176,683,193,132,881,518 +725,386,299,568,689,402,68,65,223,412,802,804,123,151,115,689,338,448,615,355 +276,696,105,492,279,424,623,118,215,334,556,708,875,615,626,213,246,503,693,487 +431,147,183,619,441,411,50,565,909,406,407,692,109,243,799,404,743,540,117,928 +114,492,740,453,302,279,666,948,356,107,393,104,411,345,560,110,436,437,83,171 +375,571,195,376,194,755,242,232,216,698,336,244,928,946,412,231,793,887,97,808 +545,473,297,408,563,386,713,385,624,378,414,483,766,941,761,731,210,149,538,243 +173,810,239,98,186,492,84,50,332,355,395,710,906,303,741,451,812,795,272,404 +398,106,207,892,383,435,913,404,332,793,541,345,339,466,549,382,744,124,430,558 +452,806,843,623,734,395,341,330,192,84,206,184,988,226,75,794,544,762,413,103 +539,406,740,772,794,211,892,294,635,393,235,694,176,627,772,449,710,502,63,622 +128,813,68,945,275,453,902,402,79,736,696,21,891,132,204,626,797,667,843,470 +404,205,793,552,946,830,76,56,728,213,563,154,468,347,272,927,225,630,357,395 +695,199,943,764,147,58,216,147,377,633,635,123,735,442,568,710,944,543,754,937 +178,218,127,156,316,118,624,82,449,747,125,624,387,233,177,376,154,446,554,385 +764,564,557,793,913,591,984,568,276,188,518,542,807,627,80,388,93,554,689,439 +692,810,19,84,553,571,353,736,56,486,451,756,121,710,342,145,740,729,706,565 +487,548,700,762,763,132,99,811,446,688,509,728,806,614,140,99,942,189,270,502 +412,526,756,894,233,515,703,460,865,464,86,145,228,772,231,211,85,132,446,247 +202,70,211,110,96,370,197,216,768,344,799,191,56,135,540,905,356,715,459,763 +620,56,419,354,708,414,488,710,766,77,463,712,225,8,713,741,204,616,635,626 +84,721,443,572,337,560,813,108,768,432,535,190,231,623,406,114,799,411,151,386 +890,807,897,400,278,570,95,103,626,430,68,299,731,701,625,113,503,617,747,497 +53,376,540,383,336,780,136,925,353,805,346,747,411,911,386,542,116,913,772,803 +382,508,553,893,490,377,186,924,121,573,379,420,306,1,739,589,128,379,734,434 +903,383,741,350,103,350,179,407,72,521,628,773,646,401,755,236,61,372,812,330 +740,565,373,400,491,563,737,625,461,761,67,303,913,979,383,844,711,357,865,740 +701,243,62,760,126,684,343,149,982,444,179,693,212,902,421,347,100,341,617,498 +270,796,626,699,518,735,205,559,13,842,896,909,237,809,102,376,809,558,471,462 +346,565,630,97,382,393,270,904,300,199,465,941,497,126,98,504,705,897,397,567 +908,806,284,518,276,748,113,419,628,86,352,800,745,414,625,213,83,146,137,106 +842,656,845,82,665,489,626,573,242,184,510,400,116,135,215,623,773,892,177,150 +610,949,795,630,201,110,736,891,626,270,198,710,748,89,727,901,55,345,763,613 +395,345,797,185,684,814,738,375,861,737,613,305,381,78,798,766,394,554,548,278 +613,811,302,188,905,96,693,160,441,80,201,692,736,270,626,557,896,485,734,279 +465,13,90,519,760,64,483,613,907,911,408,904,339,537,336,842,155,451,393,134 +67,683,631,389,869,518,385,705,344,212,712,809,80,114,230,415,109,766,482,689 +805,413,65,65,703,564,537,798,277,153,301,393,708,552,759,167,187,744,118,767 +844,153,337,926,845,433,703,176,715,131,130,98,801,122,937,72,737,811,509,742 +409,624,234,846,349,683,406,53,709,773,706,445,557,752,728,455,427,517,695,500 +666,441,92,903,421,526,624,745,443,143,83,175,347,571,123,96,118,194,713,201 +734,592,214,140,786,91,74,560,794,146,741,127,765,217,665,736,561,232,405,505 +201,613,104,413,542,68,179,193,402,757,463,926,844,572,376,553,541,532,492,814 +946,683,522,117,561,613,448,701,123,806,144,383,769,559,179,449,51,892,555,407 +70,490,497,486,666,699,155,374,590,843,57,221,51,169,52,372,145,71,502,223 +728,844,519,105,560,767,449,841,463,240,903,593,21,80,239,900,729,58,275,691 +565,454,713,386,585,545,403,242,356,911,100,234,406,147,339,549,380,297,127,553 +945,229,242,183,534,110,132,374,421,504,911,705,214,628,797,11,552,541,753,520 +354,352,377,124,944,211,203,126,521,386,738,683,350,593,510,948,744,937,494,155 +186,928,801,633,75,299,487,443,375,935,762,152,542,572,573,276,766,217,450,813 +410,59,388,487,419,238,408,488,206,661,236,812,469,551,537,529,119,793,280,613 +501,556,444,750,924,304,155,912,439,137,470,176,907,120,225,227,761,378,692,530 +869,702,773,482,453,372,496,88,698,65,730,229,735,689,105,352,803,709,759,438 +495,891,306,79,839,397,191,371,80,353,539,728,907,419,187,907,13,842,87,947 +850,688,56,305,630,202,398,620,622,798,235,126,799,421,493,131,558,379,395,212 +846,483,500,559,487,100,618,911,642,626,112,306,540,494,150,273,764,707,492,60 +520,749,504,549,502,755,664,338,143,542,388,770,913,402,135,391,572,101,713,722 +751,842,395,629,769,500,663,898,906,119,304,839,714,69,403,431,900,801,592,202 +125,272,125,175,740,56,898,430,549,928,192,570,471,280,510,129,129,471,521,458 +382,868,564,113,185,333,411,247,494,177,228,803,67,912,211,374,483,760,493,487 +372,222,190,306,555,710,186,273,60,688,410,142,514,508,567,848,415,632,728,189 +190,571,374,737,482,476,449,506,807,689,549,489,741,946,727,98,352,238,104,392 +456,182,71,182,463,728,88,138,620,150,342,535,229,228,112,664,735,429,750,120 +941,383,447,520,104,127,89,99,729,841,890,736,623,125,183,142,279,798,729,514 +3,141,589,447,213,498,465,906,146,436,132,539,795,128,733,73,551,562,93,502 +142,102,191,744,130,206,467,241,294,472,520,218,50,896,100,415,561,691,743,131 +757,285,734,924,493,539,485,66,77,343,135,210,442,424,514,50,628,280,397,392 +755,546,755,741,630,187,489,92,689,271,568,59,279,814,545,935,773,519,767,903 +484,348,756,346,184,754,518,695,435,701,415,102,515,54,102,373,139,758,221,266 +904,373,548,420,571,465,865,716,444,446,68,56,231,387,492,141,204,454,568,635 +490,126,752,237,840,441,271,563,499,490,736,18,77,688,751,841,279,814,706,164 +543,895,509,469,893,383,149,485,663,240,442,375,991,193,331,352,464,513,188,727 +205,949,665,231,688,230,413,940,239,764,100,136,684,56,234,377,232,735,737,558 +335,234,516,735,231,128,72,544,81,534,747,975,383,247,591,737,220,213,631,188 +613,803,391,913,692,303,467,71,543,771,414,106,736,133,526,619,740,763,80,57 +805,87,904,745,186,183,196,763,147,448,627,771,157,561,341,731,444,331,728,465 +230,195,809,220,747,613,552,225,70,766,707,743,946,558,298,162,466,302,699,615 +403,91,695,846,99,244,415,105,892,926,350,985,333,505,806,224,746,356,807,343 +798,740,272,936,568,891,535,519,740,701,63,413,66,272,280,204,280,235,123,560 +112,444,470,509,79,207,140,869,539,58,177,123,418,841,772,87,399,562,384,744 +89,550,247,632,563,846,349,763,184,194,898,757,167,222,64,272,456,63,693,415 +492,20,416,846,178,447,495,944,805,237,593,408,501,178,298,228,377,404,224,358 +741,386,138,125,478,553,83,101,304,894,466,437,373,341,623,844,946,810,555,115 +741,162,502,891,131,152,551,113,512,58,760,894,705,505,753,406,743,909,773,547 +404,188,223,57,731,653,124,805,234,752,371,707,356,712,945,331,747,151,947,148 +138,553,98,176,256,457,756,754,108,349,133,422,97,489,565,911,662,147,373,240 +236,51,945,68,67,144,771,763,690,807,505,521,219,572,373,257,195,517,753,53 +391,811,353,558,495,404,374,734,714,335,122,454,589,472,280,890,506,162,683,79 +767,825,905,904,519,332,708,506,436,237,801,302,711,84,196,424,947,84,72,191 +438,568,237,460,347,558,15,304,799,423,69,843,772,185,500,77,150,355,683,238 +497,134,396,536,224,223,414,412,776,416,303,125,275,501,502,839,216,754,687,232 +516,244,444,152,556,297,689,665,445,107,225,293,88,573,113,913,401,769,814,463 +149,902,76,505,508,542,839,176,494,560,900,128,578,156,223,893,218,225,684,807 +54,802,276,514,620,68,797,411,54,273,742,213,715,724,556,80,590,811,96,751 +907,57,490,727,592,86,223,647,444,504,346,708,418,278,404,191,738,62,215,376 +52,265,279,273,336,752,456,768,372,466,272,844,686,410,134,223,203,389,468,196 +223,324,865,68,149,505,488,244,547,117,392,589,896,494,747,98,298,569,507,467 +436,137,440,538,471,385,766,615,846,809,928,689,307,212,446,514,418,203,662,422 +338,697,19,705,689,104,686,538,56,538,434,214,80,214,116,298,183,560,734,414 +58,474,53,498,698,752,752,698,146,155,706,753,894,452,52,415,385,697,904,765 +56,200,449,226,343,76,177,409,228,484,135,350,762,794,691,384,333,945,109,996 +215,140,537,696,390,353,736,550,91,514,235,126,68,79,156,764,874,384,891,228 +297,939,114,134,505,461,706,683,357,246,222,460,763,75,563,392,337,535,546,549 +132,378,395,518,78,746,425,103,357,896,450,233,899,750,634,451,100,274,65,176 +471,893,801,755,528,488,246,665,74,702,489,110,126,138,729,190,752,120,225,437 +396,783,548,357,543,84,150,118,794,891,459,559,633,77,225,558,247,398,67,555 +464,350,68,274,335,352,617,91,555,620,548,708,737,345,852,126,129,555,416,904 +539,74,118,353,160,559,225,435,928,435,205,454,242,234,752,737,815,274,469,742 +422,136,752,128,340,456,507,504,664,551,634,404,733,425,197,534,564,217,536,536 +618,592,432,536,769,347,693,540,241,412,191,554,299,352,218,319,236,727,500,543 +456,180,137,901,569,258,59,900,913,331,462,418,187,747,450,384,210,384,729,373 +813,563,211,800,773,298,238,52,989,454,85,766,102,741,243,752,510,535,483,240 +448,390,933,621,242,50,71,484,104,350,752,271,492,730,335,54,747,103,144,566 +146,742,446,619,744,772,931,52,538,275,75,302,164,499,415,763,140,110,111,400 +123,443,356,91,78,878,507,944,444,949,492,690,740,212,763,714,553,126,278,348 +568,664,563,199,561,315,552,55,198,228,202,493,141,455,691,727,336,175,132,239 +455,514,693,144,198,331,354,383,395,796,460,219,729,341,99,753,623,228,338,162 +550,684,66,278,724,438,60,499,274,199,298,276,707,945,409,445,457,181,349,242 +493,590,810,381,509,898,382,461,301,58,465,743,392,728,376,746,15,142,198,715 +792,183,551,191,349,122,184,695,399,767,735,735,452,446,893,245,70,660,335,507 +403,801,380,689,237,770,192,729,175,205,622,194,383,392,556,724,773,74,949,535 +538,754,418,433,737,552,803,496,352,510,240,303,601,537,797,748,709,901,497,795 +390,193,216,904,228,443,550,627,663,379,219,749,484,163,345,86,733,913,75,707 +106,801,75,913,300,736,614,209,736,76,898,749,298,380,305,435,52,982,129,744 +385,796,354,807,626,272,105,372,441,421,506,508,239,892,224,284,763,766,229,278 +619,422,911,383,347,446,689,347,397,94,232,98,480,455,512,380,198,693,153,548 +60,510,423,890,227,850,924,178,759,182,590,184,453,465,904,466,616,502,63,684 +197,913,442,894,702,226,214,409,513,376,468,538,626,739,731,994,417,227,553,502 +197,625,403,117,300,713,70,795,754,549,815,409,121,148,995,189,796,742,690,273 +689,592,83,122,301,128,235,224,522,566,212,750,102,434,116,630,620,534,434,410 +642,948,901,421,225,666,64,138,635,358,344,690,79,613,98,413,392,57,487,372 +156,419,275,139,745,629,388,805,949,352,63,549,94,746,874,297,568,375,801,74 +710,554,768,379,136,932,376,380,403,739,177,458,391,469,756,180,204,907,244,865 +617,166,415,565,926,119,420,414,560,298,924,381,747,306,468,661,116,240,688,195 +221,358,420,246,368,75,68,279,694,280,341,378,81,752,501,696,404,902,345,752 +900,547,798,277,446,222,152,527,144,509,551,89,713,218,189,624,452,503,246,330 +395,407,16,547,421,517,665,389,97,298,140,126,467,164,420,183,807,93,703,153 +191,337,63,450,517,284,408,135,899,800,126,623,450,435,563,904,420,924,84,146 +693,618,910,843,500,185,509,181,438,461,845,430,450,805,123,247,432,738,374,571 +141,907,556,298,739,302,469,510,548,402,767,893,436,665,62,814,622,944,51,855 +446,434,447,146,643,626,489,344,111,112,801,467,91,177,186,204,613,207,100,519 +911,333,159,241,446,444,199,771,244,419,627,419,543,411,439,485,138,893,99,698 +632,799,441,800,796,439,120,394,536,735,664,794,897,235,121,86,174,519,132,625 +176,760,53,135,347,336,732,487,169,418,67,352,536,454,800,136,133,423,199,125 +508,397,814,752,381,697,243,906,936,144,175,660,842,126,377,749,926,569,620,665 +398,687,231,619,842,270,505,948,806,712,573,925,407,246,191,741,158,631,119,84 +554,844,457,125,88,185,562,120,231,741,341,154,572,279,428,758,306,83,798,338 +833,440,150,616,398,704,521,899,706,771,153,793,571,384,733,334,397,907,541,615 +359,845,422,58,302,629,387,240,627,902,487,455,235,215,353,683,193,440,129,696 +371,226,949,434,56,906,103,387,511,451,473,164,72,805,928,374,748,229,453,16 +155,68,205,133,592,762,60,732,488,133,752,119,507,545,20,97,386,79,727,534 +392,627,416,116,994,684,894,749,615,621,913,767,81,946,192,82,814,631,393,466 +268,494,667,947,393,67,435,135,744,441,840,572,58,270,71,145,229,541,300,464 +214,221,372,749,440,90,402,438,944,732,178,153,118,805,331,418,724,175,625,913 +452,667,686,456,185,472,130,807,898,663,810,354,344,650,385,797,399,708,622,100 +812,149,593,450,212,421,742,613,355,301,450,89,192,899,162,151,843,460,515,92 +531,201,557,279,633,68,131,338,804,199,489,452,220,203,745,128,665,946,410,240 +745,842,703,100,802,735,909,749,461,865,661,512,237,20,694,106,453,709,705,103 +406,247,62,91,375,547,796,53,751,463,753,121,358,293,213,413,631,947,332,355 +633,347,549,56,464,246,700,489,77,90,904,432,181,392,717,415,556,273,562,225 +800,180,876,110,804,375,627,225,892,120,116,117,619,557,81,88,112,537,106,123 +451,233,73,405,746,169,556,551,548,444,91,630,150,521,553,376,332,771,342,560 +348,556,567,684,865,910,200,695,311,418,384,483,905,422,510,185,473,631,560,344 +515,391,442,687,843,412,545,469,159,400,123,153,745,180,842,751,394,492,494,485 +409,442,390,469,223,335,552,77,758,339,94,186,721,683,539,486,924,684,632,192 +700,298,999,164,410,279,113,377,813,909,233,209,376,152,390,340,701,632,153,406 \ No newline at end of file From 0fa3b14b595758caee7c8b2037d3087786dc6b74 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 16 Dec 2020 22:51:08 +0100 Subject: [PATCH 050/110] feat(day16): part 2 try 2 --- day16/isValidTicket.ts | 2 +- day16/solution.spec.ts | 7 ----- day16/test2.ts | 71 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 day16/test2.ts diff --git a/day16/isValidTicket.ts b/day16/isValidTicket.ts index 0ca911a..1a01d96 100644 --- a/day16/isValidTicket.ts +++ b/day16/isValidTicket.ts @@ -1,4 +1,4 @@ -export type Rules = Record +export type Rules = Record export const parseRules = (rules: string[]): Rules => rules.reduce((rules, rule) => { diff --git a/day16/solution.spec.ts b/day16/solution.spec.ts index 207282b..59efeaa 100644 --- a/day16/solution.spec.ts +++ b/day16/solution.spec.ts @@ -87,12 +87,5 @@ describe('Day 16: Ticket Translation', () => { 'seat', ]) }) - it.skip('should solve', () => { - expect( - solveFields(parseRules(rules))( - tickets.map((s) => s.split(',').map((s) => parseInt(s, 10))), - ), - ).toEqual(['row', 'class', 'seat']) - }) }) }) diff --git a/day16/test2.ts b/day16/test2.ts new file mode 100644 index 0000000..1f727d5 --- /dev/null +++ b/day16/test2.ts @@ -0,0 +1,71 @@ +import { loader } from '../lib/loader' +import { parseRules } from './isValidTicket' + +const load = loader(16) +const tickets = load('tickets').map((s) => + s.split(',').map((s) => parseInt(s, 10)), +) +const rules = parseRules(load('rules')) + +type Rules = [string, [[number, number], [number, number]]][] + +const departureRules: Rules = Object.entries(rules).filter(([k]) => + k.startsWith('departure'), +) + +const findMatch = ( + rules: Rules, + tickets: number[][], + parents: Record = {}, +): any => { + if (rules.length === 0) { + // Check all tickets + for (const ticket of tickets) { + for (const [ruleName, k] of Object.entries(parents)) { + const v = ticket[k] + const rule = rules.find(([name]) => name === ruleName) + const [ruleMin1, ruleMax1] = rule?.[1][0] ?? [ + Number.MAX_SAFE_INTEGER, + -Number.MAX_SAFE_INTEGER, + ] + const [ruleMin2, ruleMax2] = rule?.[1][1] ?? [ + Number.MAX_SAFE_INTEGER, + -Number.MAX_SAFE_INTEGER, + ] + if ( + !( + (v >= ruleMin1 || v >= ruleMin2) && + (v <= ruleMax1 || v <= ruleMax2) + ) + ) { + return // fail + } + } + } + console.log(parents) + return // pass + } + for (let r = 0; r < rules.length; r++) { + const rule = rules[r] + const rest = [...rules.slice(0, r), ...rules.slice(r + 1)] + for (let k = 0; k < tickets[0].length; k++) { + if (Object.values(parents).includes(k)) continue + const [ruleMin1, ruleMax1] = rule[1][0] + const [ruleMin2, ruleMax2] = rule[1][1] + for (const ticket of tickets) { + const v = ticket[k] + if ( + (v >= ruleMin1 || v >= ruleMin2) && + (v <= ruleMax1 || v <= ruleMax2) + ) { + findMatch(rest, tickets, { + ...parents, + [rule[0]]: k, + }) + } + } + } + } +} + +console.log(findMatch(departureRules, tickets)) From a6bd51ff2893ea7e7db252a855784ab1fc018264 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Thu, 17 Dec 2020 13:38:22 +0100 Subject: [PATCH 051/110] feat(day16): part 2 try 3 --- day16/test2.ts | 112 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 73 insertions(+), 39 deletions(-) diff --git a/day16/test2.ts b/day16/test2.ts index 1f727d5..8b217eb 100644 --- a/day16/test2.ts +++ b/day16/test2.ts @@ -1,71 +1,105 @@ -import { loader } from '../lib/loader' +import { loadString } from '../lib/loader' import { parseRules } from './isValidTicket' -const load = loader(16) -const tickets = load('tickets').map((s) => - s.split(',').map((s) => parseInt(s, 10)), -) -const rules = parseRules(load('rules')) - type Rules = [string, [[number, number], [number, number]]][] -const departureRules: Rules = Object.entries(rules).filter(([k]) => - k.startsWith('departure'), -) +const rulePositionChecked = {} as Record +const ruleOrderChecked = {} as Record const findMatch = ( rules: Rules, tickets: number[][], - parents: Record = {}, + remainingRules = rules, + parents: string[] = [], ): any => { - if (rules.length === 0) { - // Check all tickets - for (const ticket of tickets) { - for (const [ruleName, k] of Object.entries(parents)) { + if (remainingRules.length === 0) { + if (rules.length !== parents.length) { + console.error({ + remainingRules, + parents, + }) + throw new Error('BUG!') + } + if (ruleOrderChecked[parents.join(',')] !== undefined) return + // Check all rules with all tickets + for (let k = 0; k < parents.length; k++) { + const ruleName = parents[k] + const key = `${ruleName}-${k}` + if (rulePositionChecked[key] !== undefined) return // fail early + const rule = rules.find(([name]) => name === ruleName) + const [ruleMin1, ruleMax1] = rule?.[1][0] ?? [ + Number.MAX_SAFE_INTEGER, + -Number.MAX_SAFE_INTEGER, + ] + const [ruleMin2, ruleMax2] = rule?.[1][1] ?? [ + Number.MAX_SAFE_INTEGER, + -Number.MAX_SAFE_INTEGER, + ] + for (const ticket of tickets) { const v = ticket[k] - const rule = rules.find(([name]) => name === ruleName) - const [ruleMin1, ruleMax1] = rule?.[1][0] ?? [ - Number.MAX_SAFE_INTEGER, - -Number.MAX_SAFE_INTEGER, - ] - const [ruleMin2, ruleMax2] = rule?.[1][1] ?? [ - Number.MAX_SAFE_INTEGER, - -Number.MAX_SAFE_INTEGER, - ] if ( !( - (v >= ruleMin1 || v >= ruleMin2) && - (v <= ruleMax1 || v <= ruleMax2) + (v >= ruleMin1 && v <= ruleMax1) || + (v >= ruleMin2 && v <= ruleMax2) ) ) { + ruleOrderChecked[parents.join(',')] = false return // fail } } } - console.log(parents) - return // pass + ruleOrderChecked[parents.join(',')] = true + return parents // pass } - for (let r = 0; r < rules.length; r++) { - const rule = rules[r] - const rest = [...rules.slice(0, r), ...rules.slice(r + 1)] + for (let r = 0; r < remainingRules.length; r++) { + const rule = remainingRules[r] + const rest = [...remainingRules.slice(0, r), ...remainingRules.slice(r + 1)] for (let k = 0; k < tickets[0].length; k++) { - if (Object.values(parents).includes(k)) continue + const key = `${rule[0]}-${k}` + if (rulePositionChecked[key] !== undefined) return const [ruleMin1, ruleMax1] = rule[1][0] const [ruleMin2, ruleMax2] = rule[1][1] + let allMatch = true for (const ticket of tickets) { const v = ticket[k] if ( - (v >= ruleMin1 || v >= ruleMin2) && - (v <= ruleMax1 || v <= ruleMax2) + !( + (v >= ruleMin1 && v <= ruleMax1) || + (v >= ruleMin2 && v <= ruleMax2) + ) ) { - findMatch(rest, tickets, { - ...parents, - [rule[0]]: k, - }) + allMatch = false + break } } + if (allMatch) { + const newParents = [...parents] + newParents[k] = rule[0] + return findMatch(rules, tickets, rest, newParents) + } else { + rulePositionChecked[key] = false + } } } } -console.log(findMatch(departureRules, tickets)) +/* +const load = loader(16) +const tickets = load('tickets').map((s) => + s.split(',').map((s) => parseInt(s, 10)), +) +const rules = parseRules(load('rules')) +console.log(findMatch(Object.entries(rules), tickets)) +console.log(rules) +*/ + +const step2sampleTickets = loadString(` +3,9,18 +15,1,5 +5,14,9`).map((s) => s.split(',').map((s) => parseInt(s, 10))) +const sample2Rules = parseRules( + loadString(`class: 0-1 or 4-19 +row: 0-5 or 8-19 +seat: 0-13 or 16-19`), +) +console.log(findMatch(Object.entries(sample2Rules), step2sampleTickets)) // 'row', 'class', 'seat', From ec09102ba69f3f8e9fa7b9972b15b7f984f3f75e Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Thu, 17 Dec 2020 14:38:02 +0100 Subject: [PATCH 052/110] feat(day16): part 2 --- day16/findMatchingRules.ts | 56 ++++++++++++++++++++ day16/solution.spec.ts | 34 +++++++++++- day16/solveFields.ts | 66 ----------------------- day16/test.ts | 14 ----- day16/test2.ts | 105 ------------------------------------- 5 files changed, 88 insertions(+), 187 deletions(-) create mode 100644 day16/findMatchingRules.ts delete mode 100644 day16/solveFields.ts delete mode 100644 day16/test.ts delete mode 100644 day16/test2.ts diff --git a/day16/findMatchingRules.ts b/day16/findMatchingRules.ts new file mode 100644 index 0000000..f6915e4 --- /dev/null +++ b/day16/findMatchingRules.ts @@ -0,0 +1,56 @@ +import { Rules } from './isValidTicket' + +export const findMatchingRules = ( + tickets: number[][], + rules: Rules, + rowRules = [] as string[], + row = 0, + testMemory = {} as Record, +): string[] | undefined => { + if (row >= tickets[0].length) { + // We have assinged rules to all rows, which means we are done. + return rowRules + } + // Assing the remaining rules + const remainingRules = Object.entries(rules).filter( + ([ruleName]) => !rowRules.includes(ruleName), + ) + const matchingRules = [] + for (const [ruleName, [[min1, max1], [min2, max2]]] of remainingRules) { + const key = `${ruleName}-${row}` + const previous = testMemory[key] + if (previous === false) continue // We have tested this rule already for this row and it never matches + if (previous === true) { + // We have tested this rule already for all tickets and can use it + matchingRules.push(ruleName) + continue + } + // Check if all tickets match this rule + let allTicketsMatch = true + for (const ticket of tickets) { + const v = ticket[row] + if (!((v >= min1 && v <= max1) || (v >= min2 && v <= max2))) { + allTicketsMatch = false + testMemory[key] = false + break + } + } + if (allTicketsMatch) { + matchingRules.push(ruleName) + testMemory[key] = true + } + } + if (matchingRules.length) { + for (const matchingRule of matchingRules) { + const res = findMatchingRules( + tickets, + rules, + [...rowRules, matchingRule], + row + 1, + testMemory, + ) + if (res) return res + } + } + return +} diff --git a/day16/solution.spec.ts b/day16/solution.spec.ts index 59efeaa..2c9d343 100644 --- a/day16/solution.spec.ts +++ b/day16/solution.spec.ts @@ -1,6 +1,6 @@ import { loader, loadString } from '../lib/loader' import { findInvalidNumbers, parseRules } from './isValidTicket' -import { solveFields } from './solveFields' +import { findMatchingRules } from './findMatchingRules' const sampleRules = loadString(`class: 1-3 or 5-7 row: 6-11 or 33-44 @@ -81,11 +81,41 @@ describe('Day 16: Ticket Translation', () => { ) expect(validTickets).toHaveLength(3) - expect(solveFields(sample2Rules)(step2sampleTickets)).toEqual([ + expect(findMatchingRules(step2sampleTickets, sample2Rules)).toEqual([ 'row', 'class', 'seat', ]) }) + it('should solve', () => { + const r = parseRules(rules) + const f = findInvalidNumbers(r) + const validTickets = tickets + .map((s) => s.split(',').map((s) => parseInt(s, 10))) + .filter((ticket) => f(ticket).length === 0) + const res = findMatchingRules(validTickets, r) + expect(res).toEqual([ + 'route', + 'arrival track', + 'departure location', + 'type', + 'arrival station', + 'duration', + 'arrival platform', + 'departure platform', + 'train', + 'row', + 'arrival location', + 'wagon', + 'seat', + 'departure time', + 'departure station', + 'class', + 'departure date', + 'price', + 'zone', + 'departure track', + ]) + }) }) }) diff --git a/day16/solveFields.ts b/day16/solveFields.ts deleted file mode 100644 index 5b0df8e..0000000 --- a/day16/solveFields.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Rules } from './isValidTicket' - -const combine = (categories: T[]) => { - const combinations: T[][] = [] - const g = (categories: T[], parents: T[] = []) => { - if (categories.length === 0) { - combinations.push(parents) - return - } - categories.forEach((cat) => { - g( - categories.filter((c) => [...parents, cat].includes(c) === false), - [...parents, cat], - ) - }) - } - g(categories) - return combinations -} - -export const solveFields = (rules: Rules, filter?: string) => ( - validTickets: number[][], -): string[] => { - const allCategories = Object.keys(rules) - const filteredCategories = allCategories.filter((s) => - filter === undefined ? true : s.startsWith(filter), - ) - const combinations = combine(filteredCategories) - const missing = allCategories.length - filteredCategories.length - - for (let i = 0; i <= missing; i++) { - for (const c of combinations) { - let validCombination = [] as string[] - ;(() => { - const ranges = [ - ...'-' - .repeat(i) - .split('') - .map(() => [ - [0, Number.MAX_SAFE_INTEGER], - [0, Number.MAX_SAFE_INTEGER], - ]), - ...c.map((c) => rules[c]), - ...'-' - .repeat(missing - i) - .split('') - .map(() => [ - [0, Number.MAX_SAFE_INTEGER], - [0, Number.MAX_SAFE_INTEGER], - ]), - ] - for (const t of validTickets) { - for (let l = 0; l < t.length; l++) { - const n = t[l] - const [[from1, to1], [from2, to2]] = ranges[l] - const valid = (n >= from1 && n <= to1) || (n >= from2 && n <= to2) - if (!valid) return - } - } - validCombination = c - })() - if (validCombination.length > 0) return validCombination - } - } - return [] -} diff --git a/day16/test.ts b/day16/test.ts deleted file mode 100644 index 42b6e25..0000000 --- a/day16/test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { loader } from '../lib/loader' -import { parseRules } from './isValidTicket' -import { solveFields } from './solveFields' - -const load = loader(16) -const rules = load('rules') -const tickets = load('tickets') - -console.log( - solveFields( - parseRules(rules), - 'departure', - )(tickets.map((s) => s.split(',').map((s) => parseInt(s, 10)))), -) diff --git a/day16/test2.ts b/day16/test2.ts deleted file mode 100644 index 8b217eb..0000000 --- a/day16/test2.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { loadString } from '../lib/loader' -import { parseRules } from './isValidTicket' - -type Rules = [string, [[number, number], [number, number]]][] - -const rulePositionChecked = {} as Record -const ruleOrderChecked = {} as Record - -const findMatch = ( - rules: Rules, - tickets: number[][], - remainingRules = rules, - parents: string[] = [], -): any => { - if (remainingRules.length === 0) { - if (rules.length !== parents.length) { - console.error({ - remainingRules, - parents, - }) - throw new Error('BUG!') - } - if (ruleOrderChecked[parents.join(',')] !== undefined) return - // Check all rules with all tickets - for (let k = 0; k < parents.length; k++) { - const ruleName = parents[k] - const key = `${ruleName}-${k}` - if (rulePositionChecked[key] !== undefined) return // fail early - const rule = rules.find(([name]) => name === ruleName) - const [ruleMin1, ruleMax1] = rule?.[1][0] ?? [ - Number.MAX_SAFE_INTEGER, - -Number.MAX_SAFE_INTEGER, - ] - const [ruleMin2, ruleMax2] = rule?.[1][1] ?? [ - Number.MAX_SAFE_INTEGER, - -Number.MAX_SAFE_INTEGER, - ] - for (const ticket of tickets) { - const v = ticket[k] - if ( - !( - (v >= ruleMin1 && v <= ruleMax1) || - (v >= ruleMin2 && v <= ruleMax2) - ) - ) { - ruleOrderChecked[parents.join(',')] = false - return // fail - } - } - } - ruleOrderChecked[parents.join(',')] = true - return parents // pass - } - for (let r = 0; r < remainingRules.length; r++) { - const rule = remainingRules[r] - const rest = [...remainingRules.slice(0, r), ...remainingRules.slice(r + 1)] - for (let k = 0; k < tickets[0].length; k++) { - const key = `${rule[0]}-${k}` - if (rulePositionChecked[key] !== undefined) return - const [ruleMin1, ruleMax1] = rule[1][0] - const [ruleMin2, ruleMax2] = rule[1][1] - let allMatch = true - for (const ticket of tickets) { - const v = ticket[k] - if ( - !( - (v >= ruleMin1 && v <= ruleMax1) || - (v >= ruleMin2 && v <= ruleMax2) - ) - ) { - allMatch = false - break - } - } - if (allMatch) { - const newParents = [...parents] - newParents[k] = rule[0] - return findMatch(rules, tickets, rest, newParents) - } else { - rulePositionChecked[key] = false - } - } - } -} - -/* -const load = loader(16) -const tickets = load('tickets').map((s) => - s.split(',').map((s) => parseInt(s, 10)), -) -const rules = parseRules(load('rules')) -console.log(findMatch(Object.entries(rules), tickets)) -console.log(rules) -*/ - -const step2sampleTickets = loadString(` -3,9,18 -15,1,5 -5,14,9`).map((s) => s.split(',').map((s) => parseInt(s, 10))) -const sample2Rules = parseRules( - loadString(`class: 0-1 or 4-19 -row: 0-5 or 8-19 -seat: 0-13 or 16-19`), -) -console.log(findMatch(Object.entries(sample2Rules), step2sampleTickets)) // 'row', 'class', 'seat', From ee196ce444296889dff7d0ffeb2862a294cc667d Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Thu, 17 Dec 2020 22:40:07 +0100 Subject: [PATCH 053/110] feat: day 17 wip --- day17/test.ts | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 day17/test.ts diff --git a/day17/test.ts b/day17/test.ts new file mode 100644 index 0000000..ea5f3e0 --- /dev/null +++ b/day17/test.ts @@ -0,0 +1,141 @@ +import { loadString } from '../lib/loader' + +type Cube = [number, number, number, boolean] + +const seed = loadString(`.#. +..# +###`) + +const cubes = seed.reduce( + (cubes, line, y) => [ + ...cubes, + ...line.split('').map((s, x) => { + if (s === '#') return [x, y, 0, true] as Cube + return [x, y, 0, false] as Cube + }), + ], + [] as Cube[], +) + +const unique = (v: T, k: number, arr: T[]) => arr.indexOf(v) === k + +const printCubes = (cubes: Cube[]) => { + const layers = cubes + .sort(([, , z1], [, , z2]) => z2 - z1) + .map(([, , z]) => z) + .filter(unique) + for (const z of layers) { + console.log('') + console.log(`z=${z}`) + const cubesOnLayer = cubes.filter(([, , cubeZ]) => cubeZ === z) + const width = cubesOnLayer.reduce( + (width, [x]) => (x > width ? x : width), + 0, + ) + const height = cubesOnLayer.reduce( + (height, [, y]) => (y > height ? y : height), + 0, + ) + const space = [] as string[][] + for (let y = 0; y <= height; y++) { + space[y] = [] + for (let x = 0; x <= width; x++) { + space[y][x] = ' ' + } + } + for (const cube of cubesOnLayer) { + space[cube[1]][cube[0]] = cube[3] ? '#' : '.' + } + console.log(space.map((s) => s.join('')).join('\n')) + } +} + +const equal = (a: Cube) => (b: Cube) => + a[0] === b[0] && a[1] === b[1] && a[2] === b[2] + +const notEqual = (a: Cube) => (b: Cube) => !equal(a)(b) + +const isActive = ([, , , active]: Cube) => active + +const neighbor = (a: Cube) => (b: Cube) => + Math.max( + Math.abs(a[0] - b[0]), + Math.abs(a[1] - b[1]), + Math.abs(a[2] - b[2]), + ) === 1 + +const countActiveNeighbours = (cube: Cube, world: Cube[]): number => + world.filter(notEqual(cube)).filter(isActive).filter(neighbor(cube)).length + +// Extend the world so that each active cube has inactive neighbours around +const extend = (world: Cube[]): Cube[] => + world.filter(isActive).reduce((newCubes, cube) => { + const [x, y, z] = cube + const neighbors = [ + // Front slice + [x - 1, y + 1, z - 1, false], + [x, y + 1, z - 1, false], + [x + 1, y + 1, z - 1, false], + [x - 1, y, z - 1, false], + [x, y, z - 1, false], + [x + 1, y, z - 1, false], + [x - 1, y - 1, z - 1, false], + [x, y - 1, z - 1, false], + [x + 1, y - 1, z - 1, false], + // Center slice + [x - 1, y + 1, z, false], + [x, y + 1, z, false], + [x + 1, y + 1, z, false], + [x - 1, y, z, false], + // [x, y, z, false], + [x + 1, y, z, false], + [x - 1, y - 1, z, false], + [x, y - 1, z, false], + [x + 1, y - 1, z, false], + // Back slice + [x - 1, y + 1, z + 1, false], + [x, y + 1, z + 1, false], + [x + 1, y + 1, z + 1, false], + [x - 1, y, z + 1, false], + [x, y, z + 1, false], + [x + 1, y, z + 1, false], + [x - 1, y - 1, z + 1, false], + [x, y - 1, z + 1, false], + [x + 1, y - 1, z + 1, false], + ] as Cube[] + return neighbors.filter( + ([x, y, z]) => + [...world, ...newCubes].find( + ([wx, wy, wz]) => wx === x && wy === y && wz === z, + ) === undefined, + ) + }, [] as Cube[]) + +const cycle = (cubes: Cube[]): Cube[] => + [...cubes, ...extend(cubes)].map((cube) => { + const activeNeighbors = countActiveNeighbours(cube, cubes) + // If a cube is active and exactly 2 or 3 of its neighbors are also active, + // the cube remains active. Otherwise, the cube becomes inactive. + const [x, y, z] = cube + if (isActive(cube)) { + if (activeNeighbors === 2 || activeNeighbors === 3) { + console.log(`Cube ${cube} stays active (${activeNeighbors} neighbors)`) + return [x, y, z, true] + } + console.log( + `Cube ${cube} becomes inactive (${activeNeighbors} neighbors)`, + ) + return [x, y, z, false] + } + // If a cube is inactive but exactly 3 of its neighbors are active, + // the cube becomes active. Otherwise, the cube remains inactive. + if (!isActive(cube)) { + if (activeNeighbors === 3) return [x, y, z, true] + return [x, y, z, false] + } + return [...cube] + }) + +printCubes(cubes) +console.log(`Cycle 1`) +printCubes(cycle(cubes)) From 2b345d19cea12482ba0cc51d2d8d632a450c8189 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 18 Dec 2020 00:13:37 +0100 Subject: [PATCH 054/110] feat(day17): part 1 --- day17/cubes.ts | 143 +++++++++++++++++++++++++++++++++++++++++ day17/solution.spec.ts | 40 ++++++++++++ day17/test.ts | 141 ---------------------------------------- 3 files changed, 183 insertions(+), 141 deletions(-) create mode 100644 day17/cubes.ts create mode 100644 day17/solution.spec.ts delete mode 100644 day17/test.ts diff --git a/day17/cubes.ts b/day17/cubes.ts new file mode 100644 index 0000000..ced973e --- /dev/null +++ b/day17/cubes.ts @@ -0,0 +1,143 @@ +type ActiveCube = [number, number, number] + +export const loadSeed = (seed: string[]): ActiveCube[] => + seed.reduce( + (cubes, line, y) => [ + ...cubes, + ...(line + .split('') + .map((s, x) => { + if (s === '#') return [x, y, 0] + return undefined + }) + .filter((c) => c !== undefined) as ActiveCube[]), + ], + [] as ActiveCube[], + ) + +const unique = (v: T, k: number, arr: T[]) => arr.indexOf(v) === k + +export const printCubes = (cubes: ActiveCube[]): void => { + const zs = cubes + .sort(([, , z1], [, , z2]) => z1 - z2) + .map(([, , z]) => z) + .filter(unique) + const xs = cubes + .sort(([x1], [x2]) => x1 - x2) + .map(([x]) => x) + .filter(unique) + const ys = cubes + .sort(([, y1], [, y2]) => y1 - y2) + .map(([, y]) => y) + .filter(unique) + + const width = xs[xs.length - 1] - xs[0] + const xOffset = -xs[0] + const height = ys[ys.length - 1] - ys[0] + const yOffset = -ys[0] + + for (const z of zs) { + console.log('') + console.log(`z=${z}`) + const cubesOnLayer = cubes.filter(([, , cubeZ]) => cubeZ === z) + const space = [] as string[][] + for (let y = 0; y <= height; y++) { + space[y] = [] + for (let x = 0; x <= width; x++) { + space[y][x] = '.' + } + } + for (const cube of cubesOnLayer) { + space[cube[1] + yOffset][cube[0] + xOffset] = '#' + } + console.log(space.map((s) => s.join('')).join('\n')) + } +} + +const equal = (a: ActiveCube) => (b: ActiveCube) => + a[0] === b[0] && a[1] === b[1] && a[2] === b[2] + +const notEqual = (a: ActiveCube) => (b: ActiveCube) => !equal(a)(b) + +const neighbor = (a: ActiveCube) => (b: ActiveCube) => + Math.max( + Math.abs(a[0] - b[0]), + Math.abs(a[1] - b[1]), + Math.abs(a[2] - b[2]), + ) === 1 + +const countActiveNeighbours = (cube: ActiveCube, world: ActiveCube[]): number => + world.filter(notEqual(cube)).filter(neighbor(cube)).length + +// Return all the cubes around the given cube +const expand = (cube: ActiveCube): ActiveCube[] => { + const [x, y, z] = cube + return [ + // Front slice + [x - 1, y + 1, z - 1], + [x, y + 1, z - 1], + [x + 1, y + 1, z - 1], + [x - 1, y, z - 1], + [x, y, z - 1], + [x + 1, y, z - 1], + [x - 1, y - 1, z - 1], + [x, y - 1, z - 1], + [x + 1, y - 1, z - 1], + // Center slice + [x - 1, y + 1, z], + [x, y + 1, z], + [x + 1, y + 1, z], + [x - 1, y, z], + //[x, y, z], // Do not return the cube itself + [x + 1, y, z], + [x - 1, y - 1, z], + [x, y - 1, z], + [x + 1, y - 1, z], + // Back slice + [x - 1, y + 1, z + 1], + [x, y + 1, z + 1], + [x + 1, y + 1, z + 1], + [x - 1, y, z + 1], + [x, y, z + 1], + [x + 1, y, z + 1], + [x - 1, y - 1, z + 1], + [x, y - 1, z + 1], + [x + 1, y - 1, z + 1], + ] as ActiveCube[] +} + +const containsCube = (world: ActiveCube[]) => ([x, y, z]: ActiveCube) => + world.find(([wx, wy, wz]) => wx === x && wy === y && wz === z) !== undefined + +const containsNotCube = (world: ActiveCube[]) => (cube: ActiveCube) => + !containsCube(world)(cube) + +export const cycle = (seed: ActiveCube[]): ActiveCube[] => { + const iteration: ActiveCube[] = [] + for (const cube of seed) { + const activeNeighbors = countActiveNeighbours(cube, seed) + // If a cube is active and exactly 2 or 3 of its neighbors are also active, + // the cube remains active. Otherwise, the cube becomes inactive. + const [x, y, z] = cube + if (activeNeighbors === 2 || activeNeighbors === 3) { + // console.log(`Cube ${cube} stays active (${activeNeighbors} neighbors)`) + iteration.push([x, y, z]) + } else { + // console.log( `Cube ${cube} becomes inactive (${activeNeighbors} neighbors)`, ) + } + + // If a cube is inactive but exactly 3 of its neighbors are active, + // the cube becomes active. Otherwise, the cube remains inactive. + const notInSeed = containsNotCube(seed) + const notInIteration = containsNotCube(iteration) + const inactiveAround = expand(cube).filter(notInSeed).filter(notInIteration) + for (const inactiveCube of inactiveAround) { + const activeNeighbors = countActiveNeighbours(inactiveCube, seed) + if (activeNeighbors === 3) { + // console.log( `Cube ${inactiveCube} becomes active (${activeNeighbors} neighbors)`, ) + iteration.push(inactiveCube) + } + } + } + return iteration +} diff --git a/day17/solution.spec.ts b/day17/solution.spec.ts new file mode 100644 index 0000000..7d78841 --- /dev/null +++ b/day17/solution.spec.ts @@ -0,0 +1,40 @@ +import { loadString } from '../lib/loader' +import { loadSeed, printCubes, cycle } from './cubes' + +const sampleSeed = loadString(`.#. +..# +###`) + +const input = loadString(`####...# +......#. +#..#.##. +.#...#.# +..###.#. +##.###.. +.#...### +.##....#`) + +describe('Day 17: Conway Cubes', () => { + describe('Part 1', () => { + it('should solve the sample', () => { + let space = [...loadSeed(sampleSeed)] + for (let c = 0; c < 6; c++) { + console.log('') + console.log(`Cycle ${c}: ${space.length}`) + space = cycle(space) + printCubes(space) + } + expect(space).toHaveLength(112) + }) + it('should solve', () => { + let space = [...loadSeed(input)] + for (let c = 0; c < 6; c++) { + console.log('') + console.log(`Cycle ${c}: ${space.length}`) + space = cycle(space) + printCubes(space) + } + expect(space).toHaveLength(286) + }) + }) +}) diff --git a/day17/test.ts b/day17/test.ts deleted file mode 100644 index ea5f3e0..0000000 --- a/day17/test.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { loadString } from '../lib/loader' - -type Cube = [number, number, number, boolean] - -const seed = loadString(`.#. -..# -###`) - -const cubes = seed.reduce( - (cubes, line, y) => [ - ...cubes, - ...line.split('').map((s, x) => { - if (s === '#') return [x, y, 0, true] as Cube - return [x, y, 0, false] as Cube - }), - ], - [] as Cube[], -) - -const unique = (v: T, k: number, arr: T[]) => arr.indexOf(v) === k - -const printCubes = (cubes: Cube[]) => { - const layers = cubes - .sort(([, , z1], [, , z2]) => z2 - z1) - .map(([, , z]) => z) - .filter(unique) - for (const z of layers) { - console.log('') - console.log(`z=${z}`) - const cubesOnLayer = cubes.filter(([, , cubeZ]) => cubeZ === z) - const width = cubesOnLayer.reduce( - (width, [x]) => (x > width ? x : width), - 0, - ) - const height = cubesOnLayer.reduce( - (height, [, y]) => (y > height ? y : height), - 0, - ) - const space = [] as string[][] - for (let y = 0; y <= height; y++) { - space[y] = [] - for (let x = 0; x <= width; x++) { - space[y][x] = ' ' - } - } - for (const cube of cubesOnLayer) { - space[cube[1]][cube[0]] = cube[3] ? '#' : '.' - } - console.log(space.map((s) => s.join('')).join('\n')) - } -} - -const equal = (a: Cube) => (b: Cube) => - a[0] === b[0] && a[1] === b[1] && a[2] === b[2] - -const notEqual = (a: Cube) => (b: Cube) => !equal(a)(b) - -const isActive = ([, , , active]: Cube) => active - -const neighbor = (a: Cube) => (b: Cube) => - Math.max( - Math.abs(a[0] - b[0]), - Math.abs(a[1] - b[1]), - Math.abs(a[2] - b[2]), - ) === 1 - -const countActiveNeighbours = (cube: Cube, world: Cube[]): number => - world.filter(notEqual(cube)).filter(isActive).filter(neighbor(cube)).length - -// Extend the world so that each active cube has inactive neighbours around -const extend = (world: Cube[]): Cube[] => - world.filter(isActive).reduce((newCubes, cube) => { - const [x, y, z] = cube - const neighbors = [ - // Front slice - [x - 1, y + 1, z - 1, false], - [x, y + 1, z - 1, false], - [x + 1, y + 1, z - 1, false], - [x - 1, y, z - 1, false], - [x, y, z - 1, false], - [x + 1, y, z - 1, false], - [x - 1, y - 1, z - 1, false], - [x, y - 1, z - 1, false], - [x + 1, y - 1, z - 1, false], - // Center slice - [x - 1, y + 1, z, false], - [x, y + 1, z, false], - [x + 1, y + 1, z, false], - [x - 1, y, z, false], - // [x, y, z, false], - [x + 1, y, z, false], - [x - 1, y - 1, z, false], - [x, y - 1, z, false], - [x + 1, y - 1, z, false], - // Back slice - [x - 1, y + 1, z + 1, false], - [x, y + 1, z + 1, false], - [x + 1, y + 1, z + 1, false], - [x - 1, y, z + 1, false], - [x, y, z + 1, false], - [x + 1, y, z + 1, false], - [x - 1, y - 1, z + 1, false], - [x, y - 1, z + 1, false], - [x + 1, y - 1, z + 1, false], - ] as Cube[] - return neighbors.filter( - ([x, y, z]) => - [...world, ...newCubes].find( - ([wx, wy, wz]) => wx === x && wy === y && wz === z, - ) === undefined, - ) - }, [] as Cube[]) - -const cycle = (cubes: Cube[]): Cube[] => - [...cubes, ...extend(cubes)].map((cube) => { - const activeNeighbors = countActiveNeighbours(cube, cubes) - // If a cube is active and exactly 2 or 3 of its neighbors are also active, - // the cube remains active. Otherwise, the cube becomes inactive. - const [x, y, z] = cube - if (isActive(cube)) { - if (activeNeighbors === 2 || activeNeighbors === 3) { - console.log(`Cube ${cube} stays active (${activeNeighbors} neighbors)`) - return [x, y, z, true] - } - console.log( - `Cube ${cube} becomes inactive (${activeNeighbors} neighbors)`, - ) - return [x, y, z, false] - } - // If a cube is inactive but exactly 3 of its neighbors are active, - // the cube becomes active. Otherwise, the cube remains inactive. - if (!isActive(cube)) { - if (activeNeighbors === 3) return [x, y, z, true] - return [x, y, z, false] - } - return [...cube] - }) - -printCubes(cubes) -console.log(`Cycle 1`) -printCubes(cycle(cubes)) From cd784a05ff50ce544c8779cf097d375e562ebeed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 12 Dec 2020 10:25:14 +0000 Subject: [PATCH 055/110] build(deps): bump ini from 1.3.5 to 1.3.8 Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.8. - [Release notes](https://github.com/isaacs/ini/releases) - [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.8) Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 49c1fbb..389dd3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3716,9 +3716,9 @@ "dev": true }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "ip-regex": { From 9f86abfe1a4fe15cbde4c0d558cd748d24576b48 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 18 Dec 2020 15:12:46 +0100 Subject: [PATCH 056/110] feat(day18): part 1 --- day18/calc.ts | 62 ++++++++ day18/input.txt | 375 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 437 insertions(+) create mode 100644 day18/calc.ts create mode 100644 day18/input.txt diff --git a/day18/calc.ts b/day18/calc.ts new file mode 100644 index 0000000..85c226a --- /dev/null +++ b/day18/calc.ts @@ -0,0 +1,62 @@ +const isNumber = (s: string): boolean => /^[0-9]$/.test(s) +const isSpace = (s: string): boolean => /^ $/.test(s) +const isOperator = (s: string): boolean => /^[+*]$/.test(s) +const isOpeningParenthesis = (s: string): boolean => /^\($/.test(s) +const isClosingParenthesis = (s: string): boolean => /^\)$/.test(s) + +const findClosing = (expr: string, start: number) => { + let level = 0 + for (let i = start; i < expr.length; i++) { + if (isOpeningParenthesis(expr[i])) level++ + if (isClosingParenthesis(expr[i])) level-- + if (level === 0) return i + } + throw new Error( + `Could not find closing paranthesis in ${expr}, starting at ${start}`, + ) +} + +export const calc = (expr: string): number => { + let a = 0 + let op = '' + let b = 0 + let pos = 0 + for (let i = 0; i < expr.length; i++) { + const e = expr[i] + if (isNumber(e)) { + if (pos === 0) { + a = parseInt(`${a}${e}`, 10) + } else { + b = parseInt(`${b}${e}`, 10) + } + } else if (isOperator(e)) { + pos = ++pos % 2 + if (pos === 0) { + a = calc(`${a} ${op} ${b}`) + b = 0 + pos++ + } + op = e + } else if (isSpace(e)) { + // Pass + } else if (isOpeningParenthesis(e)) { + const closingPos = findClosing(expr, i) + const res = calc(expr.substr(i + 1, closingPos - 1 - i)) + if (pos === 0) a = res + else b = res + i = closingPos + if (closingPos >= expr.length - 1 && pos === 0) return a + } else { + throw new Error(`Unexpected character "${e}" at pos ${i}!`) + } + } + + switch (op) { + case '*': + return a * b + case '+': + return a + b + default: + throw new Error(`Unexpected operator "${op}"!`) + } +} diff --git a/day18/input.txt b/day18/input.txt new file mode 100644 index 0000000..f8777b6 --- /dev/null +++ b/day18/input.txt @@ -0,0 +1,375 @@ +(7 * 5 * 6 + (9 * 8 + 3 * 3 + 5) + 7) * (6 + 3 * 9) + 6 + 7 + (7 * 5) * 4 +(4 + 9 + (8 * 2) + 5) * 8 + (3 + 2 * 3 * 7 * (7 * 4 * 5) * 9) * 2 +3 + 7 + (9 + 6 + 4 * 7 * 3 + 5) * 9 +3 + 3 * (5 + (7 * 5 + 4 * 8 + 9 * 2) + 3) * 8 * 7 +(8 + 3 + 7 * 7) + (3 + 8) * 4 + 2 +2 + 9 * (7 + 3 * 3 * 8) + 9 + 3 +2 * ((5 + 7 + 9 + 7 * 3 * 7) * 2 + 4 * 4 + (2 + 2 + 7) + 3) + 6 +8 * 3 * (6 + (6 * 8 * 2)) + 9 + 9 * 3 +(9 * 7 + 6) + 5 * (7 + 5 + 4) + 2 +(9 + 4 * (5 + 5 + 4 * 2) * 7) * 7 * 9 * 5 * 3 +7 * 6 * ((5 + 6 + 8 + 4 * 3) + 2 + 2 * (4 + 6 + 2 + 7) + 8) + 4 +6 + 5 + 3 * (4 * (8 + 8 + 7 + 2 * 6) + 3 + (7 * 6 * 3) * (9 + 5)) + 4 +9 + 4 + (7 + 3 + 3 + 2 + 8) + (2 * (4 * 2) + 8 + (9 + 9 * 9 * 5 + 2 + 3) * (6 + 4 * 5)) * (4 + 8 * 2) +(2 * 3 + 7 * 5 * (2 + 3 * 7) * 3) + 9 +9 + (6 * 6 * 3) * 3 +((3 * 6) + (5 + 5 * 9 * 7 + 8) * 7 * 8) + 8 + (6 * (4 * 2 + 6 + 7 + 2) * (2 * 8 + 3) * 5 + 7) + 5 + 7 +(2 * 3 + 4 + 9 + 8) + (5 * 4 * (5 + 5 + 3) + 2 * 8 + 2) +7 + 7 + 7 + 4 + (7 + 7 + 8) +9 * (8 + 7) + 2 * 6 +6 + 8 + 8 * 6 * 8 + ((5 + 2 * 2 * 6 + 8) + 9 + 3 + (5 * 3 * 8) + 7) +4 * 9 + 8 + (5 * (5 + 6 * 8) + 5 + 4 + (7 * 2 * 6)) * 5 +(8 * 5 + 3 * 6 + 8 + 6) + 5 * 2 + 6 + (3 + 8 + 3 + 7 * 7 * 6) +5 + (2 * (6 * 8 * 9 + 3 + 9 * 6) + 8 * (7 + 6 + 8) + 9 + 7) + 6 * 6 +7 + 2 * (5 + 4 * 8 + (8 + 9) + 3) * 3 +2 * ((8 + 3 + 2) + 9 * (6 * 2 * 5 * 6)) * 7 * 2 * 9 +((6 + 6) + (4 * 4 + 7 * 6 * 3) * (2 + 2 + 5 + 8) + 7 + 5) + 6 * 8 * 7 * 4 * 7 +6 + 5 * 8 + (8 + 5 + 4 + 6 * 5) + 8 + 9 +2 + (2 + (8 + 8) + 2) +3 * 3 * (8 + 2 + 3) * (2 + 4) + 7 +9 * 2 + 9 + (3 + 5 + 5 * 2 * 2 + 7) +(7 * (2 + 6 * 7 * 2) + (8 + 4 + 4) + 4 + 5) + 3 +(7 * 5 + 7) + (3 * 9 * 4 * (8 * 2 + 9) * 8) * 6 + 9 * 9 +9 + (2 * 5 + 2 * 7 * 3 * 7) + 5 + 3 +(3 * (5 * 3 * 4) * (5 + 2)) + 7 +(7 + 4) + 9 * 2 +3 * (5 * 6 * 5 * 8) * 2 * 2 * 7 * 7 +(7 + (7 * 2 * 5 * 6 * 7 + 2)) * 5 + 9 * 9 +(5 * (3 + 6 + 4 + 4 * 8)) * (8 * 6 * 6 + (4 + 8)) * 2 + 8 + 8 +((9 * 8) * 3 * 7 * (3 + 9 * 8 + 6)) + (4 + 2 + 7 * 9) +(6 * 4 + 8 * 2 * 9) + 5 * 5 * 3 +5 + 6 * 9 * 7 +(2 * 5 * (2 + 8 + 5 + 2 * 5) * 2 * 9) + (6 + 8 * 2) + 5 +7 * ((4 + 8 + 8) * 7 * 3 * 3 * 5 + (5 + 6 + 9 * 6)) +(6 + 5) * 2 +7 * 2 + 4 + (2 * 4) + 5 + 2 +8 * 6 + 9 * (3 + (4 + 2 + 9 + 3 + 8) + (8 + 6 + 3 * 9 * 3 + 7) + 4 + 2) + (5 + 4 + 6) +2 + ((7 * 4) * 9 * 8 + 2 * 8) +6 + 2 * 8 * (5 * 9 * 7 * 9 + (3 + 2 * 9 * 8 * 6 + 7)) * 7 * 6 +9 * 6 * 9 * 8 + (2 + (7 * 4 + 6) * 8 + (3 * 7 + 3 + 4 + 2)) * 7 +5 * 9 * 8 * 2 + 7 +9 + (2 * 6 * 6 * 3) + 7 + 4 + 3 +(9 * 6) * ((5 + 3) * 5) + 2 + 3 + 6 * (6 * (8 + 6 + 2 * 2 + 9 + 8)) +((2 + 5 + 6 + 2 + 5 + 9) + 4 * (5 + 7 * 5) + 2) * 3 + 9 * (6 + 9 * 8 * 7) + 7 +2 * 9 + (4 * (3 + 7 + 3) * 4) + 5 + 9 +((9 * 4 * 4) + 3 + 2 + 3) + 8 + ((7 * 6 * 5 * 2 * 9) + (9 * 6 + 8 + 3 * 8 + 4) * (6 * 8) * 6 + 8) * 5 + 6 +2 * 8 + 5 + 4 +6 + (6 + 6 + 6) + 3 * 4 +6 + (7 + 4 * 9 * 2 + 7) + 7 + 3 * 2 * 2 +(7 * 7 + (3 * 6 + 4 + 9) + (5 * 5 * 7 * 7 + 4 + 6) * (4 + 9 + 7 * 5 * 9)) * 2 + 8 + 3 * 8 +4 * (5 + 5) + (8 + 5 * 4) + 7 * (5 * 6) +9 + 4 * 4 * 3 + 6 + 3 +5 + 5 * (6 + 6 * 5 + (3 + 5 * 6) + (2 * 9) + 2) * 6 + 8 + 5 +5 * 8 * 8 * 5 * 3 + 2 +6 * 2 + 3 + 7 + (6 + 4) + 3 +(5 + 7 + 6 + 5 + (9 * 5 + 5 + 6) + 8) + 3 * 6 * 9 * 6 +(8 + 2 * 7 * 2 * (8 + 9)) + 7 * (4 + 4 + 5 * (8 * 9 * 8 + 4) * (8 + 8 * 5)) * 8 +8 + ((4 * 8 * 8 * 7 + 6 + 9) + 5) + 9 * 4 +((4 * 8 * 5) + 6 + (8 + 4 * 5 + 2) * 5 * 8) + 6 * 3 +8 * ((2 * 9 * 9 * 7 * 2) + 4 + 8 + 2) +2 * 9 + (9 + 6 + 7) * ((8 * 3 * 3 * 7 * 3 + 9) + 4 * 4 + (8 * 7 * 6 * 3) * (6 * 5 * 2 + 6 + 3)) + (2 + 9 + 9 * 5 * 7) +(4 + (9 + 3 * 6) * 8) + 2 +7 + 5 * (3 + 7 * 3 + 7 + (4 * 7) + 3) + 4 * 9 +(3 * 7 * 9 + 7) + 6 * 6 + 7 + (9 * 3) * 7 +6 + (9 + 5 + (9 + 9 * 9 + 8) + 2 + 5 * 9) +9 * 4 +3 + 8 + (4 + 2 + 3) + (7 * 9 * 9 + 3 * (4 + 5 + 3 + 4 * 3) + 8) * 8 * 9 +7 + (7 + 9 * 2 * 2 * 5) +8 * ((5 * 8 * 7 + 5) * 6) * 7 * 5 * 8 +7 + 6 * 6 * 6 * 5 * (4 * (2 + 6 + 6 * 3 * 7)) +((8 + 2 + 2) * 2 * 4) + 5 + (8 + 8 + 2 + 4 * 8 + 9) + 9 +(2 + (5 * 3 * 2 + 3 + 5 + 6) * (5 + 8 + 5 + 3 + 2) + (3 + 3 + 9)) + 9 +(6 * 2 + (3 + 3 + 3 * 6 + 8)) * (6 * (4 + 9 * 9 * 9) + 6) * 4 * 2 +7 + ((9 + 3 * 6 + 4) + 4 * (3 * 9 * 7 * 2) + 2 + 7) * (2 + (5 + 8 + 7) * 9 * (6 * 2 + 3 * 7) + 3) +9 * (7 + (6 * 7 * 2 * 3 + 7) + 4 + 4) * 9 * 7 + (2 * 6) + 8 +6 * (5 + 5 * 5 * (6 * 3) + 6) +7 * 8 * 7 * (9 + (4 + 3 + 9 + 3 + 9)) * 9 +(9 + 6) + (2 + 8) * 9 * 3 +(3 * 9) * 3 * 6 * 5 * 9 +8 * 2 + (7 * 6 * 6) +(9 + 4 * 3 * 9 * 4 + 3) * 3 +2 * ((4 + 9 * 4 + 3 * 9) * 9) + 2 + 2 +8 + 2 * 7 + (4 + 8 * 6) +7 * ((7 + 8 * 9) + 4 + 4 + (7 + 4 + 7 + 5) * 3 + (6 * 9 + 2 * 9)) * 8 + (5 * 7 + (3 + 7 * 3)) +3 * 9 + (3 + (9 + 8 + 4 * 5) + (4 + 2 * 2 * 4)) * 2 + 3 +(5 + 3 * 5) * 8 * 9 * 5 + 2 * 2 +(3 * 4 + 8 + 2 * (7 * 8 * 8 * 9 * 3 * 3) * 7) + 7 + 4 * 7 * 7 +2 * 6 * 6 + (6 * 7 + 8 * 8 * (5 * 9 * 3 + 2 * 2 + 4) + (4 * 5 + 7 + 2 * 8 + 6)) + (9 * (5 + 6 + 4) * 9 * 8 * 8) * (4 + 8 + 7 + 6) +(2 * (6 * 2 * 4 * 7 * 4)) + 4 * 7 * 5 +9 * 7 + 2 + (4 * (4 * 5) * 3 + (2 * 3 + 4 * 4) * 9 * 6) +6 * 6 + (8 * 3 + 5 + (8 + 6 * 2)) * 6 + (7 * 3 * (8 * 8 * 2 * 3) * 7 * 5 * 8) +5 + 2 + 9 +7 * 9 + (8 + 3 + 9) * (3 + 8 * 7) +(7 * 9 * 3 + 8) * (8 * 9) + 7 * 8 * 9 + (2 * 3 + 6 * (6 * 2 * 7) * (2 * 7 + 6 + 8 + 4) + 8) +2 + 2 + 4 * (8 + 2 * 8 + 2) + 5 * 8 +2 * 6 * 8 + (6 * 7 * 2 + 9 + 9) +4 + (3 * 5 + 6 + (9 + 2 + 9 + 4 * 7) * 8 + 7) +9 + ((5 + 2 * 8) * 6 + 9 * 5) +6 * ((2 * 2 * 7 + 8 * 5) * (7 * 7 + 3 + 5 + 6) + 8 * 3) + 9 +2 * 5 + ((5 + 5 * 9) + 5 + 6) * 6 +5 * 5 + 7 * (2 * 9 * 2 * 5) +5 + 2 + 3 * (5 * 5 + (3 * 2) + 8) +(5 + 7 * (4 + 2 + 5 + 7 + 6)) + 9 * 9 * 5 + 4 * 2 +(6 + 8 * 8 + (4 + 5 + 9 * 6 * 9 * 7) + (2 + 7 * 3) + 2) * 5 * 7 +9 * 5 + ((3 + 7 * 7 * 3 + 3) * 6 * (5 * 5 + 8 + 9 * 2 + 7)) + 8 +(5 + (5 * 3 + 5) + (3 * 8 * 7) + 2 * 5 * (8 + 2 + 5)) + 7 * 5 +7 + ((2 * 4) * (3 + 2 * 8 * 3 * 8) * 5 + (9 + 7 + 6 + 3 + 7 * 9) * (4 * 4 + 6 + 9 * 7) * 4) +2 + (8 * 2 + 8 * 4 + 3 + 3) * 9 * 6 + 9 + 2 +8 + 3 + ((3 * 9) * 4 + 6 * (2 * 3 * 3) + 2 + 5) +3 * (7 + (2 * 5 + 7 * 6) * 6 + 9 * 3) + 7 * (3 + 2 + 4) + (5 * 4) + 9 +((2 + 6 + 4 + 4 * 9) * 2 * (4 + 8 + 4) * 7 + 2) * 3 * (6 * 6) +5 * 4 * (2 * 9) +(3 + 4 * 3 + 4) + ((9 * 2 + 2 + 8 * 8 * 9) * 7 * 7 * (7 * 8 + 3 * 2) * (8 + 2 * 7 * 7 + 7 + 7)) + 8 + ((2 * 4) + 8 * 2 + 2 + 3 + 2) +8 + ((8 * 2 * 2 * 5) + 2 * 8) +9 * ((6 * 8 + 9) * 8 * 7 * 2) * 5 * 3 * (7 * 8) + 6 +(3 + 5 + 8 + 7 * 2) * 2 + 8 * (5 * (3 + 3 * 9 * 3 * 9) * 9 + 5 * (2 + 5 + 8 * 3)) + 4 * 3 +(8 + (6 * 5 * 9 + 3 * 3) * 5) + (4 * 3 + 7) +5 + 6 + 3 + 6 + ((5 + 4 * 2 + 7 * 8 * 3) + 5) +6 * 4 + (2 * 6 * (5 * 4 + 7 + 9 * 5) + 9 * (5 * 7) + 6) * 7 * 8 +5 * 7 * ((7 * 6 * 8) + 5 + 8 * (3 * 3 * 4 * 2 + 7 + 4)) * (9 * (5 * 8) + 3) * 3 +4 + ((7 * 6 * 4 + 3 + 6 + 8) * 7 * 4 * (6 + 3 * 5)) +9 * 8 +((5 * 5) * 7 * 4 * 2 * 9 + (7 * 6 + 6 + 7 * 7)) + 8 * 7 + 6 +3 + (5 * (2 + 4 * 4 + 4) + 5) * 4 + 2 +(4 + 3 + 4) * 3 * 7 + (2 * (6 * 3 * 7 * 8) * 8) +(4 * 9 + 3 * 2 * 5) * 5 + (5 * 4 + 2) +8 + (2 + (2 + 4 + 2) + 8 + 7 + 6) + 9 + 3 * (7 * 4 * 6 + 7) +9 * 7 +9 + 7 * 6 +6 + 7 * 3 + 5 + ((4 * 6 + 9 * 6 * 6) * (8 + 8 + 2 + 8 + 6 * 5)) + 9 +3 * 6 * 3 * (4 + 8 * 6 + 5 * 7) + 8 +7 * (8 + 2 * 6 + 4 * 2) * 7 + 8 * 5 +7 + ((6 * 2 * 9 * 7 * 5 + 5) * 2 + 7 + (3 + 3 + 5 * 6) * 2) * (6 + 8 * (8 + 4 + 4 + 7 * 4 + 9) * 6) * 4 * 3 +6 + 5 * (9 + 2 * 7 + 7 + 4 * 9) * 2 * 8 +3 * 5 + (7 + 5 * 2 + 2 * 8) + 9 * 2 +8 * 8 * 4 + (3 + 7) +(2 * 8) * 2 + 7 * 6 + 5 * (7 + 4) +8 + 5 + (2 + 3 + 7 * 7 * 8 * 2) + 2 + 8 * 6 +(5 * 7) + (7 * 4 + (2 + 9 + 7 * 8) * 7 + 2 * 5) * 2 * (7 + (3 * 7 * 6) + (8 * 6 * 6 + 6)) + 8 * 9 +5 + 9 + 6 * 6 * 8 * (5 + 7 * 8 * 2) +((6 + 2) * (6 + 5 + 5 + 6 + 9) + (4 + 2 + 8 + 9) + (4 + 9 + 6 * 3 + 4 * 9) + 6) + (4 + 2 + 2) +(7 + (4 + 8 * 4 * 9)) + 6 + 8 +9 * 7 + 4 * (6 + 4 + (4 * 4 * 3 + 9) * 9 + 8) + (3 * 5 + (3 * 5 * 6 + 6 * 2 + 4) * 7 * 3) + 8 +6 + 9 * 8 * ((4 + 7 * 9 + 8) + 7) + 7 * 7 +5 * (9 + 9) +(5 + 5) + 2 + 7 * (7 + 5) + 6 +4 + 3 * (8 * 7 + 4 * 3 * (2 * 9 * 4)) * 5 +((6 + 5) * 5 * 6) + 8 + 7 + 4 +9 * 9 + (6 + 6 + (7 * 6 + 2)) +9 + 4 * 6 * 9 + 9 +4 * 9 * 8 + (5 + 5 * 8) + (2 * 6 * 7) +9 + 8 + ((9 + 4 * 6 + 3) * 8 * 8 * 4 + (7 * 5 * 9 * 9 * 4 + 4) * (4 + 6 * 7)) + 5 +5 * 7 * (6 * (2 * 2 * 9 * 3)) + 2 * 7 * 5 +9 * (6 + 7 * 7) * 3 * 2 + 4 +(2 * 3 + (7 * 3 + 7) + 6 * 3 * (4 + 7 + 6 + 2 * 9 * 5)) + 9 * 4 + 2 +9 * (4 * 6 + 8 * (4 + 4)) +(8 * 4 * 4 + 6 + (8 + 9 * 4 * 7 * 3) * 4) * 7 * 4 * 8 + (4 * 3 * 6 * 5) + 5 +(3 * 4 * 6 * 6 + 3) * 6 +9 + (5 * 8 * 8 * (2 + 2 + 7) * 8 * 5) +((5 + 4 + 2 + 9 + 2 * 8) * 2 * 2 + 4 + 7) + 2 + 6 +(5 + (9 * 5 * 9 * 9) * 3 * 7 + 2 + 9) + ((5 + 4) + 4 * (8 + 3 + 4 + 8)) * 6 + 4 * (5 * 3 + 9 + 6) + 6 +((8 + 4) * (4 * 9 * 8) * 7 + 4 + 5 * 6) + (8 * 9 * 4 * 2 + 2) +(8 * 7 + 8 + (6 + 2 + 4 + 8 * 4 * 8) + 7 * 4) * (6 * 2 + 6 + 2 + 3) + ((5 * 8 * 8 + 7 * 5 + 3) + 8 * (6 + 6 * 4)) +5 * 8 + (4 * (3 * 9 * 5 * 5 + 5)) * 7 + 3 +5 * 8 + 3 + 4 +3 + ((9 + 3 + 6) * 4 * 9 * (9 + 8 * 3 * 6) + 7 + 2) + 4 * (5 * (9 * 2 * 2) * 9 * (6 * 8 + 4 * 8)) +((2 * 5) + 5 + 4 + 9 + (4 + 5 * 4) * 6) * 8 + 3 +5 + 7 * (9 + 6 * 7 * 5) +7 * (5 * 3) + 7 * (7 + 6 + 8) +(5 + 7 * (8 + 8 * 3 * 7 * 6) + (6 * 4)) * 2 + 9 +8 * (6 + 5 + 6 + (3 + 7 * 3 + 9 * 8 * 6)) +(6 + 5) + 9 + (8 * 7 + 8) + 4 +6 + 2 + 4 * ((2 + 2 + 5) + (5 + 2 + 6) * 4 + 2) * 5 * 4 +8 + 6 +(6 + (4 * 5) + 8) * 8 * 6 + 2 * 2 + 7 +7 + 4 + ((2 + 7 * 2 + 9 + 9 * 7) + 5) + (9 * 8 + 4 + 7 + 8) + 5 +4 + 2 * 2 * 6 + 7 * ((7 * 2 + 3) + 7 + 6 * (8 + 4 + 2 * 6) + (9 + 7 + 3)) +(4 + 8 * 7 * 8 + 9 * 8) + 6 * 6 * ((9 + 2 * 2 + 7) * 3 + 3 * 9) +6 + (3 + 2 + 2 + 4 + (5 + 9)) * 8 + 4 + 7 +((5 * 4 * 7 * 9) + 7) + 7 + 4 * (8 * 7 * 3) + 3 +5 * (6 * 8) + (3 * 7 * 3 * (8 * 9 + 6 * 2) * 9 + 3) * 7 +6 * 5 + (7 * 4 * 2 * 4 * 6) + (5 + (3 + 3 + 9 + 9 * 4 * 6) + 2 + 9 * 9 * (8 + 5)) +4 * 5 * 5 * 3 + 5 +2 * 6 + (2 + 7 * 6) * (7 + 3 + 3 * 3 * (6 + 7) * 7) + (4 + (8 * 7 * 6) + 4) * 9 +3 * 9 + (8 * 4 + 8 * (6 + 7 * 3 * 3) * (6 + 8)) +2 * 6 * (9 * 6 + 8) + (2 + 3 * 7 * 4 + 3) * 2 * ((8 + 6 * 5 + 8) * 5 + 4 * 8) +6 + 3 * (6 + 3 * 7) + 8 + 7 * 3 +8 + 3 * (3 + 4 * 5 + 6 + 8) + 7 + 5 * 2 +2 * (2 + 7 + 4 + 6) + (4 * (9 * 9) + 8 * 8 + 5) + 7 * 5 * 7 +7 + (5 + (5 * 8 + 2 + 7 * 4) + (9 * 9 + 4 * 3 * 5 + 4) + 4 + 5 * 3) +(8 + 2) * 9 * 6 * 7 +3 * 5 + 5 * ((4 * 3) + 3 * 3 + 8) + 5 * 5 +4 * 7 * 6 + 4 + (4 * (4 * 5) * 3 + 2 + 8 * 4) +2 + 7 * (2 + (7 + 6 + 8 + 3 + 4) * (7 * 9 + 8 * 9) * (2 + 5 * 3 + 9 + 2 + 9)) +6 * (6 + 2 + (8 * 3 + 7 * 5 + 6 + 6) * (4 + 2 * 6 + 5) + (7 * 8 * 8 + 8) + (9 + 4 * 8 * 3 + 4)) * 3 +(6 + 9 + 8 * 6 + 8) + 4 * 7 + 2 + 5 +(9 * (2 * 9 + 8 * 5 * 2 + 3) + 9 * 7) + (6 + (7 * 6 + 9 + 9)) +6 + 6 + (2 + 7 * (5 * 3 + 3) * 7 + (2 + 6 + 8 + 3 * 8 + 4) * 2) * 5 + 5 * 4 +(6 * 7 * 6) * ((4 + 4) + 2 * 6 + 2 + 3 * 8) * 4 * 2 * 7 * 9 +9 + ((3 + 6 + 6 + 2 + 3) * 5 + 6 * 6 + 3 * (4 + 4 * 8 + 4 + 5 * 2)) * 5 * 7 +8 + (7 * 4 * 6 * 4 * 8) * ((4 + 6) * 5 + (9 * 6) + (7 + 9 + 3) * 2) * 5 * (2 * 5 * (2 * 4 * 8 * 5 * 4 * 3) * 9 * 3) + 5 +(7 + 2 + (6 * 7) * 5) * 3 +3 + 5 * 9 + (9 + 9) * 3 +9 * 3 + (9 * 4 * 9) * 8 * 3 +4 * 4 + 6 + (7 * 8 * 6 * (8 * 6) * 6) +(6 + 5 * 7 + 3) + (4 * 8 * (5 * 7 + 9 + 9 + 2)) + 5 +2 + (2 + 9 * (4 * 7 * 3 * 3) + 8) + 9 * 9 + (6 + 9 * (4 * 5 + 6 * 6 + 8)) * 5 +9 * 7 + 9 +7 + 7 * 7 * (5 + 5 + 7 * 7) * 6 +2 + 2 + (6 + (8 + 6 * 9 + 9)) +(7 + 6 + 3 * 3) * 8 +8 + (7 + 9 + 9 * 2 * 5 * 3) + 5 * 7 + 3 +5 + 8 * (5 + 2 * 7 + 4 * 4) + ((8 * 8 + 2 + 5 + 5) * 9 * 3 + 9 * 6 * (4 + 7)) * 2 +8 * 5 * 3 + 2 * (8 * 8 + 8 * 9) + (5 * (9 + 3 * 2 + 7 + 3) * 2) +8 + 4 + 2 + 4 + 8 * 4 +9 + 2 * 8 + 8 * ((2 + 8 * 2) + 2 + (8 * 4 + 7 + 7 + 9)) + 9 +7 * (9 + 6 + 8 * 7) + 5 + (8 * 7 + (4 + 3 + 9 * 6) + 9 + (5 * 7 + 5 + 6 * 2 + 2) + 2) * 4 +7 + (9 * 7 + 5 * 9 + (4 + 9 * 2 + 8 * 8 + 3) * 9) +(5 * 9) + 9 + (7 + 5 * 2 * 2) * (2 + (8 + 4 + 5 * 5 + 2)) * 6 + 6 +9 * (9 * 3) * 2 + (2 + 3 * 6 * (8 * 4) * 4) + (9 + 8 * 3 * (7 + 6 * 7 * 6 * 5) + 3) +6 * 9 * (9 + 9 * 9 * (3 + 2 * 9 * 6 * 6) + (4 + 8) * 3) * 4 + 7 +(8 * 4 + 8 * 3 * 7) + ((9 + 9) + 3 * 3 * 5 + (3 * 7 * 3 * 9 + 4)) + 9 + 9 + ((9 * 6 * 7) * 9 + 8 + 9 * 8) + 9 +(3 * (3 * 2) + 5 + 9) * 6 + 5 * 3 +(5 + 5) + 5 * 8 * 3 * 3 * (9 * 9 * (4 + 5 + 9) + 4) +3 * 8 + 9 + 8 + (6 + (9 * 3 + 7) + 9 * 3 * 6 * 2) + 6 +3 + 9 + 3 * 5 +5 * 7 + 4 * (2 * 7 * 7 * 5 * 7 + 9) * 4 +8 * (3 + (8 * 7 + 8 + 6 * 5 + 5) * 4) +9 * 6 * (8 + 6) * 5 + 7 * 6 +(8 + 2 + (4 * 9 * 9 + 3) + 5) + 4 +(9 * 7 + 3 + 8) * 3 * 5 + 9 + (2 * 9 + 7 + 8 + 8 + 5) +3 * (8 + 9) * 6 +4 + 6 + 6 + ((5 * 5 * 2 + 9 + 7) + 6 * (6 + 4 * 8 * 9 + 8) * 4 + 9 + (9 + 4 * 5)) + 7 +8 + 8 * (9 + 8 * (2 * 7)) + 6 * 9 +(3 + (8 + 2) + 8 + 8 * 6) * 5 +(9 * (2 + 3 + 3 + 5) * 8 * 7) + 6 + 9 + 6 +(8 * (7 * 5)) + 6 * 6 * ((3 * 8 + 7 + 2 * 7) + 6 * 3 + 6 + 9 * 9) * 4 +(6 * (4 + 3 * 3 * 9 * 3 + 6) + (7 * 7 + 6) + 8 * (3 + 2) * 5) + 4 +(5 + 4 * 3 * (8 * 6) * (3 + 6 + 3) + 7) + 8 + ((3 * 7) + 9 + (7 + 4)) * 3 +(9 * 5 * 4 * 6) * 6 * 2 + ((8 + 6 * 5) + 4 + 5) * 9 +(3 * 8 + 8) * 9 + (8 + 4 * 7 + 8 + 7 + (7 + 8)) +6 + ((8 + 9 + 9 * 9) + 2) * 5 + 7 +2 + (8 + (6 * 9 + 6 + 2 + 3 * 8) + 6 * 9 + 3) + 9 + 2 +6 + (5 + 3) * 3 + 9 * 3 +9 * ((9 + 7 * 2 + 5 * 7 + 2) * (9 * 5 + 6)) + ((9 * 7) + 4) * 3 +9 * (6 * 6 + (5 + 7 * 6) * (5 + 3) + 4 + 9) * 5 +(9 * 7 * 9) + 5 * 9 * 8 +7 * ((8 + 9 + 5 * 2 * 2) * 5 * 5 * 8 + 4) * (5 * 7) + 9 * (7 + (8 + 2)) +(3 * 6 * 6) + 7 + 2 + (9 * 2 * 4 + (5 * 8 + 8 * 6) + 8 + 6) * 9 +3 + (6 + 7 * 5 + 4 * 6) * 5 * 4 * 2 * ((3 + 3) * 9 + 9 * 5 * 4) +5 * (5 + 2) * 6 + (4 * 6) + 4 + 9 +(6 + 9) * 2 * 2 + 2 + (3 + 9 * (3 * 7 + 6 + 7 + 9 * 2) + 9 * 5 * (9 + 2)) +9 + (2 + 3 * 8 * 3 + 8 + 8) + 8 +8 * (3 + 4 + 9) + 5 + (2 + 4 + 3 * 4) +(2 + 6 + 4 * 9) * 9 * 3 * (5 + 5 * 9 + (6 * 5 + 7 * 6) * 8 + (7 + 7 * 8 * 8 + 8 + 6)) +6 * 6 * 6 + ((3 * 5 * 6 + 8 + 3 + 7) + 5 * (2 + 3 + 5 * 9 * 5) * 2) + (9 * (7 * 9 + 9) + (8 + 3 + 9 + 5 + 6) + 5 + 9) * 7 +((4 * 3 + 9 * 7 + 3 * 9) * 5) * 5 * 6 * 6 + 7 +((6 * 3 + 8 + 6) * 6 + 4 + (6 + 5 + 6 * 5 + 8 * 2) * 7 + 2) * 9 * 6 +9 + 5 * 2 * (8 + 8 * 9 + 7 * (4 * 8 + 2)) + 8 * 5 +(4 + 7 * 4 * 4) + 5 * 4 * 2 +(8 + 3 * 3 * 6 * 4 * 7) * 7 * 3 + 8 +3 * 8 + (5 + 7 * 7 + 6 * (4 * 6 * 6 * 9 * 6 + 5) * 2) * 7 + 6 * 7 +5 + 2 + (7 + 9 * 3 + 8 * (2 * 4 + 4 * 3 * 9)) * 5 * 9 + (5 * 7 + 6 * 2 + 5 + 9) +9 * 3 * (6 * 7 * 7) * 2 +3 + 8 * (2 + 6 + (8 + 8 + 9) * (3 * 5 * 6 + 7 + 2) + 2 * 9) + 4 * 7 +4 + (7 + 9 * 8 * 7) * (9 + 7) * 7 + 6 * 3 +(5 + 4 * 4) + ((8 + 9 + 4 * 9 * 5) * (3 * 3) * 8 + (6 + 5 + 8 * 7)) * 9 + 8 * 8 +6 + (4 * 9 * 2 + 2 * 2 + 6) + (9 * 7 + (6 + 5)) * (7 * (2 + 5) * 9 + 7 + 5) * 4 +(2 + 4 * 7 * 7 + (2 * 7) + 8) + 5 * 6 * 9 +7 + 7 + (5 + 5) + 7 * 2 +4 * (9 * 5) * 5 * (8 + 4 + (4 + 3) + 3) +4 * ((7 + 5) + 3 * 4) * 5 * 2 + 6 + 3 +(7 + 3 * 2 + (4 * 2 * 5 + 9 * 5) + (8 * 2 + 5 + 9 + 8) + 7) + 8 + (7 + 9 + (4 + 9) * (9 + 6 + 2 + 8) + (4 + 2 + 8 + 9)) + 3 * (9 * 7 * 3) +5 * (6 * 6 * 8 + 6) * 4 + 9 +(4 + (7 * 7 + 2 + 8 * 3 * 3) + 9 + 4 + (9 * 2) + 6) + ((2 + 7 * 2) * 5 + 3) * 8 + 8 +2 * 5 * (6 * 6 + 4 + 5 * 2 + 9) + 5 * 7 + (5 + 8) +9 * (3 * 9 + (8 + 5) + 6 + (6 * 7 * 9 + 3 + 8 * 4) * 9) + (6 + 3 + 9 + 9 * (5 * 3 + 8) * 8) +(6 * 9 * (6 + 5 * 2 + 8 + 9 + 8) + 5 + 6) + 4 +(3 + 5 * 9) + (8 * 2 * 4 + 3 + 9 * 3) * 7 +((3 + 2 * 9 + 7 * 9) * (9 * 7 * 3 + 5 + 6 * 3) + 6 * 8 * (8 + 9 + 9)) * (7 + (7 * 3) * 9 * 3 + 5) * 5 +((9 * 7) * 2 + 5 + 4) + (2 + 5 * 5) +(3 + 6 + 2 * 7) + 6 + 6 +9 * ((4 * 6 + 4 + 5 * 7 * 9) + 9 + 9) + 5 +6 * 8 * 4 + 9 + 4 +5 + (9 * 5) * 6 + (3 * 4 + 7 * 7 + 7) + 7 +(8 * 6 * 8 * 3 * 8 + 7) + 4 + 4 * (4 * 6 * (9 + 5 * 2) + 5) * (4 + 5 * 6 + (6 * 4 * 6 * 5) * 8 + (4 + 5 * 2)) +3 * 8 + 8 +5 * 8 * (9 + (8 + 2 + 4)) +9 + (2 * 5 * 9 + 2) + 3 +(2 + 6 + (3 * 6 + 2 * 4 + 4) * 3 * 7 + 6) * 6 * 6 + 6 +((9 + 3 * 7) + (2 + 8)) * ((2 * 3 + 3 + 4) * 8 + 5 + 9 + 3 * 9) +(3 * 9 + 3 + 6 * 8 * 7) * 3 * 5 + ((6 + 8 + 4) + 8 * (7 * 4 + 6 + 5) * 3 * 9) +9 * 4 + 7 + (8 + (4 + 6 * 6 * 7 + 9) * 7 + 4 * (5 + 7 + 7) + 2) * 4 * 5 +2 * 7 + ((6 + 4 + 3) + (8 * 8 * 7 + 2 + 4) + 3 * 9 * 9 + 7) +4 + 6 * 2 + 8 + (6 * 9 * 6 + 6) * 9 +3 + 3 * 8 + 9 * (7 + (2 + 8 + 5 + 5) * 7 + 3 * 2) * (7 * 7 + 7) +9 + 4 * 9 * 2 * (4 * 9) +9 + 4 * 5 + (4 * (2 * 8 * 5 * 7 * 8) * (3 * 8) + 6) + 3 * 4 +7 + 3 * (8 + 7 * 9 * (2 + 9 + 4) * (3 + 5) + (7 * 9 * 2 * 8 + 9 + 8)) * (9 * (2 * 7 * 9) + (6 * 8 + 9 + 7) + 3 + (2 + 3 + 4) + (5 + 8 + 4 * 9 + 7)) +3 * 9 + 4 * (7 * (5 + 4 + 9 * 3 + 3 * 4) + 6 * 6) +3 + (8 + 8 * 9) + 9 + 5 * (7 + 4 * 3 * (7 * 4 + 2 + 8 * 4)) +(8 * 2 * 4 * 6 + 4) * 5 * 9 * (8 * 5 * 5 + 7 + 8 + 5) +2 + (5 * 2 + (2 * 8 * 3 * 2) * 5 * 5) + 4 + 9 + 2 +7 + (5 + 5 * 3) +4 * 6 * (5 + 2 * 3 * (3 + 8 * 3)) + 9 * 4 +2 * 7 * (8 * (2 * 3 * 8 * 8 * 5) + 2 + 2 + 5) * 7 +2 + ((5 + 2 * 8 * 3 * 4 * 7) + 4 + 3 + 5 * 5 + (5 * 8 + 6)) +3 * 7 * ((9 + 8) * 8 * 3) + (9 * (8 + 8 + 2)) * 9 * 9 +5 + (5 * (7 + 8 * 2 * 9) * (7 + 5 + 2 + 5 + 4 + 2) * 4 * 7) + 2 + ((6 * 7 * 2 + 9) * 6) * 9 +6 * 6 + (2 + (6 + 4) + (4 * 8 + 2 + 6) + 8 * 3) +2 * 3 + 5 + ((7 * 8 + 8 * 5 * 8 * 9) + 2 * 4 + 2 + 8) +(8 + (9 * 9)) + (6 + 2 * 7) +2 + 5 + 4 + 8 + 4 +8 + 2 + ((5 * 5 + 5) + (6 * 8 + 6 * 3) * 8) * 7 + 6 +9 * ((2 + 5) + 2 + 8 * (5 + 7 + 5 * 3) * 6) + 9 +9 + 6 + ((9 * 7 * 7) + 5 * 9 + 8 * (4 * 9 + 3 + 3) * 5) + 7 * 2 +(3 * 3 + 5 + 6 + 5 * 5) + 8 * 4 * 4 + 2 +7 * 2 + 3 + 9 * 4 + 4 +5 + (2 + 9) + 5 + 3 + 8 * 6 +9 * 3 + 5 + 3 * (6 * (4 * 8 + 6 * 9 * 9 + 6) * 7 + (9 * 2 * 3 + 7)) +7 * 8 + 3 + (7 + 3 + 9 + 7 * 2) + (9 + 6 * 3 * 3) +((9 * 7) + 2) + 9 * (4 + 4) +((9 + 5) * 2 + (2 + 4 * 4 * 3 + 9 * 9)) + (7 + (7 * 6 + 4) + (9 + 7) * 9) + 8 + 9 +4 + 7 * 3 + 2 * (7 + 2 * 8 + 9 * 3 * 3) +5 + 3 +(2 + 3 * 5 * 6 * 2 * 2) + (8 * 8 + 3 * 3 + 7 * (7 + 3 + 9 * 8)) + 7 + 5 +(7 + 3 * 5) * 7 +4 * 6 + (6 + 7 + 9 * (3 + 4 * 4) + 3 + 2) * (6 + 8 * 9 * 6 * 5 + (2 * 5 * 8 + 8 + 5 * 2)) +8 * (7 + 5 * 8 * 7 + 6) * ((4 + 5) * 9 + 9 * 2 * 7) * 5 + 8 +6 + 8 * 5 +(8 * (7 * 4) + 5 * 9 * 9 + 3) * 7 +8 + 5 + 7 + (8 + (6 + 5) + 7 + (7 * 9 * 2 * 6 + 4) * 8) * 2 +((4 + 3 * 9 + 9) + 4 * (9 + 2 + 4 + 8 + 9) + 5 + 7 * 4) + 6 * 9 +9 + (9 * 8 * 3) * (8 * 6 * 7 * 8 * 6) +5 * 7 * (9 * 3 + 6 + 8 + 8 + 5) +2 + (2 + 7 * (5 * 7 * 3 + 2 * 7 * 8) + 7 + (5 + 8 * 5)) * 8 * 3 * 3 + ((6 * 5 * 8 + 8 + 9) + 6 * (8 + 3) * 6) +9 * 5 * 9 * 8 +6 + 5 + 7 + 2 + (8 + (5 * 5 * 7 * 3 + 7 + 7) + 2 + 7) +4 + 4 * 2 + 3 * 7 + 6 +4 + (5 + 3 + 2 * 8 * 5) + 2 +2 * 2 * 8 + (6 + 9 * 4 * 7 * (4 + 7 * 7 * 2) + 2) + 9 +4 * 7 * 8 + (3 * (9 * 2 + 4 * 4 * 5 * 5) + 5 * 2 * 7 + 7) + 8 + 5 +(8 + (7 + 9)) * 6 +9 + ((8 * 7 + 5 * 3) + 7 + (6 * 4 * 6 + 8)) * 5 +3 + (6 + 5 * 7 + 4 * 2) * (3 * 3 + 7 * 6 + 4 * (6 + 7 * 3)) * (4 + 8 * 9) +7 * (7 + (4 * 3) + 4 + 5 * 4) +8 * 2 * (9 * 7 + 5 + 8) + 4 * 8 + (3 * 3) +7 * (3 + 2 * 3) + ((2 * 8) * 4) * 8 +((8 + 3 + 4 + 7 * 5 * 6) + (3 + 2) * (8 + 6 * 9 * 4 + 9 + 2)) + 3 + 8 * (8 + (4 + 9 * 2 + 8 + 6 + 9) * 9 * 3 * 3 + 3) + 9 +4 * (7 * 4 * 8 * 5) + 7 * 8 * (2 * 4 * 5 * 4) +(3 + 8 + 6 * 6 * 4) * (4 * 6 + 8 + 3 * 6) * 5 +2 + (3 + (6 + 9 + 6 * 3) * 7 + (9 + 7 + 8)) + 9 * 7 +9 + 7 * (4 * 8 + 3 * 2 * 9 + 4) + ((6 * 8) + 3 + 7 + 7 * 8 * (9 + 5)) * 9 + ((3 * 9 * 8 * 8) + (5 + 2) + 2 * 4 * 3 + 8) +6 * 3 + 3 * (8 * 7 + (2 * 8 + 4 + 6 + 5 * 6) + 3 + 3 * (9 * 9 * 8 + 2 * 5)) + (3 + (3 + 5 + 6) + 8 + 9 * 4) + 8 +9 * ((7 * 6) * 9 * 2) * ((8 * 9 * 3 + 8 * 2) * 6 + 8 + 9 * 5 + 3) + (5 * 4) * (7 + 4) * 7 +(4 * 7 + 8 * 9) + (7 + (3 + 9 * 2 * 9 * 4) * 9 * 3 * 4 * 7) * 4 * 6 + 2 +6 + 9 * 6 + (2 + 9 * 4) * 8 +3 * (6 * 5 + (7 * 6 * 5 * 8) + 7 * 5 * 4) + (3 * (6 * 5 + 7 * 9) + (4 * 9 + 2 * 3) * 7 * 8 * 3) + 9 + 5 + 9 +3 + (2 + (6 * 3 * 8 + 3) + 4) * (8 * 9) * 7 + 6 +(2 * (7 * 9)) * 6 + 7 * 2 + 9 * 4 +((5 + 4 * 2) + (3 * 2 * 6 + 3 + 5 * 5) * 4 + (2 + 5 * 9 * 8 + 3 * 5) * (7 * 2 * 8 * 2) + (5 * 4)) + 7 * 8 + 9 +(8 + 4 + (5 * 4 * 6) * 2 * 8) * (6 + (9 * 4 * 5) * 7 * 5 * 4) + 3 + ((2 + 2) + 7 + 5 * 7 * 2 + 4) * 5 + (9 * 3 * (9 + 3 * 4 * 8 * 7 + 9)) +6 * 7 * 3 * (7 * 2 + (6 * 4 * 5) * (5 * 3 * 8 + 8 + 3 + 9)) * (7 * 9 + 7 * 5) +4 + 2 + (3 * (9 + 7) * 6) +(8 + (8 * 4)) + (7 + 3 * 5) + 4 + 4 + 7 +(7 + 7 * 4 * 4 * 4) * 4 + 3 \ No newline at end of file From 7b97178ded733b0aa9eab1a083a206213976b988 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 18 Dec 2020 17:55:58 +0100 Subject: [PATCH 057/110] refactor(day18): implement tokenizer --- day18/calc.ts | 15 ++- day18/calcToken.spec.ts | 30 +++++ day18/calcTokens.ts | 27 +++++ day18/solution.spec.ts | 50 +++++++++ day18/tokenize.spec.ts | 241 ++++++++++++++++++++++++++++++++++++++++ day18/tokenize.ts | 63 +++++++++++ 6 files changed, 420 insertions(+), 6 deletions(-) create mode 100644 day18/calcToken.spec.ts create mode 100644 day18/calcTokens.ts create mode 100644 day18/solution.spec.ts create mode 100644 day18/tokenize.spec.ts create mode 100644 day18/tokenize.ts diff --git a/day18/calc.ts b/day18/calc.ts index 85c226a..80da934 100644 --- a/day18/calc.ts +++ b/day18/calc.ts @@ -1,10 +1,10 @@ -const isNumber = (s: string): boolean => /^[0-9]$/.test(s) -const isSpace = (s: string): boolean => /^ $/.test(s) -const isOperator = (s: string): boolean => /^[+*]$/.test(s) -const isOpeningParenthesis = (s: string): boolean => /^\($/.test(s) -const isClosingParenthesis = (s: string): boolean => /^\)$/.test(s) +export const isNumber = (s: string): boolean => /^[0-9]$/.test(s) +export const isSpace = (s: string): boolean => /^ $/.test(s) +export const isOperator = (s: string): boolean => /^[+*]$/.test(s) +export const isOpeningParenthesis = (s: string): boolean => /^\($/.test(s) +export const isClosingParenthesis = (s: string): boolean => /^\)$/.test(s) -const findClosing = (expr: string, start: number) => { +export const findClosing = (expr: string, start: number): number => { let level = 0 for (let i = start; i < expr.length; i++) { if (isOpeningParenthesis(expr[i])) level++ @@ -16,6 +16,9 @@ const findClosing = (expr: string, start: number) => { ) } +/** + * @deprecated see calcToken + */ export const calc = (expr: string): number => { let a = 0 let op = '' diff --git a/day18/calcToken.spec.ts b/day18/calcToken.spec.ts new file mode 100644 index 0000000..b348e66 --- /dev/null +++ b/day18/calcToken.spec.ts @@ -0,0 +1,30 @@ +import { calcTokens } from './calcTokens' +import { loader } from '../lib/loader' + +const load = loader(18) +const input = load('input') + +describe('calcToken should calculate using the tokenized expression', () => { + it.each([ + ['1 + 2', 3], + ['3 * 3', 9], + ['1 + 2 + 3', 6], + ['1 + 2 * 3', 9], + ['1 + 2 * 3 + 4 * 5 + 6', 71], + ['(2 * 3)', 6], + ['1 + (2 * 3)', 7], + ['1 + (2 * 3) + 4', 11], + ['(2 * 3) + (3 * 4)', 18], + ['1 + (2 * 3) + (4 * (5 + 6))', 51], + ['2 * 3 + (4 * 5)', 26], + ['5 + (8 * 3 + 9 + 3 * 4 * 3)', 437], + ['5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', 12240], + ['((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', 13632], + ])('%s = %d', (expression, expected) => + expect(calcTokens(expression)).toEqual(expected), + ) + it('should solve the puzzle input', () => + expect(input.map(calcTokens).reduce((total, n) => total + n, 0)).toEqual( + 7293529867931, + )) +}) diff --git a/day18/calcTokens.ts b/day18/calcTokens.ts new file mode 100644 index 0000000..b03df49 --- /dev/null +++ b/day18/calcTokens.ts @@ -0,0 +1,27 @@ +import { Token, tokenize } from './tokenize' + +const calc = (token: Token): number => { + switch (token.type) { + case 'op': + switch (token.op) { + case '*': + return calc(token.left) * calc(token.right) + case '+': + return calc(token.left) + calc(token.right) + default: + throw new Error(`Unexpected operation ${token.op}!`) + } + case 'value': + return token.value + case 'group': + return calc(token.group) + default: + throw new Error(`Unexpected type ${token.type}`) + } +} + +/** + * Calculate the expresssion using the tokenizer + */ +export const calcTokens = (expression: string): number => + calc(tokenize(expression)) diff --git a/day18/solution.spec.ts b/day18/solution.spec.ts new file mode 100644 index 0000000..092617a --- /dev/null +++ b/day18/solution.spec.ts @@ -0,0 +1,50 @@ +import { loader } from '../lib/loader' +import { calcTokens } from './calcTokens' + +const load = loader(18) +const input = load('input') + +describe('Day 18: Operation Order', () => { + describe('calc', () => { + it.each([ + ['1 + 2', 3], + ['3 * 3', 9], + ['1 + 2 + 3', 6], + ['1 + 2 * 3', 9], + ['1 + 2 * 3 + 4 * 5 + 6', 71], + ['(2 * 3)', 6], + ['1 + (2 * 3)', 7], + ['1 + (2 * 3) + 4', 11], + ['(2 * 3) + (3 * 4)', 18], + ['1 + (2 * 3) + (4 * (5 + 6))', 51], + ['2 * 3 + (4 * 5)', 26], + ['5 + (8 * 3 + 9 + 3 * 4 * 3)', 437], + ['5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', 12240], + ['((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', 13632], + ])('%s = %d', (expression, expected) => + expect(calcTokens(expression)).toEqual(expected), + ) + }) + + describe('Part 1', () => { + it('should solve', () => + expect(input.map(calcTokens).reduce((total, n) => total + n, 0)).toEqual( + 7293529867931, + )) + }) + + describe.skip('Part 2', () => { + describe('calc (addition is evaluated before multiplication)', () => { + it.each([ + ['1 + 2 * 3 + 4 * 5 + 6', 231], + ['1 + (2 * 3) + (4 * (5 + 6))', 51], + ['2 * 3 + (4 * 5)', 46], + ['5 + (8 * 3 + 9 + 3 * 4 * 3)', 1445], + ['5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', 669060], + ['((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', 23340], + ])('%s = %d', (expression, expected) => + expect(calcTokens(expression)).toEqual(expected), + ) + }) + }) +}) diff --git a/day18/tokenize.spec.ts b/day18/tokenize.spec.ts new file mode 100644 index 0000000..608b518 --- /dev/null +++ b/day18/tokenize.spec.ts @@ -0,0 +1,241 @@ +import { tokenize } from './tokenize' + +describe('tokenize', () => { + it.each([ + [ + '1 + 2', + { + type: 'op', + op: '+', + left: { + type: 'value', + value: 1, + }, + right: { + type: 'value', + value: 2, + }, + }, + ], + [ + '3 * 3', + { + type: 'op', + op: '*', + left: { + type: 'value', + value: 3, + }, + right: { + type: 'value', + value: 3, + }, + }, + ], + [ + '1 + 2 + 3', + { + type: 'op', + op: '+', + left: { + type: 'op', + op: '+', + left: { + type: 'value', + value: 1, + }, + right: { + type: 'value', + value: 2, + }, + }, + right: { + type: 'value', + value: 3, + }, + }, + ], + [ + '1 + 2 * 3', + { + type: 'op', + op: '*', + left: { + type: 'op', + op: '+', + left: { + type: 'value', + value: 1, + }, + right: { + type: 'value', + value: 2, + }, + }, + right: { + type: 'value', + value: 3, + }, + }, + ], + [ + '(2 * 3)', + { + type: 'group', + group: { + type: 'op', + op: '*', + left: { + type: 'value', + value: 2, + }, + right: { + type: 'value', + value: 3, + }, + }, + }, + ], + [ + '1 + (2 * 3)', + { + type: 'op', + op: '+', + left: { + type: 'value', + value: 1, + }, + right: { + type: 'group', + group: { + type: 'op', + op: '*', + left: { + type: 'value', + value: 2, + }, + right: { + type: 'value', + value: 3, + }, + }, + }, + }, + ], + [ + '1 + (2 * 3) + 4', + { + type: 'op', + op: '+', + left: { + type: 'op', + op: '+', + left: { + type: 'value', + value: 1, + }, + right: { + type: 'group', + group: { + type: 'op', + op: '*', + left: { + type: 'value', + value: 2, + }, + right: { + type: 'value', + value: 3, + }, + }, + }, + }, + right: { + type: 'value', + value: 4, + }, + }, + ], + [ + '(2 * 3) + (3 * 4)', + { + type: 'op', + op: '+', + left: { + type: 'group', + group: { + type: 'op', + op: '*', + left: { + type: 'value', + value: 2, + }, + right: { + type: 'value', + value: 3, + }, + }, + }, + right: { + type: 'group', + group: { + type: 'op', + op: '*', + left: { + type: 'value', + value: 3, + }, + right: { + type: 'value', + value: 4, + }, + }, + }, + }, + ], + [ + '1 + (2 * 3) + (4 * (5 + 6))', + { + type: 'op', + op: '+', + left: { + type: 'op', + op: '+', + left: { type: 'value', value: 1 }, + right: { + type: 'group', + group: { + type: 'op', + op: '*', + left: { type: 'value', value: 2 }, + right: { type: 'value', value: 3 }, + }, + }, + }, + right: { + type: 'group', + group: { + type: 'op', + op: '*', + left: { type: 'value', value: 4 }, + right: { + type: 'group', + group: { + type: 'op', + op: '+', + left: { type: 'value', value: 5 }, + right: { type: 'value', value: 6 }, + }, + }, + }, + }, + }, + ], + //['2 * 3 + (4 * 5)', 26], + //['5 + (8 * 3 + 9 + 3 * 4 * 3)', 437], + //['5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', 12240], + //['((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', 13632], + ])('should tokenize %s', (expression, expected) => + expect(tokenize(expression)).toEqual(expected), + ) +}) diff --git a/day18/tokenize.ts b/day18/tokenize.ts new file mode 100644 index 0000000..94f8907 --- /dev/null +++ b/day18/tokenize.ts @@ -0,0 +1,63 @@ +import { + isNumber, + isOpeningParenthesis, + isOperator, + isSpace, + findClosing, +} from './calc' + +type Noop = { type: 'noop' } +export type Value = { type: 'value'; value: number } +export type Group = { type: 'group'; group: Token } +export type Op = { type: 'op'; op: '+' | '*'; left: Token; right: Token } +export type Token = Noop | Value | Op | Group + +const findNextToken = (expression: string): Token => { + let i = 0 + let token: Token = { type: 'noop' } + while (i < expression.length) { + const c = expression[i] + if (isNumber(c)) { + if (token.type === 'op') { + token.right = { type: 'value', value: parseInt(c, 10) } + } else { + token = { type: 'value', value: parseInt(c, 10) } + } + i++ + } else if (isSpace(c)) { + // pass + i++ + } else if (isOperator(c)) { + token = { + type: 'op', + op: c as '+' | '*', + left: token, + right: { type: 'noop' }, + } + i++ + } else if (isOpeningParenthesis(c)) { + const closing = findClosing(expression, i) + if (token.type === 'op') { + token.right = { + type: 'group', + group: findNextToken(expression.substr(i + 1, closing - i - 1)), + } + } else { + token = { + type: 'group', + group: findNextToken(expression.substr(i + 1, closing - i - 1)), + } + } + + i = closing + 1 + } else { + throw new Error(`Unexpected token ${c} at position ${i}!`) + } + } + return token +} + +export const tokenize = (expression: string): Token => { + const nextToken = findNextToken(expression) + return nextToken +} From 9dbbb30915fc17cd82aad841fdd80b46408f48fe Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 19 Dec 2020 14:22:09 +0100 Subject: [PATCH 058/110] feat(day18): part 2 try 2 --- day18/calcTokens.ts | 2 +- day18/groupAdditions.spec.ts | 17 ++++++++++ day18/solution.spec.ts | 5 +-- day18/toExpression.ts | 16 ++++++++++ day18/tokenize.ts | 60 +++++++++++++++++++++++++++++------- 5 files changed, 86 insertions(+), 14 deletions(-) create mode 100644 day18/groupAdditions.spec.ts create mode 100644 day18/toExpression.ts diff --git a/day18/calcTokens.ts b/day18/calcTokens.ts index b03df49..a710a94 100644 --- a/day18/calcTokens.ts +++ b/day18/calcTokens.ts @@ -1,6 +1,6 @@ import { Token, tokenize } from './tokenize' -const calc = (token: Token): number => { +export const calc = (token: Token): number => { switch (token.type) { case 'op': switch (token.op) { diff --git a/day18/groupAdditions.spec.ts b/day18/groupAdditions.spec.ts new file mode 100644 index 0000000..91e4f65 --- /dev/null +++ b/day18/groupAdditions.spec.ts @@ -0,0 +1,17 @@ +import { toExpression } from './toExpression' +import { tokenize } from './tokenize' + +describe.skip('groupAdditions', () => { + it.each([ + ['1 + 2', '(1 + 2)'], + ['1 + 2 * 3', '(1 + 2) * 3'], + ['1 + 2 * 3 + 4 * 5 + 6', '(1 + 2) * (3 + 4) * (5 + 6)'], + //['1 + (2 * 3) + (4 * (5 + 6))', 51], + //['2 * 3 + (4 * 5)', 46], + //['5 + (8 * 3 + 9 + 3 * 4 * 3)', 1445], + //['5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', 669060], + //['((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', 23340], + ])(`should group %s to %s`, (expression, expected) => + expect(toExpression(tokenize(expression))).toEqual(expected), + ) +}) diff --git a/day18/solution.spec.ts b/day18/solution.spec.ts index 092617a..1a5802f 100644 --- a/day18/solution.spec.ts +++ b/day18/solution.spec.ts @@ -1,5 +1,6 @@ import { loader } from '../lib/loader' -import { calcTokens } from './calcTokens' +import { calc, calcTokens } from './calcTokens' +import { tokenize } from './tokenize' const load = loader(18) const input = load('input') @@ -43,7 +44,7 @@ describe('Day 18: Operation Order', () => { ['5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', 669060], ['((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', 23340], ])('%s = %d', (expression, expected) => - expect(calcTokens(expression)).toEqual(expected), + expect(calc(tokenize(expression))).toEqual(expected), ) }) }) diff --git a/day18/toExpression.ts b/day18/toExpression.ts new file mode 100644 index 0000000..e6b2f91 --- /dev/null +++ b/day18/toExpression.ts @@ -0,0 +1,16 @@ +import { Token } from './tokenize' + +export const toExpression = (token: Token): string => { + switch (token.type) { + case 'value': + return `${token.value}` + case 'op': + return `${toExpression(token.left)} ${token.op} ${toExpression( + token.right, + )}` + case 'group': + return `(${toExpression(token.group)})` + default: + throw new Error(`Unexpected token ${token.type}`) + } +} diff --git a/day18/tokenize.ts b/day18/tokenize.ts index 94f8907..7b6350e 100644 --- a/day18/tokenize.ts +++ b/day18/tokenize.ts @@ -12,13 +12,20 @@ export type Group = { type: 'group'; group: Token } export type Op = { type: 'op'; op: '+' | '*'; left: Token; right: Token } export type Token = Noop | Value | Op | Group -const findNextToken = (expression: string): Token => { +const findNextToken = (expression: string, groupAdditions: boolean): Token => { let i = 0 let token: Token = { type: 'noop' } while (i < expression.length) { const c = expression[i] if (isNumber(c)) { - if (token.type === 'op') { + if ( + groupAdditions && + token.type === 'group' && + token.group.type === 'op' && + token.group.op === '+' + ) { + token.group.right = { type: 'value', value: parseInt(c, 10) } + } else if (token.type === 'op') { token.right = { type: 'value', value: parseInt(c, 10) } } else { token = { type: 'value', value: parseInt(c, 10) } @@ -28,11 +35,36 @@ const findNextToken = (expression: string): Token => { // pass i++ } else if (isOperator(c)) { - token = { - type: 'op', - op: c as '+' | '*', - left: token, - right: { type: 'noop' }, + if (groupAdditions && c === '+') { + console.dir(token) + if (token.type === 'op' && token.right.type === 'value') { + token.right = { + type: 'group', + group: { + type: 'op', + op: '+', + left: token.right, + right: token, + }, + } + } else { + token = { + type: 'group', + group: { + type: 'op', + op: '+', + left: token, + right: { type: 'noop' }, + }, + } + } + } else { + token = { + type: 'op', + op: c as '+' | '*', + left: token, + right: { type: 'noop' }, + } } i++ } else if (isOpeningParenthesis(c)) { @@ -40,12 +72,18 @@ const findNextToken = (expression: string): Token => { if (token.type === 'op') { token.right = { type: 'group', - group: findNextToken(expression.substr(i + 1, closing - i - 1)), + group: findNextToken( + expression.substr(i + 1, closing - i - 1), + groupAdditions, + ), } } else { token = { type: 'group', - group: findNextToken(expression.substr(i + 1, closing - i - 1)), + group: findNextToken( + expression.substr(i + 1, closing - i - 1), + groupAdditions, + ), } } @@ -57,7 +95,7 @@ const findNextToken = (expression: string): Token => { return token } -export const tokenize = (expression: string): Token => { - const nextToken = findNextToken(expression) +export const tokenize = (expression: string, groupAdditions = false): Token => { + const nextToken = findNextToken(expression, groupAdditions) return nextToken } From 1871ee193842c4dd3593490c23f13b00c9cad5f2 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 19 Dec 2020 15:48:35 +0100 Subject: [PATCH 059/110] WIP --- day18/groupAdditions.spec.ts | 69 ++++++++-- day18/tokenize.spec.ts | 241 ----------------------------------- 2 files changed, 55 insertions(+), 255 deletions(-) delete mode 100644 day18/tokenize.spec.ts diff --git a/day18/groupAdditions.spec.ts b/day18/groupAdditions.spec.ts index 91e4f65..95e959f 100644 --- a/day18/groupAdditions.spec.ts +++ b/day18/groupAdditions.spec.ts @@ -1,17 +1,58 @@ -import { toExpression } from './toExpression' -import { tokenize } from './tokenize' +import { isNumber } from './calc' +import { calcTokens } from './calcTokens' -describe.skip('groupAdditions', () => { +const reverse = (s: string): string => s.split('').reverse().join('') + +const addOpeningParen = (exp: string): string => { + let rev = reverse(exp) + let len = rev.length + let parenCount = 0 + for (let i = 0; i < len; i++) { + const c = rev[i] + if (c === ')') parenCount++ + if (c === '(') parenCount++ + if (isNumber(c)) { + rev = `${rev}(` + i++ + len++ + } + } + return reverse(rev) +} +const addClosingParen = (exp: string): string => exp + +const groupAdditions = (expression: string): string => { + console.log(expression) + let res = expression + for (let i = 0; i < expression.length; i++) { + if (res[i] === '+') { + const left = addOpeningParen(res.substr(0, i - 1)) + const right = addClosingParen(res.substr(i + 2)) + console.log({ left, right }) + res = `${left} + ${right}` + } + } + return res +} + +describe('groupAdditions', () => { it.each([ - ['1 + 2', '(1 + 2)'], - ['1 + 2 * 3', '(1 + 2) * 3'], - ['1 + 2 * 3 + 4 * 5 + 6', '(1 + 2) * (3 + 4) * (5 + 6)'], - //['1 + (2 * 3) + (4 * (5 + 6))', 51], - //['2 * 3 + (4 * 5)', 46], - //['5 + (8 * 3 + 9 + 3 * 4 * 3)', 1445], - //['5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', 669060], - //['((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', 23340], - ])(`should group %s to %s`, (expression, expected) => - expect(toExpression(tokenize(expression))).toEqual(expected), - ) + ['1 + 2 * 3 + 4 * 5 + 6', '(1 + 2) * (3 + 4) * (5 + 6)', 231], + //['1 + (2 * 3) + (4 * (5 + 6))', '((1 + (2 * 3)) + (4 * (5 + 6)))', 51], + //['2 * 3 + (4 * 5)', '2 * (3 + (4 * 5))', 46], + //['5 + (8 * 3 + 9 + 3 * 4 * 3)', '(5 + (8 * ((3 + 9) + 3) * 4 * 3))', 1445], + //[ + // '5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', + // '5 * 9 * (7 * 3 * (3 + 9) * (3 + ((8 + 6) * 4)))', + // 669060, + // ], + // [ + // '((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', + // '(((((2 + 4) * 9) * (((6 + 9) * (8 + 6)) + 6)) + 2) + 4) * 2', + // 23340, + // ], + ])(`should group %s to %s and equal %d`, (expression, escaped, expected) => { + expect(groupAdditions(expression)).toEqual(escaped) + expect(calcTokens(groupAdditions(expression))).toEqual(expected) + }) }) diff --git a/day18/tokenize.spec.ts b/day18/tokenize.spec.ts deleted file mode 100644 index 608b518..0000000 --- a/day18/tokenize.spec.ts +++ /dev/null @@ -1,241 +0,0 @@ -import { tokenize } from './tokenize' - -describe('tokenize', () => { - it.each([ - [ - '1 + 2', - { - type: 'op', - op: '+', - left: { - type: 'value', - value: 1, - }, - right: { - type: 'value', - value: 2, - }, - }, - ], - [ - '3 * 3', - { - type: 'op', - op: '*', - left: { - type: 'value', - value: 3, - }, - right: { - type: 'value', - value: 3, - }, - }, - ], - [ - '1 + 2 + 3', - { - type: 'op', - op: '+', - left: { - type: 'op', - op: '+', - left: { - type: 'value', - value: 1, - }, - right: { - type: 'value', - value: 2, - }, - }, - right: { - type: 'value', - value: 3, - }, - }, - ], - [ - '1 + 2 * 3', - { - type: 'op', - op: '*', - left: { - type: 'op', - op: '+', - left: { - type: 'value', - value: 1, - }, - right: { - type: 'value', - value: 2, - }, - }, - right: { - type: 'value', - value: 3, - }, - }, - ], - [ - '(2 * 3)', - { - type: 'group', - group: { - type: 'op', - op: '*', - left: { - type: 'value', - value: 2, - }, - right: { - type: 'value', - value: 3, - }, - }, - }, - ], - [ - '1 + (2 * 3)', - { - type: 'op', - op: '+', - left: { - type: 'value', - value: 1, - }, - right: { - type: 'group', - group: { - type: 'op', - op: '*', - left: { - type: 'value', - value: 2, - }, - right: { - type: 'value', - value: 3, - }, - }, - }, - }, - ], - [ - '1 + (2 * 3) + 4', - { - type: 'op', - op: '+', - left: { - type: 'op', - op: '+', - left: { - type: 'value', - value: 1, - }, - right: { - type: 'group', - group: { - type: 'op', - op: '*', - left: { - type: 'value', - value: 2, - }, - right: { - type: 'value', - value: 3, - }, - }, - }, - }, - right: { - type: 'value', - value: 4, - }, - }, - ], - [ - '(2 * 3) + (3 * 4)', - { - type: 'op', - op: '+', - left: { - type: 'group', - group: { - type: 'op', - op: '*', - left: { - type: 'value', - value: 2, - }, - right: { - type: 'value', - value: 3, - }, - }, - }, - right: { - type: 'group', - group: { - type: 'op', - op: '*', - left: { - type: 'value', - value: 3, - }, - right: { - type: 'value', - value: 4, - }, - }, - }, - }, - ], - [ - '1 + (2 * 3) + (4 * (5 + 6))', - { - type: 'op', - op: '+', - left: { - type: 'op', - op: '+', - left: { type: 'value', value: 1 }, - right: { - type: 'group', - group: { - type: 'op', - op: '*', - left: { type: 'value', value: 2 }, - right: { type: 'value', value: 3 }, - }, - }, - }, - right: { - type: 'group', - group: { - type: 'op', - op: '*', - left: { type: 'value', value: 4 }, - right: { - type: 'group', - group: { - type: 'op', - op: '+', - left: { type: 'value', value: 5 }, - right: { type: 'value', value: 6 }, - }, - }, - }, - }, - }, - ], - //['2 * 3 + (4 * 5)', 26], - //['5 + (8 * 3 + 9 + 3 * 4 * 3)', 437], - //['5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', 12240], - //['((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', 13632], - ])('should tokenize %s', (expression, expected) => - expect(tokenize(expression)).toEqual(expected), - ) -}) From 6b9ebe2053f664c95169654a62bbe3cc4a398c5f Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sun, 20 Dec 2020 13:26:42 +0100 Subject: [PATCH 060/110] feat(day18): part 2 --- day18/groupAdditions.spec.ts | 63 +++++++++--------------------------- day18/groupAdditions.ts | 45 ++++++++++++++++++++++++++ day18/solution.spec.ts | 15 ++++++--- 3 files changed, 71 insertions(+), 52 deletions(-) create mode 100644 day18/groupAdditions.ts diff --git a/day18/groupAdditions.spec.ts b/day18/groupAdditions.spec.ts index 95e959f..faabb67 100644 --- a/day18/groupAdditions.spec.ts +++ b/day18/groupAdditions.spec.ts @@ -1,56 +1,23 @@ -import { isNumber } from './calc' import { calcTokens } from './calcTokens' - -const reverse = (s: string): string => s.split('').reverse().join('') - -const addOpeningParen = (exp: string): string => { - let rev = reverse(exp) - let len = rev.length - let parenCount = 0 - for (let i = 0; i < len; i++) { - const c = rev[i] - if (c === ')') parenCount++ - if (c === '(') parenCount++ - if (isNumber(c)) { - rev = `${rev}(` - i++ - len++ - } - } - return reverse(rev) -} -const addClosingParen = (exp: string): string => exp - -const groupAdditions = (expression: string): string => { - console.log(expression) - let res = expression - for (let i = 0; i < expression.length; i++) { - if (res[i] === '+') { - const left = addOpeningParen(res.substr(0, i - 1)) - const right = addClosingParen(res.substr(i + 2)) - console.log({ left, right }) - res = `${left} + ${right}` - } - } - return res -} +import { groupAdditions } from './groupAdditions' describe('groupAdditions', () => { it.each([ + ['1 + 2', '(1 + 2)', 3], ['1 + 2 * 3 + 4 * 5 + 6', '(1 + 2) * (3 + 4) * (5 + 6)', 231], - //['1 + (2 * 3) + (4 * (5 + 6))', '((1 + (2 * 3)) + (4 * (5 + 6)))', 51], - //['2 * 3 + (4 * 5)', '2 * (3 + (4 * 5))', 46], - //['5 + (8 * 3 + 9 + 3 * 4 * 3)', '(5 + (8 * ((3 + 9) + 3) * 4 * 3))', 1445], - //[ - // '5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', - // '5 * 9 * (7 * 3 * (3 + 9) * (3 + ((8 + 6) * 4)))', - // 669060, - // ], - // [ - // '((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', - // '(((((2 + 4) * 9) * (((6 + 9) * (8 + 6)) + 6)) + 2) + 4) * 2', - // 23340, - // ], + ['1 + (2 * 3) + (4 * (5 + 6))', '((1 + (2 * 3)) + (4 * ((5 + 6))))', 51], + ['2 * 3 + (4 * 5)', '2 * (3 + (4 * 5))', 46], + ['5 + (8 * 3 + 9 + 3 * 4 * 3)', '(5 + (8 * ((3 + 9) + 3) * 4 * 3))', 1445], + [ + '5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', + '5 * 9 * (7 * 3 * (3 + 9) * (3 + ((8 + 6) * 4)))', + 669060, + ], + [ + '((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', + '(((((2 + 4) * 9) * (((6 + 9) * (8 + 6)) + 6)) + 2) + 4) * 2', + 23340, + ], ])(`should group %s to %s and equal %d`, (expression, escaped, expected) => { expect(groupAdditions(expression)).toEqual(escaped) expect(calcTokens(groupAdditions(expression))).toEqual(expected) diff --git a/day18/groupAdditions.ts b/day18/groupAdditions.ts new file mode 100644 index 0000000..f8702fd --- /dev/null +++ b/day18/groupAdditions.ts @@ -0,0 +1,45 @@ +import { isNumber } from './calc' + +const reverse = (s: string): string => s.split('').reverse().join('') + +const addParen = (paren: '(' | ')', exp: string): string => { + let parenCount = 0 + for (let i = exp.length - 1; i >= 0; i--) { + const c = exp[i] + if (['(', ')'].includes(c) && c !== paren) parenCount++ + if (c === paren) { + parenCount-- + if (parenCount === 0) { + return `${exp.substr(0, i)}${paren}${exp.substr(i)}` + } + } + if (isNumber(c) && parenCount === 0) { + return `${exp.substr(0, i)}${paren}${exp.substr(i)}` + } + } + + throw new Error(`Could not add parenthesis "${paren}" to "${exp}"!`) +} + +const addOpeningParen = (exp: string): string => addParen('(', exp) + +const addClosingParen = (exp: string): string => + reverse(addParen(')', reverse(exp))) + +/** + * Groups all aditions in the expression, e.g. `1 + 2 * 2` => `(1 + 2) * 3` + **/ +export const groupAdditions = (expression: string): string => { + let res = expression + for (let i = 0; i < res.length; i++) { + if (res[i] === '+') { + const l = res.substr(0, i - 1) + const r = res.substr(i + 2) + const left = addOpeningParen(l) + const right = addClosingParen(r) + res = `${left} + ${right}` + i += 2 + } + } + return res +} diff --git a/day18/solution.spec.ts b/day18/solution.spec.ts index 1a5802f..b59fd3f 100644 --- a/day18/solution.spec.ts +++ b/day18/solution.spec.ts @@ -1,6 +1,6 @@ import { loader } from '../lib/loader' -import { calc, calcTokens } from './calcTokens' -import { tokenize } from './tokenize' +import { calcTokens } from './calcTokens' +import { groupAdditions } from './groupAdditions' const load = loader(18) const input = load('input') @@ -34,7 +34,7 @@ describe('Day 18: Operation Order', () => { )) }) - describe.skip('Part 2', () => { + describe('Part 2', () => { describe('calc (addition is evaluated before multiplication)', () => { it.each([ ['1 + 2 * 3 + 4 * 5 + 6', 231], @@ -44,8 +44,15 @@ describe('Day 18: Operation Order', () => { ['5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', 669060], ['((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', 23340], ])('%s = %d', (expression, expected) => - expect(calc(tokenize(expression))).toEqual(expected), + expect(calcTokens(groupAdditions(expression))).toEqual(expected), ) }) + it('should solve', () => + expect( + input + .map(groupAdditions) + .map(calcTokens) + .reduce((total, n) => total + n, 0), + ).toEqual(60807587180737)) }) }) From 7e6d9c3500a843a1f9d06c8aca203a55bc5c9cc4 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 1 Dec 2021 08:02:12 +0100 Subject: [PATCH 061/110] feat: prepare for 2021 --- .github/workflows/test.yaml | 5 +- .husky/commit-msg | 4 + .husky/pre-commit | 4 + .prettierrc.js | 3 - README.md | 2 +- commitlint.config.js => commitlint.config.cjs | 0 day01/findEntriesWithSum.ts | 11 - day01/input.txt | 200 - day01/sample.txt | 6 - day01/solution.spec.ts | 36 - day02/findValidPasswords.ts | 53 - day02/input.txt | 1000 -- day02/sample.txt | 3 - day02/solution.spec.ts | 29 - day03/countTrees.ts | 20 - day03/input.txt | 323 - day03/sample.txt | 11 - day03/solution.spec.ts | 37 - day04/input.txt | 1121 -- day04/parsePassportList.spec.ts | 47 - day04/parsePassportList.ts | 19 - day04/sample.txt | 13 - day04/solution.spec.ts | 59 - day04/validatePassport.spec.ts | 92 - day04/validatePassport.ts | 46 - day05/input.txt | 945 - day05/locateSeat.ts | 49 - day05/solution.spec.ts | 47 - day06/collectAnswers.spec.ts | 10 - day06/collectAnswers.ts | 26 - day06/input.txt | 2211 --- day06/parseGroupList.spec.ts | 32 - day06/parseGroupList.ts | 15 - day06/solution.spec.ts | 56 - day06/sumAnswers.ts | 14 - day06/sumAnswersByAll.ts | 20 - day07/countBags.ts | 22 - day07/input.txt | 594 - day07/packBag.ts | 26 - day07/parseRules.spec.ts | 65 - day07/parseRules.ts | 49 - day07/solution.spec.ts | 66 - day08/handheld.ts | 38 - day08/input.txt | 613 - day08/solution.spec.ts | 64 - day09/findInvalidNumber.ts | 26 - day09/findSet.ts | 22 - day09/input.txt | 1000 -- day09/solution.spec.ts | 46 - day10/arrangeAdapters.ts | 80 - day10/countAdapterArrangements.ts | 39 - day10/countRoutes.ts | 26 - day10/input.txt | 106 - day10/sample.txt | 11 - day10/sample2.txt | 31 - day10/solution.spec.ts | 63 - day10/stringUpAdapters.ts | 24 - day11/input.txt | 91 - day11/seatingSimulator.spec.ts | 36 - day11/seatingSimulator.ts | 187 - day11/solution.spec.ts | 41 - day12/input.txt | 768 - day12/navigate.ts | 159 - day12/solution.spec.ts | 40 - day13/findShuttle.ts | 30 - day13/findTime.ts | 24 - day13/solution.spec.ts | 27 - day14/input.txt | 578 - day14/run.ts | 34 - day14/solution.spec.ts | 25 - day15/memoryGame.ts | 28 - day15/solution.spec.ts | 29 - day16/findMatchingRules.ts | 56 - day16/isValidTicket.ts | 44 - day16/rules.txt | 20 - day16/solution.spec.ts | 121 - day16/tickets.txt | 236 - day17/cubes.ts | 143 - day17/solution.spec.ts | 40 - day18/calc.ts | 65 - day18/calcToken.spec.ts | 30 - day18/calcTokens.ts | 27 - day18/groupAdditions.spec.ts | 25 - day18/groupAdditions.ts | 45 - day18/input.txt | 375 - day18/solution.spec.ts | 58 - day18/toExpression.ts | 16 - day18/tokenize.ts | 101 - lib/uniqueCombinations.spec.ts | 35 - lib/uniqueCombinations.ts | 25 - package-lock.json | 14360 ++++++++++------ package.json | 64 +- tsconfig.json | 7 +- 93 files changed, 9084 insertions(+), 18486 deletions(-) create mode 100755 .husky/commit-msg create mode 100755 .husky/pre-commit delete mode 100644 .prettierrc.js rename commitlint.config.js => commitlint.config.cjs (100%) delete mode 100644 day01/findEntriesWithSum.ts delete mode 100644 day01/input.txt delete mode 100644 day01/sample.txt delete mode 100644 day01/solution.spec.ts delete mode 100644 day02/findValidPasswords.ts delete mode 100644 day02/input.txt delete mode 100644 day02/sample.txt delete mode 100644 day02/solution.spec.ts delete mode 100644 day03/countTrees.ts delete mode 100644 day03/input.txt delete mode 100644 day03/sample.txt delete mode 100644 day03/solution.spec.ts delete mode 100644 day04/input.txt delete mode 100644 day04/parsePassportList.spec.ts delete mode 100644 day04/parsePassportList.ts delete mode 100644 day04/sample.txt delete mode 100644 day04/solution.spec.ts delete mode 100644 day04/validatePassport.spec.ts delete mode 100644 day04/validatePassport.ts delete mode 100644 day05/input.txt delete mode 100644 day05/locateSeat.ts delete mode 100644 day05/solution.spec.ts delete mode 100644 day06/collectAnswers.spec.ts delete mode 100644 day06/collectAnswers.ts delete mode 100644 day06/input.txt delete mode 100644 day06/parseGroupList.spec.ts delete mode 100644 day06/parseGroupList.ts delete mode 100644 day06/solution.spec.ts delete mode 100644 day06/sumAnswers.ts delete mode 100644 day06/sumAnswersByAll.ts delete mode 100644 day07/countBags.ts delete mode 100644 day07/input.txt delete mode 100644 day07/packBag.ts delete mode 100644 day07/parseRules.spec.ts delete mode 100644 day07/parseRules.ts delete mode 100644 day07/solution.spec.ts delete mode 100644 day08/handheld.ts delete mode 100644 day08/input.txt delete mode 100644 day08/solution.spec.ts delete mode 100644 day09/findInvalidNumber.ts delete mode 100644 day09/findSet.ts delete mode 100644 day09/input.txt delete mode 100644 day09/solution.spec.ts delete mode 100644 day10/arrangeAdapters.ts delete mode 100644 day10/countAdapterArrangements.ts delete mode 100644 day10/countRoutes.ts delete mode 100644 day10/input.txt delete mode 100644 day10/sample.txt delete mode 100644 day10/sample2.txt delete mode 100644 day10/solution.spec.ts delete mode 100644 day10/stringUpAdapters.ts delete mode 100644 day11/input.txt delete mode 100644 day11/seatingSimulator.spec.ts delete mode 100644 day11/seatingSimulator.ts delete mode 100644 day11/solution.spec.ts delete mode 100644 day12/input.txt delete mode 100644 day12/navigate.ts delete mode 100644 day12/solution.spec.ts delete mode 100644 day13/findShuttle.ts delete mode 100644 day13/findTime.ts delete mode 100644 day13/solution.spec.ts delete mode 100644 day14/input.txt delete mode 100644 day14/run.ts delete mode 100644 day14/solution.spec.ts delete mode 100644 day15/memoryGame.ts delete mode 100644 day15/solution.spec.ts delete mode 100644 day16/findMatchingRules.ts delete mode 100644 day16/isValidTicket.ts delete mode 100644 day16/rules.txt delete mode 100644 day16/solution.spec.ts delete mode 100644 day16/tickets.txt delete mode 100644 day17/cubes.ts delete mode 100644 day17/solution.spec.ts delete mode 100644 day18/calc.ts delete mode 100644 day18/calcToken.spec.ts delete mode 100644 day18/calcTokens.ts delete mode 100644 day18/groupAdditions.spec.ts delete mode 100644 day18/groupAdditions.ts delete mode 100644 day18/input.txt delete mode 100644 day18/solution.spec.ts delete mode 100644 day18/toExpression.ts delete mode 100644 day18/tokenize.ts delete mode 100644 lib/uniqueCombinations.spec.ts delete mode 100644 lib/uniqueCombinations.ts diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 74df5c9..f72ca5f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -2,9 +2,6 @@ name: Test on: push -env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - jobs: tests: runs-on: ubuntu-latest @@ -13,7 +10,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 with: - node-version: "14.x" + node-version: "16.x" - name: Keep npm cache around to speed up installs uses: actions/cache@v2 with: diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..273ed27 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx commitlint -g commitlint.config.cjs --edit $1 \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..a764fb0 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx lint-staged && npm test && npx tsc \ No newline at end of file diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index ff901ec..0000000 --- a/.prettierrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - ...require('@bifravst/code-style/.prettierrc'), -} diff --git a/README.md b/README.md index fb13f81..0f6e3b4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Advent of Code 2020 solutions in TypeScript +# Advent of Code 2021 solutions in TypeScript [![GitHub Actions](https://github.com/coderbyheart/adventofcode/workflows/Test/badge.svg)](https://github.com/coderbyheart/adventofcode/actions) [![Known Vulnerabilities](https://snyk.io/test/github/coderbyheart/adventofcode/badge.svg)](https://snyk.io/test/github/coderbyheart/adventofcode) diff --git a/commitlint.config.js b/commitlint.config.cjs similarity index 100% rename from commitlint.config.js rename to commitlint.config.cjs diff --git a/day01/findEntriesWithSum.ts b/day01/findEntriesWithSum.ts deleted file mode 100644 index de64179..0000000 --- a/day01/findEntriesWithSum.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { uniqueCombinations } from '../lib/uniqueCombinations' - -const sum = (total: number, n: number) => n + total - -export const findEntriesWithSum = (numEntries: number) => ( - entries: number[], - expectedSum: number, -): number[] => - uniqueCombinations(numEntries)(entries).find( - (e) => e.reduce(sum, 0) === expectedSum, - ) ?? [] diff --git a/day01/input.txt b/day01/input.txt deleted file mode 100644 index 71a40c2..0000000 --- a/day01/input.txt +++ /dev/null @@ -1,200 +0,0 @@ -1864 -1880 -1300 -1961 -1577 -1900 -1307 -1818 -1736 -1846 -1417 -1372 -1351 -1860 -1738 -1525 -1798 -1218 -1723 -1936 -1725 -1998 -1466 -1922 -1782 -1947 -1717 -1914 -1843 -1732 -1918 -814 -1771 -1712 -1804 -1213 -1859 -1820 -1793 -1870 -1993 -1787 -1824 -1849 -1646 -1489 -1348 -1978 -1628 -1781 -2002 -1297 -1829 -1596 -1819 -1313 -1413 -1726 -1449 -1810 -1295 -1679 -1358 -1949 -1644 -1825 -1891 -490 -1962 -1939 -1228 -1889 -1977 -1980 -1763 -1752 -1983 -1785 -1678 -2000 -1857 -1658 -1863 -1330 -1380 -1799 -1789 -1633 -1663 -296 -1985 -1117 -1239 -1854 -1960 -2004 -1940 -1876 -1739 -1858 -1283 -1423 -1982 -1836 -1451 -1840 -1347 -1652 -1695 -1210 -1861 -1199 -1346 -1786 -1814 -1958 -1853 -1974 -1917 -1308 -654 -1743 -1847 -1367 -1559 -1614 -1897 -2003 -1886 -1885 -1682 -1204 -1986 -1816 -1994 -1817 -1751 -1701 -1619 -1970 -816 -1852 -1832 -1631 -703 -1604 -1444 -1842 -1984 -1259 -1948 -1620 -1681 -1822 -1865 -1521 -1741 -1455 -1909 -1764 -261 -1464 -1905 -1325 -1766 -1749 -1292 -1874 -1267 -1269 -1969 -1991 -1219 -1345 -1976 -1369 -1942 -1388 -1776 -1629 -1987 -1684 -1813 -1203 -1965 -1729 -1930 -1609 -1801 -1402 -121 -1833 -1898 -1957 -1051 -1430 -1893 -1784 -1800 -1910 \ No newline at end of file diff --git a/day01/sample.txt b/day01/sample.txt deleted file mode 100644 index 0bb977d..0000000 --- a/day01/sample.txt +++ /dev/null @@ -1,6 +0,0 @@ -1721 -979 -366 -299 -675 -1456 \ No newline at end of file diff --git a/day01/solution.spec.ts b/day01/solution.spec.ts deleted file mode 100644 index e9b2c2d..0000000 --- a/day01/solution.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { loader } from '../lib/loader' -import { findEntriesWithSum } from './findEntriesWithSum' - -const load = loader(1) -const sample = load('sample') -const input = load('input') - -const toInt = (s: string) => parseInt(s, 10) -const mul = (total: number, n: number) => n * total - -describe('Day 1: Report Repair', () => { - describe('Part 1', () => { - it('should solve the sample', () => { - expect( - findEntriesWithSum(2)(sample.map(toInt), 2020).reduce(mul, 1), - ).toEqual(1721 * 299) - }) - it('should solve', () => { - expect( - findEntriesWithSum(2)(input.map(toInt), 2020).reduce(mul, 1), - ).toEqual(982464) - }) - }) - describe('Part 2', () => { - it('should solve the sample', () => { - expect( - findEntriesWithSum(3)(sample.map(toInt), 2020).reduce(mul, 1), - ).toEqual(979 * 366 * 675) - }) - it('should solve', () => { - expect( - findEntriesWithSum(3)(input.map(toInt), 2020).reduce(mul, 1), - ).toEqual(162292410) - }) - }) -}) diff --git a/day02/findValidPasswords.ts b/day02/findValidPasswords.ts deleted file mode 100644 index 113cb29..0000000 --- a/day02/findValidPasswords.ts +++ /dev/null @@ -1,53 +0,0 @@ -const policyAndPasswordsLine = new RegExp( - /^(?[0-9]+)-(?[0-9]+) (?[a-z]): (?[a-z]+)$/, -) - -type PasswordChecker = ( - password: string, - letter: string, - n1: number, - n2: number, -) => boolean - -/** - * indicates the lowest and highest number of times a given letter must appear for the password to be valid - */ -export const LegacyPasswordChecker: PasswordChecker = ( - password: string, - letter: string, - min: number, - max: number, -): boolean => - ((numChars: number) => numChars >= min && numChars <= max)( - password.split('').filter((s) => s === letter).length, - ) - -/** - * describes two positions in the password, where 1 means the first character, - * 2 means the second character, and so on. - * (Be careful; Toboggan Corporate Policies have no concept of "index zero"!) - * Exactly one of these positions must contain the given letter. - * Other occurrences of the letter are irrelevant for the purposes of policy enforcement. - */ -export const TobogganPasswordChecker: PasswordChecker = ( - password: string, - letter: string, - pos1: number, - pos2: number, -): boolean => { - let count = 0 - if (password.charAt(pos1 - 1) === letter) count++ - if (password.charAt(pos2 - 1) === letter) count++ - return count === 1 -} - -export const findValidPasswords = (passwordChecker: PasswordChecker) => ( - policyAndPasswords: string[], -): number => - policyAndPasswords.reduce((count, s) => { - const { n1, n2, letter, password } = - policyAndPasswordsLine.exec(s)?.groups ?? {} - if (passwordChecker(password, letter, parseInt(n1, 10), parseInt(n2, 10))) - return count + 1 - return count - }, 0) diff --git a/day02/input.txt b/day02/input.txt deleted file mode 100644 index ebd0c1b..0000000 --- a/day02/input.txt +++ /dev/null @@ -1,1000 +0,0 @@ -15-16 l: klfbblslvjclmlnqklvg -6-13 h: pghjchdxhnjhjd -4-13 n: nnznntzznqnzbtzj -10-16 r: nrrrrkrjtxwrrrwx -1-6 t: rttftttttttttmdttttt -4-12 l: zhllfxlmvqtnhx -6-8 d: wxpwgdbjtffddkb -7-9 q: rqcqxjqhsm -6-8 x: xxxfxdxxx -5-9 d: dwnwnbsddfmc -2-6 j: jvdrrjchml -8-10 x: xxxcxxxzxxxxx -15-16 f: ffffffffffffffnfc -3-12 v: vgvvvvvvvvfqvvvv -2-5 p: tknppm -11-12 r: frrnrfqtshrgw -13-16 f: rfjmkrqkqrxmfnqj -3-5 f: ffffxffn -2-4 f: fffwf -11-13 s: srslssshssssx -1-6 c: cccdcn -2-6 t: tthhnc -12-17 w: wwwwwwwwwwwmwwwwg -5-6 k: kqkksskkp -4-5 p: ppppx -5-12 h: hbjhqhdwnqxhhsh -6-8 p: ppgzpppw -3-4 z: zzcz -6-15 x: hfvxxsqbfxxlhpxtb -4-7 m: qmxzhgt -18-20 b: fvzbbrbcvskxrpkwnmwb -1-11 c: ccccccccccggccc -1-3 p: dppp -2-6 j: fjbmljmdb -2-4 l: slpmqpk -3-5 b: stbpbbndtgzxlsnbdk -6-11 h: hlzkdhhhrhchmhbhl -1-4 w: wwpv -10-12 p: pmpppkpppgph -11-14 f: fbdxffpffffffkfffjvf -4-9 v: vkvfhfvvrvvv -16-17 t: tmtbztrptdlvttvkt -2-6 w: wwwwphwwwwnwwj -6-11 x: xxxxxxxxxxkxx -9-10 t: ttftchttnd -2-9 w: wkwwwwwwlww -2-4 g: ggvcgggggggggg -5-6 d: dldddsddddddd -5-8 j: jddjjnld -9-12 l: xldxlklvlkll -2-3 w: xwnrwdwndlvl -16-18 m: mmmmrmmmmmrvvmmvmm -3-4 t: ctts -11-12 b: ndgjdbppcdbhhssw -2-11 s: nssksssnssxvq -2-5 g: qggwcvf -10-14 l: llxlllrjlmlllwllll -8-9 w: wwwwfpwtvtjwjw -8-10 m: mmmmmmmmmmm -1-11 z: rldjzzzpzzs -16-17 v: qvsrnvvvwxgmvjjcvhcx -14-18 k: kkkkkkkkkkkkkkkkklk -2-3 q: qqrqqqxqqqq -4-9 c: lclckhcgn -2-3 b: nbbbbldlbbb -15-18 v: vtvvrvxvvnvxhvnvvv -4-7 q: qqqnqqqq -3-13 j: svjjdcnkwnbpl -4-11 q: blnqvqsngwj -3-4 j: dxdkj -5-7 c: dzxbsctqwclcgc -3-4 f: jfhffff -3-5 t: sttwk -7-8 t: tnqtvsztqwpvtftknt -1-12 r: grrrrrrrrrrrrrrr -7-8 k: kkkkkkqkk -3-4 l: llls -1-14 h: khhhjhhhhhhhhh -3-5 d: ttcdddd -1-7 w: dqwhwkww -4-5 p: pppqppppp -10-14 l: lqlltwlllllllzjk -15-17 d: ddddddddddddddddcdd -1-8 z: xpbbjxrzlzznxlz -1-2 v: vrvv -7-11 l: llllllclllslll -3-14 h: hhvhhhhhhhhhhhh -6-7 m: mmgpbjmgqmm -9-13 h: hhhhhhhhhhhhfnhhhhwh -12-17 c: cccpfcccccnccccqscc -6-12 x: kqfxbhxbdxxxl -6-8 z: zqkbtzzb -6-8 l: llllllllllllll -6-13 d: wdzdxdddddlzdtbd -3-8 h: gzcknrxkjgtggnqwqjs -1-6 t: tttttvtt -5-8 x: fjxnxrtn -6-9 z: zzzzzzzzszzz -2-4 v: vpvvtv -1-7 w: wcwrxgf -2-3 t: vxftld -1-2 n: nnxmntsqzk -5-11 l: nmvllllnlckl -7-13 c: cwchccjcrfsccc -2-3 z: dzdz -7-8 s: sddgbhws -3-11 w: qqsqrgmwwmwgfdhpsct -16-17 q: qqqqzqqqqqqqqqqqh -7-15 h: thqthdphmbhhjphhh -6-10 k: gcflljjwkk -9-17 f: ffffffffffffffffdf -10-12 q: qqqqbqlpqqfdqq -3-16 x: dbxmwtlqdmvldxlgxdhk -1-2 x: xxjxh -10-11 p: ppqpppkpptp -3-5 w: wwwwwwwww -10-11 j: xjmhqgdznjf -9-11 n: dxnnnnnnnnmnnn -1-5 l: mlllvllwlrblllll -14-16 q: tqqqqqqwqqqqqmqqqqq -2-3 b: nvbbbcf -5-8 x: xmkxxgxq -1-4 x: xxxfx -1-6 n: nnnrnm -9-17 p: pppppppppppppppppp -2-4 d: ddqd -13-14 p: fmpkxpprppppzhpp -5-6 t: tttttgrttt -10-12 r: rrrrrrrrrlrrrrrrrr -4-7 h: gnmqvqrhwhh -4-5 m: smsmmmm -4-5 q: qgzqb -6-12 c: rdnnsccnrjkcnm -4-16 k: gfkxktpwhxzkgcdnb -4-5 f: ffgvf -6-13 n: nfslcrnkksfmnmvcfnnz -15-18 s: sssqsssssmshmsmsss -1-15 v: vvvvwvvxvvvcvvwvvvvv -2-8 h: gphlnhph -4-13 t: vtjvrcxqwbsrk -2-10 t: tvttftzttttqttt -12-13 t: dvsbstlkfpztdqs -7-8 w: rvwncwww -13-16 v: vlqzjlvxljrvvjvvzp -12-13 w: wwwwwwwwnwdwwgwwwx -14-15 d: dcpdddddddddddmdbd -1-3 b: bbdbbbb -11-12 t: rkdtncbtkktzmvtghb -3-7 n: nzbfgbnnx -5-13 v: vsvbkvvvvvvvv -3-8 n: nltdrmbn -14-15 p: mzkmmqdfpcptzbzc -4-6 q: qtqkgqfmqwm -9-10 v: vvdvvxvvxvwd -5-7 m: mmmmmmkm -6-7 k: kkkkkgkk -8-9 h: shhhhhhhh -8-11 p: pppppppppczplbwcpb -11-17 k: kkkkkkkkkkkkkktkc -9-17 w: mwtfbvsfnhwxqqvxw -8-12 j: jhjjjjjrkjnjjjjjjjj -3-5 g: sgfgqgg -12-14 j: jjjjjjjjjjjjjjjjjjjj -1-11 f: jsffffzfffffxffftf -16-17 f: fffffffffftfffffff -2-4 k: klkwkk -5-8 g: gtjngzkhgb -4-7 b: bbbmbbbb -4-5 w: wwwdw -5-15 g: tplhhgmggbhggrllqg -9-13 v: jvvbqvsbvzhxvh -1-3 d: ddsddn -2-5 w: cfwds -7-11 x: xxxxjxvvxvxhxvml -5-6 v: jwqxvb -3-15 s: ssqsssssssssssss -5-9 d: dddddddddddddddd -5-8 l: vklnlclj -10-13 s: sltdlfbssxsss -11-18 j: hxjxjnjcpmkppnpjpjk -4-6 t: ttbzhvt -2-17 v: rzmhrssrjvpncwqwl -2-4 x: mtcxz -11-12 d: dddddddwddbd -2-13 h: whgpdxvkfxrhg -5-7 d: ddddddxdtddddddhdddq -4-8 b: lhcfbkbbdmb -8-15 l: lvtmkgwllqttgplbgjj -3-5 n: nqngjvw -12-19 m: mmmmmmmmmmmmmmmmmmgm -5-9 g: grhgsdcwgmdt -6-9 j: msgrcrfvzksfxxjq -6-10 s: xdssssssssssssssg -8-9 h: hhhnhhnfhh -12-15 f: fffffffffffffffwfff -3-7 p: pzzpbjkfcczbmnpkf -6-7 r: cnjlbhr -2-5 f: dwxcftrbljgstf -5-11 h: hhhhjhhhhhqh -16-18 r: rrrrrrrrrrrrrrrrrmrr -2-4 r: rxmrd -7-9 c: ccccczccccc -7-13 d: ddddddddddddfd -3-11 k: mmkspkltjwm -8-11 c: rvccccgtclc -1-3 v: vvhhv -4-7 t: jttnttgx -4-16 n: nnnjnfnnnnnnnnnnnn -5-6 m: mmmdmqmm -9-10 x: xxxxxxxkxrx -2-4 m: tmcmzjmvtcghlgm -6-7 q: lqqjqqnzqqmq -16-19 k: kjwkhkkjhkskskpnkfk -19-20 b: pbbpsbnbbmnntbnbbbbn -4-5 p: ppppmp -3-4 d: grlqndd -4-7 n: nnnnnnsn -9-12 k: kkkkkkkkfkkkkk -4-10 h: hfhhhxhfhd -4-9 t: ttttxbbbcdmxsrhjj -4-11 l: npxwbsmklbls -17-20 d: dddddwdhdkddjdddtfdd -3-4 s: nldssq -4-8 s: sssdsssgs -5-16 t: ttttprtcttttttzt -9-17 j: tjjtjjjjgljjjcjjfj -7-8 b: bbbbtbkbb -2-13 l: szllllllllxllll -8-11 n: bmpnwrnngnmsfw -1-5 d: jddqtdwddxddjd -10-11 s: hqgnvslssstqdnvs -14-16 p: ppppppppvpplpgpp -2-8 h: khhjfcqp -6-7 d: fxdpdwvdjkd -5-7 n: bnnprnf -9-13 f: vfffwfffffffkfxff -2-10 j: vjhcggzrjqt -5-7 g: gggfggzwgg -5-6 d: ddbsjddfsdnddxfpgdd -12-13 g: gggqjgxgzpgsggxggxk -1-8 l: hlslllllll -12-13 f: sbfftpvbjsmff -6-7 s: hqcthsb -5-11 s: qsstnssssqsrsskdss -2-6 x: hxrfnjfclx -1-2 w: swwwwwwwwwwwjwmwwwww -7-12 s: whsbkgsmvnfjnnkq -10-12 l: fllllllllsllll -8-9 s: lsssssssqs -1-7 p: pdpppghqppxpppppp -1-3 x: jhxmjhkdrxgd -1-7 b: lbxbbbvbwbbbbt -4-5 c: cdckcbcmqcc -5-9 k: kkmklhlmkkgkrld -12-18 x: dvjxqxxxxxdxxxzxhp -5-8 h: nhfhnfqx -15-16 k: kkkkktrkkkkkpkhqxkkd -1-13 j: dcnbwjxllpksj -11-13 v: wvqhznrrfgmnvz -2-5 m: bpjbmbrmfh -10-15 t: mgtttttqspthnttkktt -9-10 n: nnpnnnnpnh -8-10 b: bjbzhbbbcq -4-12 n: nnnvnnnnnnnnnn -13-14 v: zbkchmmvjvsgkvhcz -2-9 j: jdqjgnnjjjvjt -11-16 g: ggggxqglgglfhvgggn -1-2 b: bsbm -8-11 v: lvvvjhvmxvvvv -5-7 x: xxsxxxpr -2-15 t: stwqdkrqcwbmngtd -5-8 r: rcrrvndr -5-6 v: vvvvvr -4-5 x: qpxxr -1-2 k: nkkkkkd -10-13 r: znlqhvwdvrqbrrrfzwc -1-2 h: hwhhhchhhhhhhhhhhh -3-6 b: bbbbbvbbbvbb -13-14 s: ssssssssmssssdss -7-11 x: cwxhmnhzxrxdrzzxbw -5-16 m: rgjtmrqqmfmmckxm -17-18 b: bbbbbbbbbbbbbbbbbk -11-20 k: kppkqkftkgkkknbtglkb -13-14 t: rtcfrkjvtgnrtf -5-6 z: kdzjxzjgmd -2-3 p: rxppj -9-12 b: mtpbbbbbbbbgp -8-9 b: rbbbbbsbbbbxb -13-17 r: rxgbrrnrrrrrrkrrlrrr -8-11 w: pzqswqwcfln -3-4 x: xxxx -6-9 j: fjhkjjklc -6-7 m: ctmzmfm -8-9 l: lllllllgllpts -8-9 t: hgpwblqkvqtb -4-7 d: dddpddd -4-5 c: ccccwcccg -1-7 q: lvvtpqqvnsqbzqpr -8-15 q: qqqqqqqqqqpqqqlqqq -4-8 f: frfffffffxf -7-12 r: rrrrrrrrrrrkprrtrrrp -14-15 j: jsjjjjjjjjjjjjl -6-17 b: khgflbrbrjbgzjtjt -5-7 j: jjknjpw -2-9 h: rhlqbdklh -5-7 j: lrtvccjbzgjh -12-14 t: tltwtxtctttnttttft -8-9 q: qqqqqqqqx -4-15 p: ppppppppppppppc -2-3 v: vvvvv -5-7 h: djvplxb -11-12 g: gjxlvggsgggxsgfgp -5-6 g: gggggfg -1-6 x: wxtxxxxxxxxxx -1-4 r: rqrcrvrzbrxrwjr -9-10 w: wwwmwwwwpww -7-15 z: pzrbrxpzzzzzntzv -4-5 q: qjqwqqnlqhclq -12-16 g: ggccgzggggsggjgg -11-13 b: phbmbsgkvszbbrbb -2-3 l: xhlbhl -1-7 q: qwdqmtv -5-9 x: xxxxjxxxxx -6-8 p: kvpwqbdp -11-13 t: tqttttttttttmt -9-16 l: wzdxdmlxlkfjknnz -1-11 j: vjjjjjjjjjjj -2-18 t: tsttttttttttttttthtt -6-7 n: fnnncnl -3-5 s: lssvgfssgsshsvstsss -3-5 h: hhhbhhh -4-10 x: tsxxxxxxbls -2-4 n: nnjw -17-18 p: bptpftnxjchrwthtppk -14-15 d: dddddddddddddddd -10-14 m: mmmwnmmgmdmmmmmmmmm -8-9 k: pkpqffpkktbgkbk -7-11 l: lllllllllqplllllllll -11-15 n: nnnzngknbnzdnsnnn -2-4 l: vbqm -10-11 w: wwwwwwwwwwq -3-5 x: xxtxxxxx -3-15 b: spbcxjlbbbrbbbbb -4-5 n: nvfsn -13-16 n: bppjnncnbgjndnnntwgs -1-8 t: mttttttttt -6-9 d: jvmssdkdhxsd -9-10 d: gdrllcfdnd -7-11 c: cscxccccnztccccz -15-16 p: pppppkphpppppspg -2-4 n: vnkjlwwsswscmxktnj -9-11 r: rrrrrkrzslr -7-10 t: tttgqtnttttttttt -4-10 b: bbrzbzpbsbnbbjnbsb -7-8 j: jlljxtsj -5-15 z: lzzzfqzzzzzqzzzzzz -10-11 r: rrrrrrrrrrcrrrr -6-8 t: tztpbttttt -2-9 c: vcgtfxfbr -9-16 r: vgjrwcxhrrhbzxnj -17-18 r: bczjtmjwrtzwvmgbrl -5-6 d: dqgddvd -1-2 r: krzrkr -8-9 j: rxjjjjgbj -8-9 c: cjccccccc -13-14 b: bbbbgbbbbbbbbvb -5-6 p: hbhwtp -1-2 w: wfhrfsfbjtpkqcjrwdb -10-13 q: qqqqqqqnqrqqzqq -3-4 m: xcmcz -11-15 d: dldddcddddjddqd -4-10 h: khhlhhhhhhhhhhhh -2-4 d: bdfpmxzqzbzmxmmwg -4-5 l: lgrbl -9-13 s: ssssssssfsssss -7-8 p: pplkpmkppppppxp -3-8 j: jjjjjjjj -7-8 f: jfffffhzfff -2-5 p: pppppppp -8-9 l: tlclllmlz -4-5 m: mtrmx -13-16 x: xxxxsxmxxxxvwxxw -5-8 n: jknnngnv -4-7 p: ppptppgpppp -12-15 r: rrrrrrrrrrrxrrrhr -2-9 s: sssssssssss -5-6 z: zphzzr -13-17 m: mmlmmsmzmsddbxmkb -5-7 g: gggggggg -8-9 f: ndzfvfkfz -2-10 g: wtngwdkcxgrth -6-13 r: rrqrrqrrqrrrcrrrr -1-6 z: hfzzzz -10-13 j: jjjjjjjjjjjjdj -5-11 m: wfqvmhbjhhnmzdlmpjc -6-8 d: clddzxcdghn -8-12 n: qfqbbvkpjbznrz -3-6 r: rrbrrrrrrx -9-10 r: rrrrrrrrrrr -4-5 m: chltmcm -7-8 r: rrrnprrzrhr -3-4 j: jfcj -16-17 n: nnnnnnnnnnnnnnnnwnnn -7-8 r: rrrrrrnfr -4-12 n: nnnnspnlcnmsnnnn -11-12 v: vvvvvvfvvvhvvv -2-8 h: hlhhkhhchhhghh -4-5 t: stntztttmp -3-5 v: vvvmbvhvvvlvn -9-14 x: srxmtbtgxgmqxxxc -4-5 z: zrlgz -10-11 p: phxkvklpmdp -8-15 m: mmmmmmmpmmmmmmm -1-13 h: mzwqkhhhphsgh -17-19 s: qssssmssgfmssmmpssk -6-8 b: bbbbbbbjbb -3-4 l: rllr -2-4 j: kvjj -2-5 n: lnnkrm -15-16 w: wwwkwwwwwwwwwwwc -1-3 c: ccncc -2-5 s: bhppmsttzcscss -1-4 t: tttxtttt -1-9 r: rfrrrbhtxrrbrmrmr -12-13 s: qplrssssmfswrsswss -2-4 h: zrhhhhzhzhch -1-5 g: rgjgg -11-14 t: ttttvftttttqlsttt -3-4 s: sskss -5-15 m: mmmmnmmmmmvmmmm -1-8 j: sjjjjjjj -1-4 c: ccclcc -5-7 d: ddddhdd -2-8 z: tczzjzzzzzzzgz -1-5 s: qsqdz -8-11 z: zhzpzrvzhzkzzgm -5-9 g: nvdfgshgbgltlqggbp -1-12 r: rrrrrrrrrrrrr -3-4 m: xmmb -8-10 j: jjjjdjmjshqjzk -2-4 t: tptttftt -4-13 t: ggqscfggftnxgjpn -4-12 q: hvzjzqsqwqjlqx -7-8 q: qqqlqqqkqq -9-10 f: ffffffffdfff -2-7 k: kgkkkkkk -7-11 t: xbpdkrtplmfbtkwgp -4-7 c: ccccccccc -12-14 d: dddddddddddqdddddd -6-7 k: xhnntkpnbkfwlr -3-5 q: qqxxq -13-17 d: ddddddddddddvddddd -2-3 g: smglpgpflsrbwxcjctb -5-9 z: zjzzznfzf -7-13 l: lmrkvvxtltcnj -15-16 r: vjrrrkzxrrrqrtrpzv -2-7 x: xsxxxxxx -7-14 m: npmnmgdvnqmgrmm -2-4 x: pxxl -7-15 k: nkkkckgwdkffkmb -7-11 n: dznnmcnssmcn -8-10 s: skssgswssmsss -14-16 n: nnnnnnnncdnjnnhwnnn -4-7 g: kggmgggbggggwggcqgng -4-7 g: gggqggggg -1-2 c: cccc -4-8 j: mzzvwjgrbrv -11-12 x: pksjnwlltskxlj -1-9 k: zfkkkksrkkkkkkz -1-6 k: xkkkkknkk -1-6 c: gccccncbccccc -14-15 h: hhhhhrhhgkhhhmhh -7-8 f: qffgnfhf -2-6 m: vmqwxzgsm -5-8 k: kkzjkwkvk -3-4 s: dcsss -2-4 p: jjbps -2-11 z: zjzzzzzzzzzz -4-7 f: bnkhvjfff -13-16 m: mmmmmmmmmmmmjmmmmmm -5-10 t: kdwjmcgtvtdttmtvw -3-12 j: jjljwjfjjjjjnhjjjjc -13-14 f: fffffflffxfffbf -2-6 m: zmhmsm -4-18 n: nnnvnnnnnhnnnfnnnhnn -3-6 n: xznnsnn -7-11 g: ggggpgggggggsg -6-8 l: llllltllll -4-5 s: ssnttsrs -6-14 w: wwwwwwwwwwwpwlwwww -9-12 q: pxqvswnqqbsqvgsd -1-4 j: mjjjjz -9-19 f: fffffffflfffffffffff -2-6 t: rttqtstct -6-9 d: dddddtddddd -7-12 l: lllllllllllllll -1-12 p: gppppppplpppppp -1-4 s: fslssssssfcd -6-7 v: wvvzffggdfvbvvv -2-7 t: kkwgspt -6-16 n: nncbnnnntwrxlzzwdrsj -3-4 z: zzszzhrqwngprjt -4-5 v: vkvvvcfjc -4-5 j: hcjtj -2-4 k: kqkkkkkkkksk -7-9 g: gzgmgpgkv -5-9 s: kjnwsrjrzssssdlnsqs -2-8 j: jtjxxgmjkjx -5-12 r: bfrcrtjkzqffsjtvwj -1-2 v: xvvvmvvvv -5-9 v: vzrgdldfvx -3-5 m: mqsfmmlmvdfj -12-15 v: wswvvbqqhlvqvwx -6-7 b: bbmjdhb -2-4 b: hbjmjr -6-7 n: pnnnnln -13-15 z: zzlgzpmztfzqzzl -5-6 c: pcppscccccc -6-7 z: zzzzzzz -6-14 l: lllllllllllllqllqlll -13-16 r: rrrrrwrrrrrrhrrr -11-12 r: rrrrhrvhqmqrwr -15-19 w: wwwwwwwwwwwwwwwwwwdw -3-6 w: wwqxkw -17-18 z: zzzzzzzzszzzzzzczvz -3-4 g: lgxx -4-5 x: nsdxdskjxtrz -11-12 w: wvdgqppfwwdf -2-3 w: qgrz -7-8 w: wwrppwfwwrcwr -2-6 n: gtspnngz -3-7 j: jjpjjjzjjjjj -1-2 l: pllblvgmfjvv -15-18 r: rrlgctrrrcrqqgldpr -3-6 v: vvvvvt -2-10 s: vslltcxpbg -5-8 j: blvzjtjnfmjnjtsrzmc -9-13 b: bbbbbbbbbbbbsb -3-4 w: wwfjw -6-7 x: xxxxxxmx -7-15 g: ggggggrgggggggfggg -16-18 f: zffffffffffffffwfff -3-4 q: qcqn -3-4 k: kvzqk -4-18 z: wpclkbsxwbmbmkdpzzcm -1-8 z: zkzzzzzgzzzzz -7-16 x: xxxxxxxxxxxxxxjkxxx -3-6 t: xwcjztz -8-9 r: rdrprrtrs -1-7 v: dvvvvvcvvd -6-8 t: tttttkttt -1-5 w: xzwww -6-7 c: ctdjbwcc -3-4 t: ttnttt -9-10 q: qmcqqqsqqqvqqq -11-12 d: dpftdmdmdmld -7-8 j: tbjmbjlj -3-6 t: tttttqtt -6-8 t: tdttthbnqt -2-5 q: qqqqp -1-3 t: ttht -13-17 n: nnnnnnnnnnnnnnnndnn -4-6 j: ftkvjj -5-10 c: hvccfcsccb -7-11 v: vmqvqnnnvzglvvvv -5-8 k: kkkkkksckkk -1-12 z: rzzzzzzzzzzzzzzzvzz -17-18 t: tttttmtttmttttttpttt -16-17 z: xljjnngmjmhprcqzw -4-11 d: dtddbpddlhn -17-18 t: tptttttttttttttttbtt -9-12 w: wwwwwwwwwwwcw -3-4 z: zdzj -1-8 q: qlqqkqqhqtqhxqbbwcp -6-8 r: rkrrlrrmzrcnnrk -13-17 b: dbsbbbbbbbsbmkbbb -5-16 q: gqnvqwwgqshmtrdbplfb -7-9 c: mcvccccczc -10-11 p: pppxppppppc -1-6 v: vvvvvmvvvvv -5-6 s: ssssks -6-14 r: prgrbvrjrgrkrrr -2-11 c: qbnxcvxgldcvdd -11-15 d: ddddddddddsddddd -13-14 w: rwwwwwwwwwwwwsw -12-15 t: ttttttttttttttt -5-8 g: skjgxsjpgvsgr -5-11 g: ggddglggxgqgg -2-4 c: cccc -2-3 h: rvdg -9-13 r: rrrrrrrrsrrrjrrr -2-7 f: dflmgzsdftgkgc -1-5 f: jffffffnfcff -3-4 c: cccrqc -2-7 m: kblcghm -3-4 r: rscrnbbpfkr -2-3 d: wdtqpd -5-6 q: qqqpqnqq -13-15 d: ddddsdddddddddjd -3-4 c: cmcw -2-7 q: qqqqqqjqqqqbqfqq -11-14 x: txxxxpxdxxkxqcv -10-11 b: bbbbbbbbbkbb -7-11 p: ppppppppppmpv -5-6 r: dnxrcvrrr -1-4 d: rdddddd -5-9 f: lxgfvffdf -8-16 k: vmfksjkwkrkkkhkkvknk -15-16 v: vvvvvqvvvvvvvvgv -2-5 p: xpctr -11-15 w: wfwwwwwkwwwwwpr -11-13 x: xxxxxxxlxrfxxs -18-19 b: bbbbbbbbbbqbbbbbbbb -2-4 l: fgwl -8-11 m: xmjnmmmmnmh -4-6 g: lgvpksgq -5-7 t: jtgtvttjlfhpljtzzstd -7-11 p: mjcgvcmxgqpntxkpb -2-3 r: rrgrrnr -6-7 r: rrrrrcr -4-14 d: dddjdddddddddpdddd -5-7 q: qqqqkqqqq -1-4 t: qttqt -4-10 f: hbfjbzrfgvffq -16-17 j: wjjwjwpsjjdvfjnhv -3-4 v: vvtwv -5-6 s: ssdswspdss -1-2 r: rnrrmskrr -4-7 h: rqxbjjhsfh -4-9 l: llllllllhl -4-6 w: sgtwwmcpwd -4-11 l: fjdllznlllmdnll -4-5 k: kkklk -4-6 s: sszrssssssss -12-14 w: wwwwwwwwwwwvwww -2-4 b: vnzb -7-18 g: ggggggggggggggggggg -1-13 s: srjdvvpqnrsnnkzfj -14-15 g: bmhbclmqcgtqxgg -8-12 g: gggfhxgglgzb -3-5 c: scrkcshctccmhm -7-12 q: qklqqqhqvxqqqqw -1-6 m: mlmxzwkmm -3-16 r: rswggrrrrczxfpjt -14-16 l: llldlblllqllllns -2-5 w: wwwwmw -7-9 r: rrrhrprrr -2-3 j: zjmdfcth -3-8 w: xwgwwwwww -1-5 l: plllllll -2-4 b: fbqp -2-3 p: jwpmp -3-4 c: kscm -2-5 b: mbpbnfkvh -4-15 m: qrswmmmgmvmfqtmrrn -12-15 r: rxrrrrrdrhpfrrrrcrrr -10-13 j: jjljjjjjjnjjjjj -8-20 w: gjccptmwtrwxjtskrdfp -11-14 j: jjjjjxjjjjgjjk -1-4 g: gggzzgg -4-8 q: wqqqqblsmsk -1-11 h: lhhhfhhhhbvhhtjwrbh -4-8 x: xlxqxxtxxxxx -13-14 x: xxxxsxxxxxxxqxxx -12-16 b: bxvbbbqbbbbfzbblb -1-4 j: jzbd -5-6 q: qqqqwqkkqqq -2-5 x: xxxxgx -8-10 n: nnnnnnnnnhn -5-10 m: mmmmrmmmmmmmm -2-3 c: qwcz -3-5 n: cckvz -18-19 q: qqqqqqlqtqqqqqqqjqv -5-13 k: kkpkkkkkkkkklkkk -5-10 q: jfjgqllmqzv -15-17 l: llllllllllllllhll -4-10 b: pgqbfrsnvbhzfmtbtw -1-4 c: mccc -6-16 f: fffffpfffffffcfffff -4-9 j: qjbjlcsgljtbvv -11-12 z: dstqbtxxvdchsg -3-8 d: jvdpnvqs -2-3 n: nfvnnnn -6-12 r: zdbfdrvtmpkrjkr -1-15 k: kbdckwtkfhvrbjk -6-8 v: fvhsvgcv -2-3 p: ppkppp -2-14 r: drclhnrdhtcbmnr -7-10 p: vchpmlpjfxbfnwsdxjr -1-3 v: lvvv -1-3 b: bbjbb -2-12 q: qmxbbbgqlscqvdtpq -7-9 l: lllllkllqlllclll -16-17 r: hrrrrrrrrrrrrrrrr -8-9 g: gggggggfg -6-8 v: zvqffmkv -9-12 t: tttttznttjtfrtsjxtd -5-12 q: bqhbltqnjlhqqhtkq -8-9 d: ddddddddkd -2-8 q: tvpqmrrq -13-16 q: qqqgmqqqqqsqmqqpqqqs -7-9 p: pppppplppp -4-6 h: hhxhlhhhxhp -6-8 g: gggggdggggg -4-5 j: jjjkjj -4-5 x: xxxfg -2-13 x: xxhrhxwbrgrdskghtkj -12-19 x: cxxxxxxxxxxhxxxxxxx -1-4 m: tmmmm -5-11 x: mgqnkjxxscxdxr -3-4 t: tttctt -4-13 b: bfkbfbbwbcbpvcbkdqww -5-7 d: dwddddqd -4-15 l: lvvlfclwbssvsdl -9-14 d: ndkfnddtdddfjpvdqt -8-9 s: ssssssssk -9-13 l: dlljknlsllbslhlml -4-5 n: lnnwn -8-12 v: rlvbqlwvfhvv -6-7 f: rcpfwfvffqfcpf -10-11 g: rnqgxbtnxqfzgggtn -8-11 d: ntdzzddkbdhcdddrgdld -5-6 s: xkmssxscvbpwj -1-3 r: rrmr -9-14 p: pvppppppppppppppp -11-15 t: vhftnbtmwpgbcvt -2-7 t: pmbwnrj -10-11 c: cccccccdcvcc -9-14 s: ssksssssssssslsss -2-5 t: ctrtqpn -4-6 t: mttjftttt -4-5 z: zfbzz -2-3 x: xwxlwstzmvvt -4-5 b: vbsbjwpbsbbb -3-4 x: cwxxlmdf -5-6 z: zzzqszzzzzz -1-4 c: ncczc -3-6 k: kkkkkkk -2-3 z: rjzkpxxdvzlzxjzz -8-10 z: fzjzszzdnzbzkzzfz -1-9 c: ccccxccjpccccc -3-12 j: jjjjjjjjjjjcj -10-14 l: llplllvbllllsp -8-12 r: hnrcrxfzrkcjcprrzjbr -17-20 q: qqkqqqqqqqqqqqqbqqqh -6-9 l: lllljlrlpxllllll -8-9 v: vzzmtwfgv -3-7 v: fqdbsshw -12-13 f: fwffnjfbfffzzqfxfffx -1-3 m: zjmdvjjg -5-7 r: nrswrlbw -8-11 c: crzfvzpcbcbchgxbln -9-17 g: ggggggzgwwjpggpgvgrk -6-9 k: hhkrvkkqfhqwbdb -10-16 q: mzzjqfmtkqwvgdfttj -11-13 m: mmmmmmmmmmtmm -1-2 j: jjhrrj -3-12 h: hhhhhhhhhhhhh -8-11 w: zwkrwznrppw -7-14 d: dpxjnddbvdbcllqr -5-8 c: ccccfcccccc -12-16 p: tnptbppgwxxpppjb -1-14 t: qktttttttttttttt -9-12 t: tttttcttgjtt -3-5 p: tcpdgwhrkxkzjjhvsgqp -13-14 k: kkkkkkkkkkkkklk -11-13 x: xxxxxxsxxxxxt -5-12 n: nxxnnznnnnmlnnn -12-14 h: hhlhhhhhhhzcnnhhhhkh -8-10 j: jbjbjmjvjj -6-9 c: ccccccccsc -5-12 j: jjjjjjjjjjjcj -1-2 f: fhffff -13-17 x: xnlxxxxsxxxxxxxxp -2-5 d: sddzn -2-4 q: qqqt -2-6 p: fmxfxnkp -9-11 k: nkdgncqkkgwjp -2-5 p: hpmgcfcmz -1-3 f: ffczf -5-9 r: rtrrprrrrrr -2-4 p: pnpprdn -9-11 l: ltllbllvllc -4-5 x: xxxmxxx -5-9 x: xxxxxxxxxx -16-20 b: hgcbhbbhbgbbdxhdgjwb -10-15 c: qcccpcccdcccccfccwcf -10-11 x: xndsgkwqpxb -15-17 f: wwbqxrffgfvffdmdffw -5-6 q: qqqhqvqqqq -3-4 h: hhhchc -7-9 x: xxxxxxxxgx -7-8 f: fmfflfgf -12-13 v: vvvvvvvvvvvcvvvv -3-7 g: gggbggsgg -1-5 w: wpswsggtw -3-5 h: hhhhkhhhhhdhw -6-7 w: wwwwwmwwwww -5-11 m: mfdmcwmlvpmfc -14-15 j: jjjjjjjjjjjjjjrjj -3-5 v: rvtvkdvqv -3-6 p: frppxpdpg -3-5 t: ttttrt -2-7 x: xxwxxkfxxxxxxxxxxgxr -6-8 k: kkkkkpkgkkkk -10-11 f: fffffpfffkfdf -11-12 g: gggghgnggflg -1-7 x: xxnxxxxkxx -3-4 h: rhhx -6-8 r: bcwrrrrrhrxmqgrhrzm -2-6 l: mpdlnnp -2-4 j: jbjjdhx -2-15 d: dfdddddddnddddfzddjd -5-12 h: gbngwvffshph -1-2 t: txcpth -14-15 f: ffffkfflfffffgf -8-9 b: bbbbbbpbj -5-6 f: zffhfz -8-15 j: qjjfrtjllqfjjcj -3-5 l: llxllll -10-15 z: tpdzhnzkzrtzrzzzrfrz -3-5 q: qqlqq -3-4 d: vmzddpm -8-11 c: cmvzlxtqxcvckxqm -2-13 r: drpppdsqsmvnlkjb -7-9 w: wwwwwwkww -3-6 s: svfspfnpzq -3-4 b: fqpbbbbzpgqf -2-4 s: smssm -8-9 q: qqqqqlqbq -4-7 s: stcssbw -15-16 k: kkkkkkkkkkkkkkkk -10-13 x: xxsxxzxzxxsxphxxxxx -4-5 p: drpsx -7-11 v: vvvvvvvvvvvvv -14-15 n: nnnnnnnnnpnnnbnn -5-8 k: blgkkkkc -12-16 g: ggggggggggvggggggg -1-8 c: cccccccdc -3-9 p: ppqppppppp -7-9 q: cxqqqbhqqzhjqv -1-12 m: mrkvwmmsjmkmw -2-4 s: xrrj -2-4 w: mbww -7-14 v: vvvvvvvvvvvvvbv -3-8 p: kppjprpxppb -4-10 n: znncndnnjncnrnkn -5-7 k: kktnkks -10-13 r: rrrrrrrrrrrrnr -1-6 k: kkkkkrvk -3-5 k: jhjzkbqsjwkxsvd -5-8 p: pcqpprckrp -2-5 f: fsjwf -6-9 l: jxhtplclr -4-13 x: gdxdcdmmxlfxxs -2-10 v: vvvrvvvvvhvvvvvvvv -11-12 v: wqnwrlvjsxvs -1-4 m: mfqm -3-5 d: bmddv -8-10 h: hbhhdhfchh -4-5 s: sssdb -2-3 l: lsll -10-11 k: kkkkdcpnkkgkk -6-8 r: vrrrrxrrrrr -3-4 s: gxsbfr -17-18 p: ptppppppbbpbprpcqpp -16-17 s: gpgwvvnjbdqpksnsd -5-10 f: gfkfzqflfzffvf -6-18 m: kxxfrxjmwmltdvxwmmb -5-6 d: ddntbd -11-15 b: bbbrbhbgbbltbbhb -6-7 r: krbrrrp -5-6 q: qqqqqkqqqqq -3-6 k: kfkmjt -8-10 d: drbwtrdshdbg -13-15 n: tqnprfnndhplcjn -2-4 w: wjwg -10-11 p: xprpnpvhppp -9-10 r: rrrrrrrrqrrr -2-8 w: wjwnwhwwwwwww -12-13 g: gggggggggggwggg -1-6 s: sssssss -1-9 k: xkkkkkkkkkkkkkv -2-4 c: ccccc -3-7 s: ftssfrm -12-13 k: kkkkkkkkbkksk -9-16 q: qqqmqbbqhzqwtlwqb -7-9 p: ppppppppdppp -4-6 b: pcvbvkhb -9-10 g: qmchkfggmgpqgxxgxq -2-9 t: sthtnttthtlsq -3-4 x: xxxx -8-14 s: ssssssssdssssssss -1-3 m: gmbmvbmqbxvm -10-15 s: sgwkdvnsswsszwrn -3-4 s: gmgs -5-11 f: fffffffffffffffff -7-9 v: vvfvsvzdhvv -4-8 l: lllllllpllllllllll -11-16 x: xxxplxxxxxpxxxxxxxxx -9-13 t: tdtftttjdtttc -9-13 g: rknsckngkvdxg -3-4 d: sdqwddmr -1-3 l: lljl -7-17 r: trhrpmrqswrmnrbrrhb -7-8 g: ghkxwgttgk -5-7 b: fbnbtbndb -6-7 v: vnxlvgv -1-6 t: txtkttg -2-13 n: ljnnnnlpsnscfnnnnnnf -4-11 b: bbbbbbbbbbfb -6-9 x: wxdkxxnnnx -2-4 w: wswww -5-13 j: jjsjjjjjjjjjkjjjj -1-4 f: fszhf -5-9 z: wzgfpzzzzjszfvfpwz -5-9 x: xxxxhxxxsx -15-17 b: bbbbbbbbbbbbbbkbqb -2-7 x: xvdmgxxwgxx -3-4 q: qqqq -6-7 m: mqmlltc -8-10 k: kkkfkhkkkpkkkk -2-6 n: cnxnts -1-6 s: gsssssssssscssss -1-9 n: bbvkmnkdn -2-5 p: nmlhpv -4-6 g: vnggdpgm -7-12 b: bbbbbbvwsbbbbbbbbbbx -2-3 b: lgbjjr -7-12 n: chqccgnwsznngz -4-6 v: nntkvvv -2-5 g: qkrjgkqgljh -1-5 f: rffffsfzxfjfzffff -15-16 z: zpzzzzzzzzzhzzkszz -3-4 l: lmflkl -7-8 f: fffvzxff -2-4 r: rrrgrrrr -12-14 w: tjwgwkkwwwwwwwwww -2-12 m: mzmkmmmmmhmmcmmmrmf -5-7 q: nfqbgqqqpqqgjq -1-4 r: ktpr -5-6 j: jjjgbj -9-13 d: ddpbdddwbbdmd -8-9 r: rphfrrrsrr -10-12 f: fffffffffffbffpff -5-12 b: xhbbcbbbbxtbbb -9-10 j: jjjjjjjjqjjj -3-4 q: qqqn -3-9 r: srrtqqprjmqgnp -2-3 c: gcqc -3-4 c: bclc -3-6 n: jnxhshghnnqncgncn -2-4 h: ckhh -9-12 t: tdjjqcdbtkbtmb -11-13 x: cxxkxbxktxxxkxxxpxxh -4-14 m: hjqmqjvqgjdjzsssdkm -6-12 r: rrrrrlrrrrrrrr -14-16 g: gngggggkfglzgggv -9-13 h: hvhhdzhhmhhhh -3-15 x: xxjxxxxxxxxxxxbxx -10-12 z: zzzzzzzzzpzzz -3-4 h: dnhv -13-14 g: gggggggggggggg -7-11 r: rrrrrrrrrrr -6-9 x: czxxlsxxx -3-5 h: hhchh -1-9 j: jjjjjgdjjjjjjjf -7-10 b: ctsbpxrvwbkbjklghnbn -10-11 g: gggggggggglg -1-7 x: xnpsxfm -9-10 q: xxxzqbpdqj -4-10 q: pqsqbqcvllfn -11-12 x: xxxkxxxxxxgxxxx -3-12 s: pstrsssntsssssbssj -9-12 s: wnsdfrtssllsfbsssccb -1-6 r: nrrrrmrc -11-13 k: kkskkkbkkkzkkk -4-5 h: hhhhshh -5-19 f: ffffffffffffffffffcf -3-4 z: zczzz -5-8 l: ghlllsllfw -3-9 g: ggpngglkkf -7-9 b: xwbbbhhbmgjhbbbhnbb -4-5 c: cjmgczcccpzqr -15-16 j: jqfqsnnvffpjjjqj -5-6 z: zzzztvws -3-7 t: tftxtvfzs -1-5 l: tlllll -5-18 n: nnnngnnnnnnnnnnnnnn -5-6 m: bchzqm -9-10 p: lmpsbqgzpxggltl -2-9 h: hqdpjwpxhg -4-6 n: nqbnbnknnzd -2-7 q: qbqqqvq -7-8 c: cccccclc -8-12 r: rrkrrrprvrcqnr -14-15 j: jkpjjnjjjwjjjjjjhjwj -7-9 s: stsstspsn -8-11 h: hhhhbhhhhjhhhh -5-6 d: dddtpdd \ No newline at end of file diff --git a/day02/sample.txt b/day02/sample.txt deleted file mode 100644 index 2eab335..0000000 --- a/day02/sample.txt +++ /dev/null @@ -1,3 +0,0 @@ -1-3 a: abcde -1-3 b: cdefg -2-9 c: ccccccccc \ No newline at end of file diff --git a/day02/solution.spec.ts b/day02/solution.spec.ts deleted file mode 100644 index dce577c..0000000 --- a/day02/solution.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { loader } from '../lib/loader' -import { - findValidPasswords, - LegacyPasswordChecker, - TobogganPasswordChecker, -} from './findValidPasswords' - -const load = loader(2) -const sample = load('sample') -const input = load('input') - -describe('Day 2: Password Philosophy', () => { - describe('Part 1', () => { - it('should solve the sample', () => { - expect(findValidPasswords(LegacyPasswordChecker)(sample)).toEqual(2) - }) - it('should solve', () => { - expect(findValidPasswords(LegacyPasswordChecker)(input)).toEqual(424) - }) - }) - describe('Part 2', () => { - it('should solve the sample', () => { - expect(findValidPasswords(TobogganPasswordChecker)(sample)).toEqual(1) - }) - it('should solve', () => { - expect(findValidPasswords(TobogganPasswordChecker)(input)).toEqual(747) - }) - }) -}) diff --git a/day03/countTrees.ts b/day03/countTrees.ts deleted file mode 100644 index bb263f6..0000000 --- a/day03/countTrees.ts +++ /dev/null @@ -1,20 +0,0 @@ -const tree = '#' - -export const countTrees = ({ - down, - right, -}: { - down: number - right: number -}) => (slopes: string[]): number => { - const width = slopes[0].length - let currentSlope = down, - currentIndex = right % width, - numTrees = 0 - do { - if (slopes[currentSlope][currentIndex] === tree) numTrees += 1 - currentSlope += down - currentIndex = (currentIndex + right) % width - } while (currentSlope < slopes.length) - return numTrees -} diff --git a/day03/input.txt b/day03/input.txt deleted file mode 100644 index 43deaca..0000000 --- a/day03/input.txt +++ /dev/null @@ -1,323 +0,0 @@ -......#..##..#...#...#.###..... -#..#............#..........#... -..........#....#..........#.... -....#..#.#..........#..#.....#. -#.......#...#......#........### -#####........#.#....##..##..#.. -......#.#..#..#..##.#..#.##.... -.#..#.#..............##....##.. -..##......#....#........#...### -...#....#.#....#.#..#......#..# -..................#.....#.....# -#.#...#...#....#............#.# -.#...#.....#...##........#..... -...#....#........#..#....#..### -#...##.....##.#.#...........#.# -.###........#.#.#.........#.... -...#.............###.....#.#..# -.####.#..#....#.....#.........# -.#.#........#.#.....#.....#.... -.#.......#................##.## -...#.#..#...###.....#....#..##. -...#....##..#............##...# -#...#............######...#.##. -.........#........#.#...#..##.. -.....###..#.#.....##.#.#......# -..#.#...#.#..#.#.##..#.....#.#. -..#......#.#....#...#.......... -..#...#.....#.#...##.....#..... -.##...........####........##... -....#............#.#........... -.....####.........#.##....###.. -#..#..#.#..............#.#..... -...#.#........#.........#...... -......#.#.#...#.....#....#..... -........#.#...#####..#..#...... -.....#.#....#....#...........## -.#...#.........#.......##...... -.#.##..##......#............... -...#.....#.......#.#.#......... -.........#..#...#...#.#.##....# -.#......##....#..#.........#... -....#.....#........#.........## -......#...........##........... -.....#..............###.#....#. -........#..#...#..#..#..#..#.#. -.#.....#.##.#..#..#.#.....#.... -...#....#...#.#.....##.#...#..# -#..#......#..#.###...........#. -.##...##.#........#.#......#.#. -...#.#..#.#.......#..###...##.. -#.......#.#....#..........#.... -.#.....#..#.#.#..#..#........#. -.#...#......#.#...#.##.....#.## -...######..#.#....#.........##. -#.#.......................#.... -..#..##...#...#.#..##.......#.. -.##..#.......##......##.#..#... -#.#....##.......#..#........... -..#...#............#..#........ -........#.#.........#...#..#..# -.#...###...............##...#.. -...........#.....#....#....###. -#..#....##..#................## -...#.#..#..##......#....##....# -...#.##...#....#..#....#....... -#...##..##.#.........#...#....# -.##........###.#..........#.... -..#..#..#...#.##..#.#......#... -.......##..#....###.##.....#..# -#....#...#.#.....#..###....##.. -.#.......#.........#....#.#..#. -.........#.......#.#.......#... -..........#...##..#...#....#.## -..#........#.......#........... -#....#.....##......#....#.#...# -......#.....#....#.....#..#.... -.#....##...#...##.............. -..#....#......#...#....#...#... -#....###...##..#.#....##......# -..#.......#.........#..#......# -...#...#.##.......#....##..#... -..#.#...#.##..#..#..#...#.#...# -.#.........###....#....#.....#. -.#.##.#..##..#...........#....# -....##..#..##.#.......#....#..# -....#..#.........##..#......#.# -..........#.#.#....##.#......## -.##...#....###...#..........#.. -#..#.....#..#.#.#.#..#......#.# -......#....#......##.#......#.# -...#.....#.......#....#.......# -.#.#................#.......... -......#..#..#...............##. -##......#...#.####....#.#.#.... -...#..##............#....#..... -..#..#.#...#..................# -.##.#.#..##.###.....#..#....... -..#...#.#...#......#..#........ -.###..........##...###..##..#.. -#.#...#........#.......##...... -..##...#........#....##...##... -.......#.##.....#.#.##..#..##.. -........#............#....##... -...#.#.#..#.........#.#.......# -..#..##.##...#.##...#....#...#. -.....##.#...##............##... -.#...#.###....#.......#...#...# -.......#######.#....#.....#.#.. -......#.......#............##.. -.....#...........#......#.....# -........#....#.##.#............ -.#........#.......##.#.#....#.. -#.....#..####.#................ -.....#.......................## -.#.....#..##.#..##........#.#.# -#...##....#..##................ -......##.###..........#.....#.. -.#........#...#..............## -..#..........###.........#..... -....#.....##....#..#..#.#.#.... -....#.......#.##...#.####.#.... -#........#............#.##..... -..#......##.....#..#...#....... -..#......###...#.##......#..#.. -#..#..#............#..#.###.... -...##.........#..##...#..#.#... -..#.###..#.##.#........#..#.... -......#..###.#........#........ -.#....#.#..#.....#..#..#....... -#.....##.##...#...###.#.#..#.#. -.#....#..#.........#..#....###. -......##.####...#....#........# -##..#........#..#..##...#...... -#.........#.........#...#..#.#. -..........#...................# -###....#....#....#......###...# -#....##........#..###.#..#..... -.#......#.....#.#.........#..#. -...#.......##.....#.........### -..............#........#.....## -....#.#..#.....###.#....##..... -.........#..##.#....#.#........ -...#....#.......#.#.#..#.#....# -...........#...#..........#.#.. -#.................##........### -####..#.#..#...#.....###....... -..#.#......##.#.......#........ -.......##........#..#.....#..#. -...#..#......#..#.#.......###.. -#....#...##..#.#.#.#.........#. -....#....#....#.#..#..........# -...###........#.#.###......##.. -................#.....#.#...##. -..#..#.###...........#...###.#. -.........................#..#.# -#...#..#..##.###.....##.##.#... -...#..................#.#....#. -......#..##.#.......#.......#.. -.##....#.#................#.... -.#...#..#.#.#....##....#....... -.##......#.....#..........#.... -..#...........#..##.........#.. -....#.#...........#..........## -....#.#.#...........#.#........ -......#.....#..#....##....##... -............##...##......#.#.## -#.#.....#..#....#..#...#.#...#. -.#...###..#..#.......#.......#. -.....#..#.##.....#....#...#.... -##.....#..##.......##..#.#.#..# -....#.#......##....#.....#..### -.#...#.#......#.##...#..##..... -.#...#...#......##..#..#...#.#. -.#.........#....##...###...##.. -###.....#......####.....#.#.... -.....#..##.##................#. -.#.................#...#..##.#. -....#....#..#.......#.....#.... -.##....#..#..#.....###.#..#..#. -#.#.......#.....##...#.....#... -#.#........#.#.###...#....#.... -.#.....#.....##.#...#..#....... -..###.#............#...##.###.. -.....#.....#..#..##............ -.#.#..#.#..##..#....#...##..... -.#...........#..#.......#...#.# -#.#.#.#.....##....#............ -...#.................#.#......# -.....##.............#...#.#.... -.##......#.#....#..........#.#. -.#.##.......##...#...#.....#.#. -#...#.#........#......##....#.# -#....##....#....#...#..#..#.#.# -......#..........#...#.....#..# -#..#....#....#..##.#..#.#...#.. -......#..#.#....#.....#.#..#..# -...#.#...###........#.#......## -..#............................ -...#.#..##...##...#...#......## -...#.####......#.........#....# -.#...#.#...##....#......#.#.... -.#.....##..##.#................ -.#...............#............. -......#.....#...#..##..##...... -...#..##.......#.......#..#.#.# -......##.....#..#.....#...#.#.# -........##........#.#........## -.#....#.....###..#.......#...#. -#...#....#.........#.......#... -...##..#........#####.#........ -###..#....#.#..#...#.####...... -..#..........#.#.............#. -#......#.#....#.#.#....#.##.... -.#.#.#.............#....#...#.. -......#.....#.#...#..###.#..#.. -.....#..#............#...#...## -..#......###..#........#.#..... -#..##......#.#.#.#...........#. -#..#...##.##.....#....#..#..... -...##.#..........#.#....#...#.. -.#.#.#.#..#.#...#......#....... -....#......###.#............... -.........#...#....#...#.#....#. -##.#.........#...##............ -........#..........#.#...#..... -..#........#....#.......#...... -#..#...............#..#...##.#. -#........#.....##.#..#....#...# -..##....#....#.#...........##.. -....#.#.........#..#.....#..#.. -.......##....#.#.#....###.#.... -......#....#.#...#..#.........# -.....##..#....#.#......#.#.#... -#.##..##.#.......#..#...##.#.## -........#.#..#...##.#.#..#..... -#..#......#......#...#.#..#.... -.....#......#.#....##....##.... -....#.##...##..#..........##.#. -.#....#.......#.........#...... -.#.......#.#...#............... -....#.##.......#.##..#.##..#... -#..#.......#.....#..#.......... -..#.##.......#....#.#..##..#... -.#.....#...##.#.#..#...#....... -.......#.........#......#.#.... -#.##.....##.......#....#....... -##.#.#.........##..#.....#....# -....#.#.#.#....#..#..##.......# -#...#...........#.#............ -...#...#.#..#..##.............. -......#.......#.........#..#.#. -#.....##.#....#...#..#......... -#...#..###.##..###...##.....#.. -#....#.#.#...#.#..........#.... -................#.#....#.....## -#.##..............####.....#.## -................#.....#........ -#...#..#......#.....#......#... -.........##...........#...#...# -#.#....#...##.....#.....#..#..# -.....#...##..##.............#.. -....###.#.......#.........#...# -..#.......#......#..#...#.#.... -#.#....#......#.##....#.##.#... -.#.#...#.......#.#...#.##..#... -..........#......#.....#....... -........#...#.....#...##...#.#. -.....##....#.##..#........#.##. -..........##.....#..#........#. -.#....#..#.......#.##.......... -.#..#..#...#...#........#.##... -.#...#.##.......#...#........#. -.....#....#.............#..#... -...#....##...#...#.....##...... -#.#####.........##...#.....#... -......#.......#....#.....#..#.. -..#..............#.#..#..#..... -....#.................#...#.... -###.#..##.#....#...#.#......#.# -..##......#.#........#.#...##.. -.....#...#...#..#.#..#..##..#.. -.##...#......#...#...##.#...#.. -.......###.#...........##.##... -.#.##..#.#.###.......#..##...#. -..#....#.......#..##......#.... -.#....#.#..#..#.#.#....#...#... -..........##....#....#.#....... -.....#.......#.#..###.#.###.... -.#.#....#.##..#.#..#.....#.#.#. -....#.....#.#.#............#... -.###....#...##......##..###..#. -...#.#..#.....#...#....##..#... -.#.#....#..........#...##.....# -#.....##...#........#.#..##..#. -.......#....#.#..........#...#. -.........#..#.#.###.........##. -..................#.#....#....# -....#....#.#..#.......###.##.## -....#...#.................#.... -...#..#####.......#.#..##.##... -##.#....#...............#..#... -....#..........#...........#.#. -..##.#.##.#..#.#....#.......... -.....#....#....##.#....#....#.# -.......#..##.....###...#....#.# -.#.......#..#.#.#...........#.. -.#...........##.#.##....#.#.... -....#.#....#.#.#......##....... -.........##......#.#.....###... -........#.#...#.##.....#.##.##. -##.#..##.#.........#....#...... -.#.#.#....#..........#.#....#.. -....###.........#.#.#.......... -#..#....##.....#............... -#.##....#.#...#.....#......#.#. -............#.##........#...... -.....#.#.....##..##............ -.##..........#.......#......#.. -...##..##......#.....#..#....## -.##.##...#.................##.. -#....#.#........#..#....#..##.# -....##..##......#....###.#.#..# -.....#....#..#..#...##...#...#. \ No newline at end of file diff --git a/day03/sample.txt b/day03/sample.txt deleted file mode 100644 index 8f551de..0000000 --- a/day03/sample.txt +++ /dev/null @@ -1,11 +0,0 @@ -..##....... -#...#...#.. -.#....#..#. -..#.#...#.# -.#...##..#. -..#.##..... -.#.#.#....# -.#........# -#.##...#... -#...##....# -.#..#...#.# \ No newline at end of file diff --git a/day03/solution.spec.ts b/day03/solution.spec.ts deleted file mode 100644 index 6596f9b..0000000 --- a/day03/solution.spec.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { loader } from '../lib/loader' -import { countTrees } from './countTrees' - -const load = loader(3) -const sample = load('sample') -const input = load('input') - -describe('Day 3: Toboggan Trajectory', () => { - describe('Part 1', () => { - it('should solve the sample', () => { - expect(countTrees({ down: 1, right: 3 })(sample)).toEqual(7) - }) - it('should solve', () => { - expect(countTrees({ down: 1, right: 3 })(input)).toEqual(274) - }) - }) - describe('Part 2', () => { - const slopes = [ - { right: 1, down: 1 }, - { right: 3, down: 1 }, - { right: 5, down: 1 }, - { right: 7, down: 1 }, - { right: 1, down: 2 }, - ] - const mul = (prod: number, n: number) => prod * n - it('should solve the sample', () => { - expect(slopes.map((s) => countTrees(s)(sample)).reduce(mul, 1)).toEqual( - 336, - ) - }) - it('should solve', () => { - expect(slopes.map((s) => countTrees(s)(input)).reduce(mul, 1)).toEqual( - 6050183040, - ) - }) - }) -}) diff --git a/day04/input.txt b/day04/input.txt deleted file mode 100644 index 127dae0..0000000 --- a/day04/input.txt +++ /dev/null @@ -1,1121 +0,0 @@ -eyr:2024 pid:662406624 hcl:#cfa07d byr:1947 iyr:2015 ecl:amb hgt:150cm - -iyr:2013 byr:1997 hgt:182cm hcl:#ceb3a1 -eyr:2027 -ecl:gry cid:102 pid:018128535 - -hgt:61in iyr:2014 pid:916315544 hcl:#733820 ecl:oth - -hcl:#a97842 -eyr:2026 byr:1980 ecl:grn pid:726519569 hgt:184cm cid:132 iyr:2011 - -ecl:grn hcl:#6b5442 pid:619743219 cid:69 hgt:176cm eyr:2027 iyr:2012 -byr:1980 - -ecl:brn byr:1969 iyr:2014 -hgt:164cm eyr:2020 pid:982796633 hcl:#602927 - -ecl:gmt -iyr:1987 eyr:2039 pid:15115163 byr:2006 -hcl:bfab0d - -cid:117 -hcl:#efcc98 -iyr:2010 pid:322719183 -hgt:176cm -eyr:2020 -byr:1957 -ecl:brn - -byr:1954 hgt:178cm hcl:#38f7fd pid:838813262 ecl:blu -eyr:2029 iyr:2019 - -eyr:2023 ecl:amb iyr:2020 byr:1927 pid:242570886 hcl:#18171d hgt:192cm - -iyr:1990 cid:295 hgt:131 pid:187cm byr:2014 -ecl:xry hcl:z -eyr:1928 - -ecl:hzl -byr:1953 -eyr:2023 hcl:#866857 -hgt:181cm iyr:2010 pid:568185567 - -byr:2030 hcl:#fffffd ecl:#a4a596 hgt:168cm -iyr:1936 eyr:2020 cid:296 pid:168786676 - -byr:2030 iyr:2026 eyr:1974 hcl:7fcaa5 ecl:utc -pid:190cm -hgt:67cm - -byr:2023 eyr:2037 hgt:59cm -ecl:lzr hcl:z iyr:2026 pid:#ea9083 - -byr:2003 hcl:z hgt:91 iyr:1990 eyr:2024 ecl:#123d73 -pid:48494230 - -byr:2022 eyr:2020 iyr:2030 ecl:gmt -hgt:191cm pid:3509331253 hcl:#888785 - -iyr:1994 -ecl:#c3d564 byr:2009 -hgt:162cm hcl:336498 pid:#e99d09 -cid:288 -eyr:1921 - -byr:1924 cid:290 iyr:2010 ecl:amb eyr:2020 -hgt:156cm hcl:#7d3b0c pid:795497164 - -cid:301 iyr:2017 hgt:67cm -hcl:#888785 ecl:#0405b9 byr:1964 pid:707857518 eyr:1976 - -ecl:gry pid:474303066 -iyr:2011 hcl:#18171d hgt:165cm byr:1921 eyr:2024 - -hcl:#6b5442 ecl:amb iyr:2020 hgt:191cm -byr:1949 cid:301 -pid:075846582 eyr:2029 - -hcl:#a97842 cid:186 iyr:2014 -ecl:gry -hgt:191cm eyr:2023 pid:645548969 -byr:1956 - -pid:154cm hcl:z ecl:gmt iyr:1989 hgt:69in cid:53 byr:2010 - -hgt:72cm byr:2023 -eyr:2034 hcl:z ecl:#f5249e iyr:1997 pid:#79af7a - -eyr:2038 byr:2015 -hgt:70cm ecl:grt hcl:9d58a1 iyr:1926 pid:6290928420 - -pid:620857794 eyr:2022 -byr:1950 -hgt:159cm -hcl:#ceb3a1 ecl:amb iyr:2015 - -eyr:1954 ecl:#ab2ce4 pid:#14eedd -iyr:2009 -hcl:29e484 -byr:2022 hgt:73cm - -hgt:59cm byr:2026 cid:245 iyr:2020 -eyr:2029 pid:073943129 ecl:hzl -hcl:#b6652a - -iyr:2014 byr:2015 hcl:#a97842 eyr:2029 -pid:#132098 -hgt:150 ecl:oth - -hgt:151in ecl:#967d49 eyr:2026 hcl:#18171d -pid:384230726 byr:1934 -iyr:2018 - -iyr:2020 eyr:2021 byr:1937 pid:735047371 cid:159 ecl:blu hgt:177cm hcl:#22b774 - -ecl:brn hcl:#6b5442 pid:117807698 cid:105 iyr:2016 byr:1977 hgt:183cm - -ecl:hzl hcl:#6b5442 byr:1933 -iyr:2019 pid:348486702 -eyr:2020 hgt:193cm - -byr:1928 -ecl:gry -eyr:2028 hcl:#fffffd pid:571149069 -iyr:2012 hgt:175cm - -pid:359108298 -eyr:2027 hgt:158cm ecl:amb iyr:2016 -hcl:#602927 - -iyr:2027 byr:2015 -hgt:191in pid:102033301 ecl:xry -eyr:2031 hcl:#602927 - -ecl:oth cid:163 hcl:z iyr:2014 -byr:1944 hgt:173cm -eyr:2027 pid:#0524c1 - -ecl:brn -byr:2030 hgt:71cm eyr:1931 cid:165 iyr:2010 hcl:#cfa07d -pid:509642098 - -hgt:166 iyr:2020 cid:308 -eyr:2022 pid:950463527 -byr:2017 -hcl:z - -ecl:amb -eyr:2023 byr:1924 -pid:901038027 hgt:70in -iyr:2010 hcl:z - -byr:1972 -iyr:2013 -hcl:d669ad hgt:64cm cid:247 ecl:#19aa26 eyr:2023 - -hgt:71 hcl:#fffffd -byr:1976 cid:108 eyr:2038 -ecl:grt iyr:2018 pid:190cm - -iyr:2017 -byr:1963 ecl:grn hgt:175cm -pid:160915270 eyr:2028 hcl:#cfa07d - -pid:569740130 hgt:171cm hcl:#733820 -ecl:gry eyr:2024 iyr:2020 byr:1973 - -byr:1937 -iyr:2016 ecl:gry hgt:181cm pid:521705827 hcl:#b6652a eyr:2027 cid:295 - -hgt:156cm ecl:blu iyr:2019 hcl:#866857 -pid:662418718 byr:2000 eyr:2024 - -byr:1971 pid:693616099 -hcl:#efcc98 -hgt:175cm iyr:2016 ecl:gry -eyr:2023 - -iyr:2013 -eyr:2024 -ecl:gry -pid:414295491 byr:1986 -hgt:188cm hcl:#b6652a - -eyr:2022 byr:1975 iyr:2020 -ecl:grn cid:68 hcl:#a97842 -hgt:151cm pid:229803943 - -cid:258 iyr:2012 -ecl:hzl -byr:2001 -eyr:2021 -hcl:#866857 pid:990590217 hgt:172cm - -cid:339 byr:1957 hcl:#866857 pid:343480061 eyr:2039 -hgt:191cm -iyr:2021 -ecl:utc - -cid:281 hcl:z ecl:blu -byr:2020 pid:132694306 eyr:2020 iyr:1953 - -hcl:#602927 -byr:1933 eyr:2028 -hgt:165cm ecl:gry iyr:2018 pid:658484617 - -ecl:oth -hgt:188cm cid:110 pid:056975690 iyr:2016 byr:1950 eyr:2023 hcl:#cfa07d - -cid:342 hcl:#fffffd eyr:2024 -pid:153555359 byr:1974 -ecl:gry hgt:191cm iyr:2020 - -byr:2019 ecl:#160ed3 eyr:1999 hcl:z -cid:146 pid:195693972 hgt:159cm - -iyr:2015 eyr:2030 hgt:191cm byr:1979 -ecl:#ec4873 pid:994113786 hcl:#cfa07d - -pid:552331609 -ecl:grn -hgt:171cm eyr:2022 hcl:#b6652a -iyr:2020 byr:1931 - -hgt:177cm iyr:2010 pid:934058099 -eyr:2020 -ecl:blu -byr:1967 -cid:112 hcl:#7d3b0c - -iyr:2028 -hgt:138 -cid:180 hcl:z -eyr:2022 pid:3286566621 byr:2002 - -eyr:2020 -iyr:2019 -hcl:#a97842 pid:149148750 ecl:brn hgt:159cm -byr:1981 cid:339 - -cid:344 -eyr:2021 byr:1968 pid:777786047 -ecl:grn hgt:192cm hcl:#888785 -iyr:2015 - -hgt:173cm -eyr:2030 -hcl:#733820 pid:610226642 byr:1954 cid:80 -iyr:2013 ecl:blu - -byr:1999 eyr:2023 -ecl:amb pid:912145128 -hgt:181cm -iyr:2015 hcl:#a97842 - -eyr:2027 hgt:188cm -pid:080715145 hcl:#341e13 iyr:2013 -ecl:oth -byr:1965 - -hgt:170cm byr:1950 iyr:2013 -pid:010541784 -eyr:2027 ecl:zzz -hcl:a3bae8 - -hgt:190cm eyr:2024 ecl:#6dcedc pid:909319684 -iyr:2011 byr:1959 hcl:z cid:182 - -eyr:2028 -iyr:2016 hcl:#623a2f pid:208417572 byr:1929 cid:137 ecl:hzl -hgt:167cm - -hcl:#6b5442 -ecl:grn -byr:1938 -eyr:2023 cid:307 -hgt:59in iyr:2014 pid:205268145 - -pid:047489285 eyr:2026 -hcl:#b6652a byr:1920 -iyr:2015 -hgt:183cm ecl:gry - -ecl:blu hcl:#508e8b iyr:2016 eyr:1954 hgt:151cm pid:086752750 byr:1920 - -iyr:2011 byr:1981 hgt:186cm -cid:117 hcl:#6b5442 ecl:amb -pid:756830713 eyr:2026 - -eyr:2037 pid:364464758 hcl:z ecl:grn -hgt:112 iyr:2013 byr:2022 - -ecl:hzl -cid:65 pid:679487194 -byr:1986 hgt:169cm hcl:#cfa07d eyr:2025 iyr:2013 - -cid:192 -byr:1921 pid:#5fe831 ecl:#fbb2b9 hgt:62cm eyr:1971 iyr:2024 -hcl:z - -hcl:#cfa07d eyr:2026 -hgt:74in -iyr:2019 -ecl:xry -pid:622690982 byr:1982 - -eyr:2026 pid:523515724 iyr:2013 byr:1973 hgt:167cm -ecl:grn hcl:#866857 - -byr:2009 -eyr:1985 pid:484497014 ecl:#0bfcf2 iyr:1992 cid:131 hcl:39d6b0 hgt:177in - -eyr:2020 iyr:2016 ecl:brn hcl:#ceb3a1 byr:1966 pid:696621560 cid:62 -hgt:59in - -hgt:166cm hcl:#7d3b0c -iyr:2016 -ecl:brn pid:190cm -eyr:2020 -byr:2001 - -eyr:2021 -iyr:2012 hcl:#6b5442 -ecl:amb hgt:169cm -pid:969150085 -byr:1925 - -ecl:brn hgt:175cm byr:1992 iyr:2016 pid:415209726 eyr:2027 -cid:72 hcl:#866857 - -iyr:2017 -hcl:#733820 byr:1938 eyr:2020 pid:274486958 hgt:163cm - -hcl:4f5dd1 cid:336 ecl:grn iyr:1931 pid:6212280197 -byr:2016 eyr:2037 -hgt:187in - -iyr:2017 byr:1940 eyr:2025 pid:115098205 hgt:151cm -ecl:grn -cid:122 -hcl:#6b5442 - -hcl:#efcc98 -iyr:2020 pid:709548547 hgt:179cm -eyr:2030 ecl:gry byr:1975 - -cid:217 hcl:#888785 eyr:2029 -ecl:hzl iyr:2013 pid:160053490 -hgt:166cm byr:1992 - -eyr:2024 cid:188 iyr:2016 hcl:ff3a59 ecl:xry pid:296357512 byr:2026 - -hgt:154cm iyr:2010 -ecl:blu pid:717041634 byr:1928 cid:123 -eyr:2027 -hcl:#a97842 - -pid:391011205 ecl:hzl hgt:191cm iyr:2016 eyr:2028 cid:281 byr:1934 - -byr:1937 hgt:65in -pid:667975382 ecl:gry cid:270 eyr:2024 -iyr:2012 - -hgt:179cm pid:065528723 -hcl:#888785 byr:1937 eyr:2028 -iyr:2013 ecl:hzl - -iyr:2027 cid:261 eyr:2037 ecl:#ced7d5 pid:157cm -hcl:3a80c1 byr:2029 hgt:187in - -eyr:2028 -hgt:157cm hcl:#733820 -iyr:2012 ecl:blu byr:1952 pid:915063263 cid:335 - -eyr:2023 hcl:#efcc98 pid:490625944 byr:1961 ecl:grn hgt:155cm iyr:2018 - -cid:247 pid:2807544665 eyr:2021 -ecl:oth -hgt:191cm -byr:1928 -iyr:2013 hcl:#623a2f - -eyr:2015 -byr:2021 -hcl:40d2fc hgt:69cm pid:159cm ecl:gmt - -hgt:175cm eyr:1992 cid:328 pid:263110997 ecl:#e53989 byr:2014 hcl:#a97842 iyr:2026 - -pid:491396731 eyr:2027 hgt:172cm hcl:#623a2f cid:92 iyr:2017 byr:1983 ecl:grn - -hcl:#fffffd -iyr:2018 byr:1983 pid:714591144 ecl:grn eyr:2021 -hgt:160cm - -eyr:2027 -hgt:63in ecl:blu byr:1987 pid:397963077 iyr:2018 hcl:#ceb3a1 - -eyr:2027 -hgt:184cm -hcl:#6b5442 iyr:2012 byr:1984 ecl:blu pid:196287205 - -iyr:1998 -ecl:hzl -pid:7872103596 byr:1991 -cid:275 eyr:2039 -hgt:174cm hcl:0d2ad6 - -iyr:2010 hcl:#efcc98 -byr:1992 hgt:65cm eyr:2038 pid:383236012 cid:68 ecl:lzr - -hgt:190in cid:127 -byr:1947 pid:515728209 hcl:#733820 iyr:2014 ecl:amb eyr:2020 - -iyr:2017 eyr:2028 -hcl:#623a2f -byr:1964 ecl:grn pid:198467794 hgt:169cm - -ecl:utc -hgt:59cm byr:2007 iyr:2030 -hcl:7ac4db eyr:2038 pid:#7206c6 - -iyr:2010 -hcl:z eyr:2021 ecl:brn -hgt:173 cid:86 -pid:194240791 byr:1975 - -pid:9347286034 -hgt:63cm -iyr:1992 eyr:2034 hcl:66031b ecl:grt byr:1929 - -pid:593398904 byr:1939 iyr:2019 hcl:#b6652a ecl:gry eyr:2023 -hgt:70cm - -byr:1991 -iyr:2019 hgt:164cm pid:282852411 cid:340 ecl:amb -hcl:#341e13 eyr:2027 - -eyr:2020 -iyr:2014 ecl:grn hcl:#866857 hgt:158cm -byr:1931 pid:321748597 - -cid:98 byr:2023 iyr:2019 pid:#48f79f -hcl:73c882 eyr:1973 hgt:151in -ecl:utc - -iyr:2023 -hcl:#18171d -pid:52221892 eyr:2039 -byr:2008 hgt:72cm ecl:#db8d14 - -iyr:1966 cid:274 -eyr:2034 pid:12256322 -byr:2006 ecl:dne -hcl:985c2d - -hcl:#fd033b -eyr:2026 ecl:blu -iyr:2016 -byr:1953 hgt:157cm -pid:502619036 - -byr:2015 pid:159cm iyr:2025 -hgt:158cm eyr:1943 hcl:z ecl:grn - -ecl:blu iyr:2016 -pid:842400950 -hcl:#733820 -cid:266 -eyr:2027 byr:1931 -hgt:161cm - -iyr:2017 hgt:190cm byr:1994 pid:706570967 -ecl:hzl hcl:#18171d -cid:180 - -cid:197 pid:204952666 ecl:amb -hgt:70in iyr:2016 byr:1936 hcl:#98cbe3 eyr:2025 - -pid:555499128 -byr:1971 hgt:71in -cid:83 ecl:blu -hcl:#cfa07d eyr:2027 - -ecl:hzl iyr:2014 -pid:30428184 cid:237 -hgt:171cm byr:1942 hcl:#888785 eyr:1986 - -eyr:2025 -pid:579385370 hgt:193cm -hcl:#c0946f byr:1979 iyr:2016 -ecl:amb cid:284 - -eyr:2029 byr:1946 pid:278271295 -ecl:grn -hcl:#cfa07d cid:271 -hgt:172cm -iyr:2020 - -pid:731752614 eyr:2020 byr:1983 -cid:248 ecl:oth hgt:179cm -iyr:2017 hcl:#fffffd - -hcl:z -cid:203 eyr:2032 ecl:#3f9d3d hgt:65cm pid:4042846885 byr:2019 -iyr:1946 - -hgt:171cm ecl:gry eyr:2027 -iyr:2013 -hcl:#7d3b0c pid:92288579 -byr:1955 - -ecl:brn hgt:164cm byr:1969 hcl:#cbf9c9 pid:022724981 eyr:2030 iyr:2013 cid:244 - -hgt:162cm byr:1974 iyr:2015 pid:927525094 hcl:#3d3011 ecl:blu -eyr:2023 - -hgt:157cm -eyr:2020 -pid:221286943 hcl:#fffffd ecl:amb iyr:2018 byr:1945 - -iyr:2019 -eyr:2025 byr:1997 pid:341544323 hgt:174cm cid:113 -ecl:hzl - -pid:138492032 hcl:e35302 ecl:#caaede -eyr:1931 -byr:2001 hgt:156 iyr:1998 - -pid:912182030 cid:189 hgt:162 hcl:#277b39 -iyr:2013 eyr:2023 byr:2023 ecl:blu - -eyr:2027 hcl:#fffffd -ecl:brn -cid:304 iyr:2016 byr:1969 -pid:866607511 hgt:192cm - -hgt:64in -ecl:amb -byr:1958 -pid:720439412 -iyr:2015 eyr:2022 hcl:#ceb3a1 - -eyr:2024 hgt:159cm -pid:187867283 iyr:2016 -ecl:oth hcl:#fffffd -byr:1988 - -ecl:#910bf2 byr:1969 iyr:2011 hcl:z eyr:2024 pid:579502502 -cid:103 hgt:174cm - -pid:718692455 -eyr:2028 -iyr:2016 -hcl:#602927 -ecl:blu byr:1954 -cid:251 hgt:182cm - -eyr:2021 hcl:#341e13 ecl:amb -byr:1933 hgt:179cm iyr:2011 pid:083172316 - -iyr:1998 hcl:z eyr:1944 -byr:2006 pid:453368738 -hgt:160 ecl:#9da5f1 cid:261 - -hcl:#7d3b0c -iyr:2018 -hgt:164cm eyr:2020 byr:1940 ecl:blu - -pid:993701676 eyr:2028 ecl:gry -byr:1951 hcl:#888785 cid:116 -iyr:2020 -hgt:192cm - -hcl:z eyr:2033 -ecl:lzr iyr:2029 cid:326 hgt:68cm byr:2026 -pid:96742419 - -hcl:#a97842 ecl:brn -byr:1920 -hgt:173cm iyr:2015 -eyr:2024 pid:176967666 - -byr:1930 eyr:2025 pid:792694131 -hgt:179cm ecl:brn -hcl:#a97842 -iyr:2015 - -hgt:167cm byr:1960 eyr:2022 hcl:#efcc98 -cid:87 ecl:blu iyr:2012 -pid:431515059 - -hcl:#cfa07d -eyr:2023 -hgt:188cm ecl:grn pid:081575957 byr:1938 iyr:2012 - -iyr:2010 byr:1973 -cid:108 -eyr:2026 -pid:880191154 hcl:#888785 hgt:181cm -ecl:brn - -eyr:2021 iyr:2010 byr:1942 hcl:#7d3b0c ecl:hzl pid:886241926 hgt:171cm - -cid:53 byr:1993 -pid:150cm eyr:2035 -hcl:#888785 hgt:153cm ecl:#128262 iyr:2021 - -ecl:gry -pid:555911148 -hcl:#733820 eyr:2022 hgt:154cm iyr:2012 -byr:1935 cid:338 - -hcl:#b6652a -pid:833873846 iyr:2012 -hgt:167cm eyr:2023 byr:1984 - -eyr:2024 -ecl:blu byr:1955 -hcl:#b6652a pid:517975316 iyr:2010 hgt:166cm - -pid:133785752 -ecl:blu -eyr:2024 -byr:1973 -iyr:2019 hcl:#fffffd -cid:236 hgt:173cm - -cid:222 -byr:2013 hcl:z eyr:2036 pid:7443967478 ecl:brn -iyr:2030 hgt:62cm - -hgt:193cm cid:259 -hcl:#18171d -ecl:grn -byr:1995 pid:727880050 eyr:2030 iyr:2010 - -hcl:#c0946f cid:275 eyr:1954 pid:772184635 ecl:#76add7 byr:2009 iyr:2018 hgt:151cm - -ecl:#52ed0f eyr:2033 hcl:#18171d pid:475397948 -byr:1946 iyr:2028 hgt:178cm - -iyr:2012 hgt:152cm -eyr:2027 byr:1923 ecl:brn -hcl:#18171d pid:513722888 cid:171 - -iyr:2029 -hgt:111 hcl:z ecl:#33e3bc eyr:1930 -byr:1934 pid:94036732 - -hgt:154cm eyr:2024 hcl:#6b5442 iyr:2017 -byr:1974 -ecl:amb pid:470968353 cid:345 - -hgt:184cm hcl:#617375 eyr:2028 -byr:1975 ecl:oth -iyr:2018 pid:735589126 - -cid:261 -hcl:#cfa07d pid:213013397 -hgt:187cm -ecl:gry iyr:2016 - -hcl:#623a2f -ecl:#34964b eyr:2009 pid:169cm byr:2028 hgt:169cm -iyr:2028 - -eyr:2029 iyr:2016 -byr:1985 -hgt:192cm hcl:#602927 cid:167 -ecl:blu pid:620818510 - -eyr:2029 -byr:1968 -ecl:blu -hgt:183cm iyr:2011 pid:952376140 hcl:#efcc98 - -iyr:2020 -byr:1981 pid:850136149 eyr:2028 hgt:159cm hcl:#7d3b0c -ecl:brn - -ecl:brn pid:480452858 hgt:65in cid:340 eyr:2022 -byr:1946 -hcl:#602927 iyr:2015 - -hgt:172 hcl:z eyr:1958 iyr:1941 byr:2019 pid:389995951 ecl:dne - -byr:2025 hcl:4c8dcd -hgt:177in -ecl:#55d635 -cid:197 pid:91192572 -iyr:1921 eyr:2038 - -iyr:2027 pid:154cm -hgt:185in byr:2012 -eyr:2036 hcl:efd47d -ecl:#64f98d -cid:86 - -eyr:2029 pid:837224515 ecl:grn cid:231 hcl:#733820 iyr:2019 -hgt:159cm -byr:1977 - -pid:974518338 byr:1964 hcl:#cfa07d ecl:grn eyr:2030 -hgt:61in -iyr:2019 - -iyr:2019 -hgt:192in cid:94 -eyr:1922 -byr:1925 hcl:z ecl:utc pid:#081266 - -eyr:2027 iyr:2019 cid:328 byr:1961 hcl:#6b5442 ecl:blu hgt:177cm pid:235426720 - -byr:1959 -eyr:2025 -pid:890034625 ecl:oth -hgt:62in cid:348 hcl:#733820 - -hgt:161cm iyr:2018 pid:916160791 ecl:grn -byr:1951 hcl:#44d03a eyr:2025 - -hgt:158cm byr:1942 iyr:2012 hcl:#602927 -eyr:2026 ecl:gry pid:651231060 - -ecl:hzl cid:340 pid:086942161 byr:1986 hcl:#a97842 iyr:2018 -eyr:2028 -hgt:181cm - -ecl:blu -pid:278922687 cid:238 iyr:2018 hgt:153cm eyr:2027 -byr:1965 -hcl:#733820 - -eyr:2023 cid:208 hgt:178cm hcl:#341e13 byr:1937 pid:290981079 iyr:2010 ecl:grn - -hcl:#888785 -ecl:amb -byr:1943 pid:559804716 eyr:2026 hgt:166cm -iyr:2019 - -pid:947831563 -ecl:gry -byr:1960 hcl:#341e13 -iyr:2016 hgt:173cm eyr:2029 - -ecl:blu iyr:2016 pid:724632073 hcl:#623a2f -eyr:2028 hgt:192cm byr:1958 - -byr:2021 -eyr:2016 hcl:z iyr:1988 pid:65353943 -ecl:#bb553b -hgt:125 - -hcl:#efcc98 byr:1963 pid:290433211 eyr:2023 ecl:hzl -hgt:172cm iyr:2013 - -iyr:2015 ecl:brn -byr:2023 hcl:#18171d -pid:325330679 -hgt:190in eyr:2023 - -pid:745674970 hgt:160cm eyr:2021 byr:1925 ecl:gry hcl:#341e13 iyr:2015 -cid:297 - -eyr:2021 -pid:596411633 -byr:1947 ecl:blu cid:191 hcl:#341e13 hgt:168cm iyr:2019 - -eyr:2030 pid:#902a6b iyr:1997 hcl:11f396 hgt:188cm byr:2025 -ecl:dne - -eyr:2025 -byr:2006 -hcl:#888785 ecl:hzl hgt:187cm -iyr:2012 pid:017702828 - -byr:1988 hcl:#18171d iyr:2019 -pid:110591871 -ecl:hzl -hgt:160cm -eyr:2029 - -ecl:brn -hcl:#c0946f iyr:2030 pid:264404022 byr:1984 hgt:59cm eyr:2040 - -pid:5973803069 -hcl:#cfa07d ecl:grt -hgt:153cm eyr:2039 byr:1970 -iyr:2025 - -hcl:#fffffd -iyr:2022 byr:2026 -hgt:180 pid:82035145 eyr:2034 cid:118 ecl:utc - -hgt:186cm eyr:2026 -ecl:brn -iyr:2013 hcl:#8f4c9b pid:010260339 byr:1948 - -ecl:amb hcl:#18171d iyr:2020 pid:259501214 byr:1978 hgt:193cm -cid:263 eyr:2022 - -hgt:161cm iyr:2015 byr:2014 eyr:2003 -pid:708958872 ecl:grt -hcl:f4a430 - -hgt:170cm eyr:2021 pid:911638274 cid:110 byr:1963 ecl:blu -iyr:2015 hcl:1eda64 - -ecl:oth byr:1949 hgt:174cm hcl:#18171d eyr:2022 iyr:2019 -pid:305857230 - -ecl:gry hcl:#a97842 pid:971971076 byr:2002 iyr:2019 -hgt:188cm -eyr:2022 cid:238 - -eyr:2027 pid:221315043 iyr:2010 hgt:159cm ecl:blu byr:1998 hcl:#6b5442 - -hcl:#888785 -byr:1926 eyr:2022 pid:433807814 ecl:grn -iyr:2010 -hgt:181cm - -ecl:grn hgt:164cm byr:1951 hcl:#18171d cid:75 pid:845508281 eyr:2021 iyr:2017 - -pid:#f59bc7 -eyr:1987 hgt:191cm hcl:z byr:2024 -iyr:1985 - -hcl:#623a2f pid:497429747 -hgt:189cm -byr:1987 -eyr:2027 iyr:2012 cid:95 ecl:hzl - -byr:2000 -hgt:165cm -iyr:2017 pid:519443292 eyr:2029 cid:240 hcl:#a97842 -ecl:blu - -cid:67 pid:038299774 -eyr:2023 iyr:2015 hgt:179cm byr:1941 hcl:#18171d ecl:amb - -byr:2000 -eyr:2025 ecl:oth iyr:2017 -pid:334154607 -hcl:#fffffd hgt:173cm - -hcl:#888785 ecl:amb -cid:131 iyr:2018 byr:1996 eyr:2026 -hgt:180cm pid:709543988 - -iyr:1988 -pid:263277424 -hcl:ee8912 byr:1942 ecl:gry eyr:2040 hgt:161cm - -eyr:2020 byr:1966 iyr:2020 hgt:169cm pid:611918000 -hcl:#7d3b0c ecl:hzl - -hgt:164cm ecl:brn -iyr:2015 pid:192054454 hcl:#6b5442 byr:1987 eyr:2022 - -byr:1952 -ecl:zzz -pid:215953654 -eyr:2021 hcl:#efcc98 hgt:153cm iyr:2026 - -hgt:167cm -hcl:#b6652a pid:847614726 -eyr:2022 ecl:gry byr:1990 iyr:2015 - -hgt:185cm ecl:oth iyr:2012 -byr:1933 -cid:250 -pid:038674023 -hcl:#c0946f - -pid:613273980 hcl:#a97842 -ecl:oth byr:1924 hgt:179cm -eyr:2027 iyr:1950 - -hcl:#cfa07d byr:2018 hgt:190cm pid:64530329 -ecl:brn -iyr:2024 - -hcl:z hgt:70cm pid:18807747 -cid:284 byr:2023 -eyr:2035 ecl:#4a1501 -iyr:1954 - -iyr:2016 hgt:152cm pid:886247173 byr:1940 hcl:#c0946f eyr:2027 ecl:oth cid:150 - -hgt:152cm hcl:#48cfdf eyr:2025 cid:277 -ecl:oth pid:246230621 byr:1932 -iyr:2020 - -ecl:amb pid:871180042 -cid:117 hcl:#602927 iyr:2011 hgt:152cm -eyr:2030 byr:1999 - -eyr:2024 ecl:hzl hgt:171cm -byr:1934 pid:356408125 iyr:2019 hcl:#b6652a -cid:169 - -eyr:2023 -hcl:#7d3b0c -byr:1934 hgt:67in ecl:oth pid:191785527 -cid:117 iyr:2016 - -iyr:2029 -hcl:#602927 eyr:2022 byr:1931 ecl:oth hgt:192cm -pid:231475143 - -ecl:grn iyr:2014 cid:250 hcl:#b6652a byr:1970 pid:675238417 hgt:162cm -eyr:2026 - -ecl:brn -hcl:#623a2f eyr:2021 pid:293293433 hgt:158 byr:1977 iyr:2019 - -ecl:oth hcl:#ceb3a1 pid:013111996 eyr:2023 hgt:180cm byr:1976 cid:224 - -hgt:61cm -eyr:2027 ecl:amb pid:181cm iyr:1932 -byr:1974 -hcl:#18171d - -byr:1968 hgt:167cm -hcl:#a97842 eyr:2022 iyr:2018 ecl:hzl pid:940968694 - -iyr:1943 -hgt:96 -cid:229 -hcl:z eyr:1990 byr:2007 pid:#25aa73 -ecl:#74592e - -hgt:182cm iyr:2018 ecl:hzl eyr:2029 byr:1946 pid:602345030 -hcl:#ceb3a1 - -pid:750306036 eyr:2020 hgt:181in ecl:xry -iyr:2011 hcl:z byr:1971 cid:71 - -pid:183825747 iyr:2019 hcl:#6b5442 -byr:1974 -hgt:180cm eyr:2028 -ecl:amb - -ecl:brn cid:200 pid:576495225 -byr:1924 -hcl:#efcc98 eyr:2022 iyr:2017 hgt:185cm - -iyr:2020 hgt:167cm byr:1965 ecl:brn hcl:#888785 -eyr:2028 pid:752062953 - -byr:2026 -hcl:z -eyr:2020 -ecl:#b4ec74 pid:187cm iyr:1974 -cid:326 hgt:150cm - -byr:1996 pid:507323629 -iyr:2015 cid:347 eyr:2026 hcl:#efcc98 -ecl:amb hgt:157cm - -byr:2017 pid:456780590 hcl:#888785 eyr:1966 ecl:amb iyr:2023 cid:187 hgt:62cm - -ecl:hzl iyr:2015 hcl:#6b5442 hgt:152cm eyr:2028 byr:1982 pid:003269467 - -iyr:2017 eyr:2026 -ecl:blu cid:70 hcl:#7d3b0c -byr:1966 pid:160330947 hgt:189cm - -iyr:2010 ecl:amb -hgt:164cm eyr:2029 byr:1963 -pid:596606374 hcl:#efcc98 - -hcl:#fffffd cid:277 pid:102326370 hgt:154cm eyr:2026 iyr:2012 byr:1968 -ecl:hzl - -ecl:oth pid:477189554 hcl:#6b5442 eyr:2022 byr:1948 hgt:74in cid:181 -iyr:2016 - -hgt:169cm hcl:#d7bc93 -cid:344 ecl:oth -pid:#09c55d iyr:2017 -eyr:2030 byr:1928 - -hcl:5d02ff ecl:#ca7901 iyr:1959 byr:2006 eyr:2022 -hgt:164in -pid:#d6cdfd - -ecl:amb pid:5739190196 eyr:2021 hgt:157in hcl:#efcc98 byr:2018 iyr:2028 - -byr:1995 ecl:hzl -iyr:2017 -hcl:#a97842 pid:917039291 eyr:2026 hgt:175cm - -iyr:2017 pid:756519868 -hcl:#623a2f -eyr:2028 -hgt:158cm -ecl:amb byr:1957 - -iyr:2012 -hgt:158cm -byr:2014 pid:973021666 hcl:f04766 eyr:2035 ecl:utc - -ecl:blu -byr:1989 eyr:2022 -pid:520765501 -cid:200 hgt:193cm hcl:#a97842 iyr:2011 - -byr:1959 -ecl:blu hcl:#733820 cid:284 hgt:162cm -eyr:2022 pid:751629408 iyr:2016 - -byr:1978 cid:301 -ecl:oth hgt:67cm hcl:#888785 -eyr:2040 iyr:2025 pid:26038514 - -iyr:2020 byr:1974 hgt:163cm ecl:blu hcl:#7d3b0c eyr:2028 cid:99 - -hcl:#a97842 -hgt:186cm -ecl:grn byr:1969 pid:460360492 iyr:2011 eyr:2028 - -byr:2009 -pid:489490924 eyr:2031 -hcl:cb5351 ecl:#083a25 hgt:164cm - -iyr:2019 -hcl:3463cc ecl:amb pid:4089063078 eyr:2022 hgt:150cm -byr:2007 - -eyr:2028 hcl:#ceb3a1 -hgt:191cm iyr:2019 pid:737842199 ecl:blu cid:268 byr:1925 - -pid:868397851 -hcl:#efcc98 ecl:grn iyr:2017 eyr:2021 byr:1943 -hgt:179cm - -hcl:#623a2f byr:1987 eyr:2023 iyr:2019 hgt:152cm -pid:473569020 -ecl:grn - -pid:953968630 -hgt:175cm -byr:1971 ecl:blu hcl:#623a2f iyr:2017 cid:336 eyr:2030 - -ecl:grt hgt:74cm byr:2022 eyr:2024 pid:39114027 -iyr:2026 hcl:4b5675 - -pid:#492988 -eyr:2032 hgt:63cm iyr:2006 -ecl:#817211 byr:2019 - -pid:800367032 hcl:#341e13 -ecl:#765111 iyr:2012 byr:2006 hgt:166cm cid:291 eyr:2027 - -eyr:2021 iyr:2012 pid:876581393 ecl:amb hcl:#866857 -hgt:64in byr:1993 - -iyr:2017 byr:1996 ecl:hzl pid:038990744 -eyr:2028 -hgt:177cm -hcl:#c0946f - -hcl:#4214a6 -eyr:2021 -iyr:2019 cid:72 byr:1939 -ecl:hzl pid:783071912 hgt:187cm - -eyr:2020 hgt:158cm -pid:274060737 cid:277 -iyr:2015 hcl:#bf9b5e byr:1950 ecl:brn - -byr:1921 hcl:#7d3b0c cid:329 hgt:155cm eyr:2030 pid:718399669 iyr:2011 ecl:brn - -cid:147 eyr:2021 hgt:167cm iyr:2010 ecl:grn byr:1975 hcl:#6b5442 -pid:285479783 - -hgt:187cm -byr:2004 eyr:2025 hcl:bb331b -pid:851189955 iyr:2016 -ecl:amb - -hcl:#94007d pid:361561551 byr:1927 eyr:2026 iyr:2020 -ecl:gry hgt:158cm - -byr:1993 pid:#24c4af iyr:2023 hgt:175cm eyr:2028 -hcl:z ecl:hzl cid:308 - -byr:1985 hcl:#c0946f eyr:2034 hgt:172cm -cid:300 iyr:2013 ecl:gry pid:389455676 - -eyr:2030 iyr:2017 byr:1956 hgt:178cm -pid:864401853 hcl:#6b5442 - -pid:836559549 -iyr:2011 -hgt:167cm -ecl:amb hcl:#c0946f -eyr:2026 byr:1981 - -pid:111085991 iyr:2011 -ecl:blu eyr:2026 cid:311 -byr:1920 hgt:182cm hcl:#602927 - -ecl:oth pid:284436132 -byr:1929 cid:121 -eyr:2027 -iyr:2010 -hgt:75in -hcl:#6b5442 - -byr:1987 -hcl:#7d3b0c iyr:2018 hgt:180cm -ecl:blu eyr:2029 pid:878348021 - -hgt:183cm cid:98 -byr:1953 hcl:#866857 eyr:2021 iyr:2012 pid:158898193 - -eyr:2030 pid:039638764 ecl:hzl hgt:190cm byr:1926 -cid:294 hcl:#b6652a iyr:2017 diff --git a/day04/parsePassportList.spec.ts b/day04/parsePassportList.spec.ts deleted file mode 100644 index 8de735d..0000000 --- a/day04/parsePassportList.spec.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { loader } from '../lib/loader' -import { parsePassportList } from './parsePassportList' - -const load = loader(4) -const sample = load('sample') - -describe('parsePassportList', () => { - it('should parse the sample', () => - expect(parsePassportList(sample)).toEqual([ - { - ecl: 'gry', - pid: '860033327', - eyr: '2020', - hcl: '#fffffd', - byr: '1937', - iyr: '2017', - cid: '147', - hgt: '183cm', - }, - { - iyr: '2013', - ecl: 'amb', - cid: '350', - eyr: '2023', - pid: '028048884', - hcl: '#cfa07d', - byr: '1929', - }, - { - hcl: '#ae17e1', - iyr: '2013', - eyr: '2024', - ecl: 'brn', - pid: '760753108', - byr: '1931', - hgt: '179cm', - }, - { - hcl: '#cfa07d', - eyr: '2025', - pid: '166559648', - iyr: '2011', - ecl: 'brn', - hgt: '59in', - }, - ])) -}) diff --git a/day04/parsePassportList.ts b/day04/parsePassportList.ts deleted file mode 100644 index 0e68b88..0000000 --- a/day04/parsePassportList.ts +++ /dev/null @@ -1,19 +0,0 @@ -export const parsePassportList = (input: string[]): Record[] => - input.reduce( - (list, line) => { - if (line.length === 0) list.push({}) - list[list.length - 1] = { - ...list[list.length - 1], - ...line.split(' ').reduce((props, entry) => { - const [k, v] = entry.split(':') - if (v === undefined) return props - return { - ...props, - [k]: v, - } - }, {}), - } - return list - }, - [{}], - ) diff --git a/day04/sample.txt b/day04/sample.txt deleted file mode 100644 index 3b38741..0000000 --- a/day04/sample.txt +++ /dev/null @@ -1,13 +0,0 @@ -ecl:gry pid:860033327 eyr:2020 hcl:#fffffd -byr:1937 iyr:2017 cid:147 hgt:183cm - -iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884 -hcl:#cfa07d byr:1929 - -hcl:#ae17e1 iyr:2013 -eyr:2024 -ecl:brn pid:760753108 byr:1931 -hgt:179cm - -hcl:#cfa07d eyr:2025 pid:166559648 -iyr:2011 ecl:brn hgt:59in \ No newline at end of file diff --git a/day04/solution.spec.ts b/day04/solution.spec.ts deleted file mode 100644 index fd1774f..0000000 --- a/day04/solution.spec.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { loader, loadString } from '../lib/loader' -import { parsePassportList } from './parsePassportList' -import { validatePassport, validatePassportStrict } from './validatePassport' - -const load = loader(4) -const sample = load('sample') -const input = load('input') - -describe('Day 4: Passport Processing', () => { - describe('Part 1', () => { - it('should solve the sample', () => { - expect(parsePassportList(sample).filter(validatePassport)).toHaveLength(2) - }) - it('should solve', () => { - expect(parsePassportList(input).filter(validatePassport)).toHaveLength( - 250, - ) - }) - }) - describe('Part 2', () => { - it('should solve the sample', () => { - expect( - parsePassportList( - loadString(`eyr:1972 cid:100 - hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926 - - iyr:2019 - hcl:#602927 eyr:1967 hgt:170cm - ecl:grn pid:012533040 byr:1946 - - hcl:dab227 iyr:2012 - ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277 - - hgt:59cm ecl:zzz - eyr:2038 hcl:74454a iyr:2023 - pid:3556412378 byr:2007 - - pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980 - hcl:#623a2f - - eyr:2029 ecl:blu cid:129 byr:1989 - iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm - - hcl:#888785 - hgt:164cm byr:2001 iyr:2015 cid:88 - pid:545766238 ecl:hzl - eyr:2022 - - iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719`), - ).filter(validatePassportStrict), - ).toHaveLength(4) - }) - - it('should solve', () => { - const v = parsePassportList(input).filter(validatePassportStrict) - expect(v).toHaveLength(158) - }) - }) -}) diff --git a/day04/validatePassport.spec.ts b/day04/validatePassport.spec.ts deleted file mode 100644 index 3254311..0000000 --- a/day04/validatePassport.spec.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { validatePassport, validatePassportStrict } from './validatePassport' - -describe('validatePassport', () => { - it.each([ - [ - { - ecl: 'gry', - pid: '860033327', - eyr: '2020', - hcl: '#fffffd', - byr: '1937', - iyr: '2017', - cid: '147', - hgt: '183cm', - }, - true, // all eight fields are present - ], - [ - { - iyr: '2013', - ecl: 'amb', - cid: '350', - eyr: '2023', - pid: '028048884', - hcl: '#cfa07d', - byr: '1929', - }, - false, // missing hgt - ], - [ - { - hcl: '#ae17e1', - iyr: '2013', - eyr: '2024', - ecl: 'brn', - pid: '760753108', - byr: '1931', - hgt: '179cm', - }, - true, // temporarily ignore missing cid fields - ], - [ - { - hcl: '#cfa07d', - eyr: '2025', - pid: '166559648', - iyr: '2011', - ecl: 'brn', - hgt: '59in', - }, - false, // Missing cid is fine, but missing any other field is not, so this passport is invalid. - ], - ])('passport %s validity is %s', (passport, valid) => - expect(validatePassport(passport)).toEqual(valid), - ) -}) - -describe('validatePassportStrict', () => { - it.each([ - [{ byr: '2002' }, true], - [{ byr: '2003' }, false], - [{ hgt: '60in' }, true], - [{ hgt: '190cm' }, true], - [{ hgt: '190in' }, false], - [{ hgt: '190' }, false], - [{ hcl: '#123abc' }, true], - [{ hcl: '#123abz' }, false], - [{ hcl: '123abc' }, false], - [{ ecl: 'brn' }, true], - [{ ecl: 'wat' }, false], - [{ pid: '000000001' }, true], - [{ pid: '0123456789' }, false], - ])(`should pass sample properties %s %s`, (props, isValid) => { - const valid = { - eyr: '2024', - pid: '662406624', - hcl: '#cfa07d', - byr: '1947', - iyr: '2015', - ecl: 'amb', - hgt: '150cm', - } - - expect(validatePassportStrict(valid)).toEqual(true) - expect( - validatePassportStrict({ - ...valid, - ...props, - }), - ).toEqual(isValid) - }) -}) diff --git a/day04/validatePassport.ts b/day04/validatePassport.ts deleted file mode 100644 index 02e141f..0000000 --- a/day04/validatePassport.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Validate a passport. - * cid field is optional - */ -export const validatePassport = (p: Record): boolean => { - if (!('ecl' in p)) return false - if (!('pid' in p)) return false - if (!('eyr' in p)) return false - if (!('hcl' in p)) return false - if (!('byr' in p)) return false - if (!('iyr' in p)) return false - // if (!('cid' in p)) return false - if (!('hgt' in p)) return false - return true -} - -export const validatePassportStrict = (p: Record): boolean => { - if (!validatePassport(p)) return false - // byr (Birth Year) - four digits; at least 1920 and at most 2002. - const byr = parseInt(p.byr, 10) - if (byr < 1920 || byr > 2002) return false - // iyr (Issue Year) - four digits; at least 2010 and at most 2020. - const iyr = parseInt(p.iyr, 10) - if (iyr < 2010 || iyr > 2020) return false - // eyr (Expiration Year) - four digits; at least 2020 and at most 2030. - const eyr = parseInt(p.eyr, 10) - if (eyr < 2020 || eyr > 2030) return false - // hgt (Height) - a number followed by either cm or in: - const hgt = /^([0-9]+)(cm|in)$/.exec(p.hgt) - if (hgt === null) return false - const hgtValue = parseInt(hgt[1], 10) - const hgtUnit = hgt[2] - // If cm, the number must be at least 150 and at most 193. - if (hgtUnit === 'cm' && (hgtValue < 150 || hgtValue > 193)) return false - // If in, the number must be at least 59 and at most 76. - if (hgtUnit === 'in' && (hgtValue < 59 || hgtValue > 76)) return false - // hcl (Hair Color) - a # followed by exactly six characters 0-9 or a-f. - if (!/^#[0-9a-f]{6}$/.test(p.hcl)) return false - // ecl (Eye Color) - exactly one of: amb blu brn gry grn hzl oth. - if (!['amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth'].includes(p.ecl)) - return false - // pid (Passport ID) - a nine-digit number, including leading zeroes. - if (!/^[0-9]{9}$/.test(p.pid)) return false - // cid (Country ID) - ignored, missing or not. - return true -} diff --git a/day05/input.txt b/day05/input.txt deleted file mode 100644 index d789b79..0000000 --- a/day05/input.txt +++ /dev/null @@ -1,945 +0,0 @@ -FFBFFBBLRL -FBFBBFBLRR -FBFFBBBRLL -FFBBFBFRRR -BFBBBBFLRR -BBFBBBFRRL -BFBBBBBLLR -FBFFBFBRRR -BBFFBBBLRL -BBBFFFFLLR -FFFFBFFRLL -FFBFFFFRLL -FFFBFBBLRR -BFBFBBBRLR -FBBFBBBLRR -BBFFFFBRRR -FBBFFFBRRR -BFFFBFFLLR -FBBBBFFLRL -BFBFFFBRRL -FFBFBBFRRL -BBFBFFFRRR -FFBFFBFLRR -FFBFFBBLLR -FBFBFFFLRR -FFFBFFFRRL -FFFFFBFRRL -BBBFFFFRLL -FBBFBFFLLL -FBBBBFBLRL -BBBFBBFRRR -BBBFBFBLLL -FBBFFBBLLL -FBBBFBFLRL -FBBBFBFRLL -BFFFFFFLRR -FFFFBBBRRR -FBFBBBFLLL -FBFBFBFRLL -FBBBFBFLLR -FBBFFFFLRR -FFBBBBFRRL -FFBBBBFRLR -FBFBBBBLRL -BFFFFFFRRL -FBBBFFBLLL -FBFFFFFRLL -BFFFFBFRRL -FFBBBFBLRL -FBFFBFFRLR -FBFFBBFLRL -BFFFBFBRLL -BFFFFFFLLL -FFFBBFBLRR -FBFBFBBRLR -BBFFBFFLRR -BBFFFBBLRR -BFBFBBFRLR -FBBFBBBLLR -FFFFBBFLLL -BBFBBBFLRL -BFFBBBFRLR -FBFFFFBLLR -FFFFBFFLRL -BBFBFBFLRR -BFFBFFBLLR -BBFBBBFLRR -FFFFBBFRLR -FBBFFBBLRL -FBBBBBBRLL -FBBFBFBRLR -FFBBFBFRLL -FFBFBFFLRR -BFFBBBBLLR -FBFBFBFRRL -BBBFBBFLLL -FFBBFFBLRR -BBFBBFBLRR -BFFFBBBLLL -BBBFFBFRRL -FBBBFBFLLL -FBFBFBBRRL -BFBFFBBLLR -FFBFFBBRRR -BBFFFFFLLL -BFFBFFBLLL -BBBFBFFRRL -FBFFBFBRLR -BFFBBFFLRR -BFBFBBFLRR -FBBBBFBRLR -BFBBBBBRLL -BFBBBFBLRR -BFFFFFBLLR -BBBFFFBLRL -BFFFBFBLRL -BFFFBBBLRR -BBFBBBBRLL -FFBBFBFLLL -BFFBFBBRRL -BFFBBFBRRR -BBFBBBBRRR -FFBBBBBLLL -FBBBFFBLRL -FFBFFBFLRL -FFBBBBFRLL -FFFFBBFLRR -BBFFFFBRRL -BFFFFBBRRR -FFFBFBFRLR -FBBBBBFLRR -FFFFBBBRRL -BFBFBFBRRR -BFFBBBFRRR -FFFFFFBLLL -FFFBBFBLLL -FBFFFBFLRL -BFFFBBFLRR -FBBBBBFRLL -FBFFFFBRLL -FBFBBBFRLL -FFBFBBBLRL -BFBFBFFLLL -BBBFBFBLLR -FBBBBFFRRR -FBBFBFFRLR -FBFFBFFRRR -BFBFBFFLRR -BBFFFBFLRL -BBFFFBBRRL -BFFBBFFLLL -BFBBFFFRLL -FFFBFFBRLR -BBFBBFBLLR -BBBFFFFRLR -BFBBFBBRRR -FBBBFBFRRL -BBFBBBBLLR -BFFBBBBRRR -FFFFFBFLLL -BBBFBFFLRL -FBFFFFBLLL -BFFBBBFRRL -FBFBBFBLRL -FFBFBBBRLR -FFFBBBBLLL -BBFBBFFRLL -BBFBFBBRLL -BBFBFBBRRL -BFBBBFBRLR -FBFBFFFRLL -BFFFBFFRRL -BFFFFBFLRR -BFBBFFBRRL -BBFFBBFRRL -BBBFFFFLLL -FBFFBFBRRL -FFFBBFBRRL -FBFFBFFLLL -FFFBFBBLRL -BBFFBFBLLL -FFBBBFBLLL -BFBBBFFLRL -BFBFBBBRRL -FFBBBBFLRR -FBBFFBFRRR -FFBFBFBRLL -BFBBFFBLLR -BFFBFBFRRL -FBFFFFFLRR -FBFBBBBRLR -BFFFFFBLRR -BBFBFFFRLL -FFBFBBFLRR -BBFFFFFRLL -BFFBBFBRLR -FFBBFBBRLR -BFBBFFFLRL -FFFFFFFRRL -FFBBBBBLRL -FFFBBBBLLR -FFFBBFFLLR -FFFBFFFRLL -BFBFFBBRRL -BBFBBFFRRL -FFBFFBBRRL -FFBFFFFRRL -FFFBFFBRLL -FBFBFFFRLR -FFFBFBFRRR -BFBBBBFRRR -BBBFBFFRLL -FBBFFFFRLR -BFFBBBBLRR -FFBBBBBRLL -FFBBFBFLRL -BBBFFBBRLL -BBFBBBFRLL -BFBBFBFRRR -FBFBBFBRRL -FBBFBBBRRL -FFBFFBBRLR -FFFFFBFLRL -FBFBFFFLLL -FBFFBBFRLL -FBBBFFFRRR -BFFBFBBRLL -BFBFFFFRLL -BBFFFBBLLR -FFBBFBBLLL -BBBFFFBLLR -FFFBBBBRLL -BFBBBBFRLL -BFBBBFFLRR -BFFFFFFLLR -BFBBBBFLLL -FBBBFFFLRL -FBBBBFBLLL -BFFFBBFRRL -FBBBBFFRLR -BBFBFBFRLR -BFFBFBFLRR -BBFBFFBRRL -FFFFFFBRRL -FBFBFBBLRL -BFBFFBBLRR -FFBBFBFRRL -FBFFFBFLLR -FBBBBBBRRR -BBBFBFFLRR -FBBFBBBRLL -FFBFFBBLLL -BBFFBFBRRR -BFFBBBFLRR -FFFBFFFLLR -FBBFBFFRLL -BBFFFFBLLL -BFBFBFFLRL -BBFBBFBRRR -BBFFFBBRLL -BFFBBFBRLL -FFFFFFBRLL -BFFBFFBRLL -BFFBBFBLRR -BFBBBBFLRL -BBFFFFBLRL -FFFBBBFLRR -BFBBFBBLRL -FBBBFBBRLL -BBFBBFBRLR -BFFBBFBLLL -FBBBBBFRRL -BFFBBBFLRL -FFFBBFFRLR -FBBFFFFRLL -BFFFFBFRLL -FFBBBFBRLL -FFFBFFFRLR -BFBBFFFRRL -BFBFFBBRRR -FFBBFBFLRR -FFFBFFBLLR -BBFBBFFRLR -BFFBBFFRRL -FBBFFFFLRL -FBFBBFFRLL -BBFBFBBLLR -FFFFFBBLRR -BFBBBFFLLR -BFBFFBFLRR -BFBBFBFRRL -FBBFBBFRLR -BBFBBBFLLR -BFFFBBBRLR -FBFFBFFRLL -BFBBFFFRLR -BBFFBBFRLR -BBFBFFBLRL -BBBFBFBRLL -FFFFBFFLRR -BFBFBBBLLL -BFFFFBFLRL -BFBBBFBRLL -FFFBFFBLRR -FFFBBFBRLR -BBFFFBBLLL -FFFBBBBRRL -FFBFBFFRLR -BBBFFBBLRL -FFBFFBFLLL -FFFBFBBLLR -FFBFFFFLRL -FFBBFFFLLL -FBFFFBBRRL -BFFFFBBLLR -BFBFFFFRRR -FBFBFBBRLL -BFBBBFFRLL -BFFBBFFLRL -FFBBFFBLLL -FBBBBFBRRL -BBFFFBFRRL -FFFBBFBLRL -BBBFFFBRLR -BFBBFFFRRR -FFBFBBBRRR -BFFFBFBRRL -FBBFFBFRLL -BBBFFBBLLL -FBBFBBBRLR -BBBFBBFLRR -BBFFFFBRLR -BFFFBFBRLR -FBBBFBFRLR -BFBBFFFLLL -FBBBBBBRRL -BBFFBBBRLR -BFFFFFFRRR -BBFFFBBRLR -FBFBBFBLLL -BFBFBBBLLR -FBBBFBBLRL -FFBFFFBRRR -BFFFFBBRLL -BBFBBFFLRR -FBBBFBFLRR -BFFBFFFLLR -BBBFFFFLRR -BFFBFBFRRR -FFFFFFBRRR -BFBFFFFLRR -BFFFBBBLRL -FBBBFFBLRR -FFFFBFFLLL -FFBBFFFLLR -BFBBFFBRLR -FBFFBBFLLL -FFFBBBFRLL -BFBBFFBLRR -BFFBFFBRRR -FBFBBFFLRR -BFFBFBFLLR -FBFFFFBLRR -FBFFFBBLRR -BFBFFBFRRL -FFBFBFBLRL -FBFBBBBRRL -BBFFFFFRLR -FFBFFBFRRL -FFBBFFBRRR -BBFFBFFRRL -FFFFFBBRLR -BFBBFFFLLR -FFFBBFFLRR -BFFBFBBRLR -FBFFBFBLLL -FFBBFBFLLR -FFBBFFFRLR -BFBFFFFRRL -FBBFBBBRRR -BFFFFBFRRR -BFBFBFBLLR -BBBFBFFRLR -BFFFBFBRRR -FBFBFFBLRR -BBFFBBFRLL -BFBFBBFLRL -BFBFFFFLRL -BBBFBFBRLR -FFBBBBFLLL -FBBBFFBRLL -FFBFFFBRLR -FFBBBFFRRL -FFBBBBBLLR -FFFFBFBLRL -FFFBFFFLRL -FBBBBBBLLR -BFFFBBFLRL -FBBFBFFLRL -FFBFFBFLLR -FFBBBBBRRR -FFFBFBFRRL -BFFBFFFRLR -FFBFFBBLRR -BBFFFFFLRR -BBBFBBFRRL -BBFFFBFRLL -FBFBFBBLRR -BBFFFBBRRR -BBBFBFBLRL -FBBBFFFRLR -BFFFBBFLLL -FBBBBFFLRR -FFBBFFBRLR -FFBFFFFRRR -FBFBFBFLRR -BBBFFFFRRR -FBFFFBFRRL -FFBFFFFLLL -BBFBBBBRRL -FBFFBBFLRR -FBFBBFFRRR -BFFFBBBLLR -FFBBBFFLRR -BFFFFBBRRL -FFBFFFFLRR -BFFBFBFLRL -BFFBBBBRLR -BFFBFBBLLL -BFBBBBBRRR -FFBBFBBLRL -BFBFFBFLRL -BBFBBBFRLR -FBBFBBFRLL -BFBFFBBRLL -FBFBBBBRLL -FFBBFBBLRR -BFBFFBBLLL -FFBFFFBLLR -BFBBBFBRRL -BBFFFBFLRR -BBFFBBFLRL -FBBFBFBLLR -BBBFBBFRLR -FBBBBBFRLR -BFBBFBFLLL -FBFFFFBLRL -FBBFFBBLLR -FBBFFBBRLR -FFFFBFBRRR -FBBFFBFLRL -FBFBBBBRRR -FBBFFFFRRL -FFFBBBBLRL -BFFBFBFRLL -FFBFBFFRRR -FFFBBFFRRR -BBFFBBBLRR -FFBFFFBLRR -FFBBFBBRLL -FFBBFFFRLL -FBBBFBBLLL -BBFFBFFRLL -FBBFBFBLRR -BBBFFFBLLL -FBFBFBFLRL -BFFBBFBLLR -BFBFBBFLLR -BFBBBFFRRR -FBFFFBFRRR -FFBFFFBRRL -BBFFBBFRRR -BFBBFBBLLL -FFFFFBBRLL -FBFFBFFLRL -FFBFBFBLLR -FFBBBBFLLR -BFBFFBFRRR -BFFFFFBRRL -BFFFFBFLLR -FFFBBBFLLR -BFBFBFBLRR -FFFFBBFLLR -BBBFFBBRRR -FFBFBFBRRR -FBFBBBFLRR -BFFFFBBRLR -BFFBFFBRLR -BFBBFBBRRL -FFBBFBBRRR -FBBFBBFLRR -BBFFBBBRRL -FBBBBBBLRR -FFFBFFFRRR -FFFFBFBRRL -FBFFBFFLRR -BFFBFFFLRR -FFBFFBBRLL -FBFBBFFLLR -BFBFFBFRLR -BBFBFFFLRL -BFFFFFFLRL -FBFFFBFRLR -FBFBBFBLLR -FBBBBFFLLL -BFBFBBFLLL -BBFFFBFRLR -BFBBBBFLLR -FFFFBBBRLR -BFBFFBFLLR -BBBFBFFLLL -BFFFFFBRLL -FFBBFBBLLR -FBBBBFFRRL -FFBBFFBLRL -FBFBBBFLLR -FBFFBFBLRL -FBBBFFFLRR -FFBFBFFRRL -FBBBBBBRLR -FFFBBFBRLL -FBFBFFBRLR -BBBFBFBRRR -FBBBBBBLLL -FFFFBBBLLL -BBFBFBFLRL -BBFFFFFRRL -FBBBFFBRLR -FFFFBFFLLR -BFFBBFFRLL -FBFFBBFRRL -BFBFFFBRRR -FBFFBFFRRL -FFFFFBBLLR -BBFFFFBRLL -FFFBFBFLLL -BFBBFBFRLR -BFBFBBBLRR -BFFFBBBRRR -FFFFFFBLRL -FFFFFFBLRR -BFBFFBBRLR -BBBFFBFLLR -FBFFFBBLLL -BBBFFBFLLL -BBFFBBFLRR -BFFBFFFRRL -FFBFBBBRLL -FBBBBBFLLL -BBFBFFBRRR -BBFFFFFLRL -BFFBFBBLRL -BFBBBFFLLL -BFBFBFFRRR -FFBBFBBRRL -FBFBBFFLLL -BBFFBFFRRR -FBBFFFBRRL -BBBFBBFRLL -FFFFBBFRLL -BBBFFBBRRL -BBFBBBFRRR -FBBFFBBRRL -BFBBBBFRLR -BFBFBBFRLL -FFBFBFBLRR -BFFBFBBLLR -FBFBBBFRRR -FFFBBBBLRR -FBFFFBBRLL -BBFFFBFRRR -FBFFFFBRRL -FBBFFFBRLL -FBFFFFFLLL -FBBBBBFLRL -BBFFBFFLRL -BBBFBBFLLR -FBFFBFFLLR -FFBBFFFRRR -BFFFFFBRRR -FFBFBFBLLL -FFFFBFBRLL -BBFBFFBRLR -BBFFBFBRLL -FBBFFBFRLR -FBBBFFBRRL -FFFBBBBRRR -BBFFFFBLRR -FFBFBBFRRR -BFFFFFBLRL -FFBFBFBRRL -FFBBFBFRLR -FFBFBBBRRL -BFFFFBBLRL -FBBFBFBRRR -BFFFFFFRLR -FFFFBFFRLR -BFBFFBFRLL -BFFBBFFRRR -BFFBFFBLRR -FBFBFFFLLR -BFBFBFBRLL -BBFFFBFLLL -BFBFFFBRLL -BFBFBFFRLL -FBFBBBFLRL -FBFFFFFLRL -BBFBBFBRRL -FFBFFFBRLL -FBBFFFBLLR -FFBBBFFLRL -BFFBFBFRLR -FBFFFBBLLR -FFFBFFFLLL -FBBBBBFRRR -BFBFBFBLRL -BBBFFBFLRR -BBBFBBFLRL -BBFBFFFLLR -FBBFFFBLLL -BFBFFFBLRL -FBFBFBBRRR -FBBBFBBRRL -FFFFFFBRLR -FBBFBBFRRL -BBFBFBFLLL -BBFBBBBRLR -BFBBBBBLRL -FBBBBFBRLL -BFFBFFFLRL -BFBBBFFRRL -FFBBBFBLLR -FBFFBBBLLL -FFFFFFBLLR -FFFBFFBLRL -FFFBFFFLRR -FFBBFFFLRL -FBFBFFFRRR -FBFBFBBLLR -FFFFBBBLLR -FFBBBBBRLR -BFBBBBBLRR -BBFBFBFRLL -BFBFFFBLLL -FBBBFBFRRR -FBBFBBFLRL -FFFBBFFLRL -FFFBFBFLRL -FBFBBBBLRR -FFFBBFBRRR -FFFBBFFRLL -FFBBFFBLLR -FBBBBBFLLR -BFBFBFFRRL -BBFBBFBRLL -FBBBFFBRRR -FBFBBFBRLR -FBBFBBBLRL -BFFFFBFRLR -BBFBBBBLRR -BFFBBFFLLR -FBBFFFFLLL -FBFFFFBRLR -FFFFBBFRRL -BFFFBFFLLL -FFFFBBBLRR -FBFFBBBLRL -FFBFFFFRLR -BBBFFBFLRL -BFFBBBBLLL -FFFFFBBRRL -BFBBFFBLLL -BFBBFBFLRR -BFFBBBFLLL -FBFFFBFLLL -FBBFFFBLRL -FFBBBBFLRL -FBFFFBFRLL -FBBFFFBRLR -FBFBBFFLRL -FBBBBFBRRR -FBBBBFBLRR -BBFFBFBLLR -FFBFBBBLLL -FFFFFFFRRR -FFFFFBFRLR -FFBFFFBLRL -BBBFFFBLRR -FBBBBFFRLL -FFBFBBFLLL -BFFFFFFRLL -FFBBBFBRRL -FBFFBFBLRR -BFFBFBBLRR -BFFFBBFRRR -FBBFBBFLLL -BFBBFBBLRR -BBFBBFFLRL -FBBBFBBRLR -BFBBBFFRLR -FFFFFBBRRR -BBFFFBFLLR -BFFFFFBLLL -FBFBFFBRRR -BBFFBFBRLR -BFBBFBFLLR -FBFBFBFLLR -FBBBFFFRLL -BBFBFFBLRR -BBFBFFFRLR -BFBFFFBLRR -BFFBFFBRRL -FFFBFFBLLL -FFBFBFFRLL -BBFBFFBLLL -FBFFFFBRRR -BFBBBFBLLR -FBFBFFBRLL -BFBFBFBRRL -BFFBFFBLRL -FFBFFBFRLR -FBBBFFFLLL -FBFFFFFRRR -FFBFFFFLLR -FBBFFFFRRR -BFFFBFFRLR -BBBFFBBRLR -FFBFBFFLRL -FFFBFBBLLL -BBFBFBBRLR -FFFFFBBLRL -BFBFFBBLRL -FBBFFFFLLR -BBFBBFBLLL -BFFBBBBRRL -FBFFBBBRLR -BBBFBFFLLR -FFFFFBFRRR -FFFBBBBRLR -FFBBBFFLLL -FFFBBFFRRL -BFFFBFFLRR -FBBFFFBLRR -BFFBBFBRRL -FBFBBBFRLR -FBFFFBBRLR -FBFBFBBLLL -FFBFBBFLRL -FFBBBFFRLR -BBFBFBFRRL -FBBBFBBLRR -BFBBBFBLLL -FFFFBFBRLR -FFBBFFBRRL -FBFFBBBLRR -FFBFFFBLLL -FBBFFBFLLL -FFBBBFFRLL -FBFBFBFLLL -BBFFBFFRLR -BFFBFFFLLL -BBFBFBFRRR -FBFFFFFRLR -FBBFBFFRRR -BBFFFFFLLR -BFFFFBBLLL -FFBFBBBLRR -BFFBBBBLRL -BFBFBBBRRR -BFFBFBBRRR -FBBBFFBLLR -BBFBFFFRRL -FFFBBFBLLR -FBFBFFFLRL -FBFBBFBRLL -FFFBBBFRLR -BBFFBBBLLR -FBFBBFBRRR -BFBBFFBRLL -FBBFBFFRRL -FBFFFFFRRL -FFFFFBFLRR -FBBBFFFLLR -FBBBFFFRRL -BBFBFBBLRL -BFFFBFFLRL -FFFBBFFLLL -BBFFBBBRLL -FBFFBBFLLR -BFFBFFFRLL -FBFBBFFRRL -BFFBBFFRLR -FFFBBBFLLL -FBFFFFFLLR -BFBFBBFRRR -BFBBFFFLRR -FFBFBBFRLL -FBBFBFBLRL -FFFFBFFRRR -FFFBFBFLLR -FFBBFFFRRL -FBBFBBFLLR -BFBBBBBRRL -FFFFBFFRRL -FBFBBBBLLR -BBFBBBBLRL -BFBBBBFRRL -BBBFFBBLLR -BFFFBBBRLL -FBBBFBBLLR -FFFFBBBLRL -FBBFBFFLLR -FFBBBBFRRR -FFFFFBBLLL -FFFBFBBRLR -BFBBFBFRLL -FFFBBBFLRL -FBBFBFBRRL -FFFFBBFLRL -BFFBBBBRLL -FFFBFFBRRL -BFFFBBFRLR -FFFBFBBRRR -BFBBFBFLRL -BFBBBBBRLR -BBFBFBFLLR -FFFBBBFRRL -FBBFFBFRRL -FBBBBBBLRL -FFFBFBFLRR -BFFFBBFLLR -BFFBBBFRLL -BBFFBFBLRL -FFBBBBBLRR -FBFBFBFRRR -BFBBFFBLRL -BFFBBBFLLR -FFBFBBFLLR -BFFFBBFRLL -FFBFBFFLLR -FBBFBFFLRR -BFBBBFBRRR -BBBFFFBRRL -BFFFBFFRLL -FFBFBFFLLL -BBBFBFBRRL -FFFBFBBRRL -BFFBFFFRRR -BFFFBFFRRR -BFBFBFFLLR -BBFFFBBLRL -BFFFBFBLLR -BFBBBBBLLL -BFBFFFFRLR -FBFFFBBRRR -BBBFFBFRLL -FFFBBBFRRR -BFBFBFFRLR -FFBFBBBLLR -FBBFFBBRLL -BBBFFBBLRR -BBBFBFFRRR -FFFFBBFRRR -FBFFBBBRRR -BBBFFBFRLR -BBFBFFFLRR -FBFBFFFRRL -BBFBFBBLRR -FBBFBBBLLL -BFFFBFBLRR -FBBBBFFLLR -FBBBBFBLLR -FBBFFBBRRR -BBBFFFFRRL -BFFFBFBLLL -FBBBFBBRRR -FFBFBFBRLR -FFFFBBBRLL -BFBBBFBLRL -BBFBFFBLLR -FBFFBBBLLR -FFBBBFFRRR -FBBFBFBRLL -BBFFFFBLLR -FFBBFFFLRR -FBFFFBFLRR -BBBFFFFLRL -FFFFBFBLLR -FFFFFBFLLR -FFFFBFBLLL -FBFFBBFRLR -BBFFBBFLLR -FBFFFBBLRL -BBFBBFFLLR -BFBBFBBRLL -BFFFFFBRLR -FBBFBBFRRR -FFFBFBFRLL -BBFBBBBLLL -FFFFBFBLRR -BBBFFFBRLL -BBFFBFFLLR -FFBBBBBRRL -BFBFBBBLRL -FFBBBFBRLR -BFBFBBFRRL -FFBBBFBRRR -FFFBFBBRLL -BBFFBBBRRR -BFFBFBFLLL -BFFBBFBLRL -BFBFFFFLLR -FFBBFFBRLL -BBFBFFBRLL -BBFBFBBLLL -FBFBBBBLLL -FBFBBBFRRL -BFBFFFBLLR -BBFFBBBLLL -FBFFBFBRLL -BFBBFBBRLR -FFFBFFBRRR -BBFBFBBRRR -FBFFBBFRRR -FFBFFBFRLL -FBBFFBFLRR -BBBFBFBLRR -BBBFFBFRRR -FBBFBFBLLL -BFFFFBBLRR -FBFBFBFRLR -FBFBBFFRLR -FBFBFFBRRL -BFBBFFBRRR -FBFFBFBLLR -BFBFBFBLLL -BBFFFFFRRR -FBFBFFBLRL -BBFFBBFLLL -BFBFFFFLLL -FFBFBBFRLR -BBFFBFFLLL -BFBBFBBLLR -FFFFFBFRLL -BBFBBFFRRR -BFFFBBBRRL -BBFBBFFLLL -FBBFFBFLLR -FFBBBFBLRR -BFBFBFBRLR -BBBFFFBRRR -FBBFFBBLRR -FFBBBFFLLR -BFFFFBFLLL -BFBFFBFLLL -BBFBFFFLLL -FBFBFFBLLL -BBFFBFBRRL -BBFBBFBLRL -FBFBFFBLLR -BBFFBFBLRR -FBFFBBBRRL -FFBFFBFRRR -BBFBBBFLLL -BFBFBBBRLL diff --git a/day05/locateSeat.ts b/day05/locateSeat.ts deleted file mode 100644 index a981be5..0000000 --- a/day05/locateSeat.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Recursively follow the instructions which determine whether to use the - * upper half (true) or lower half (false) of the number range - */ -const findNumber = ( - instructions: boolean[], - start: number, - end: number, -): number => { - if (start === end) return start - const [upperHalf, ...rest] = instructions - if (rest.length === 0) { - // No more instructions left, decide between the two - return upperHalf === false ? start : end - } - if (upperHalf === false) { - return findNumber(rest, start, start + Math.floor((end - start) / 2)) - } - return findNumber(rest, start + Math.ceil((end - start) / 2), end) -} - -type Instruction = 'L' | 'R' | 'F' | 'B' -export type Instructions = ('L' | 'R' | 'F' | 'B')[] - -const filterInstructions = (instructions: Instructions) => (i: Instruction) => - instructions.includes(i) - -const isUpperIf = (upperInstruction: Instruction) => (i: Instruction) => - i === upperInstruction - -/** - * Implements a recursive aproach to finding the seat based on the given instructions - */ -export const locateSeat = ({ rows, cols }: { rows: number; cols: number }) => ( - passId: Instructions, -): { row: number; col: number } => ({ - row: findNumber( - // This converts the boarding pass instructions sequence of true/false for only the front/back operation - passId.filter(filterInstructions(['F', 'B'])).map(isUpperIf('B')), - 0, - rows - 1, - ), - col: findNumber( - // This converts the boarding pass instructions sequence of true/false for only the left/right operation - passId.filter(filterInstructions(['L', 'R'])).map(isUpperIf('R')), - 0, - cols - 1, - ), -}) diff --git a/day05/solution.spec.ts b/day05/solution.spec.ts deleted file mode 100644 index 4a29a0f..0000000 --- a/day05/solution.spec.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { loader } from '../lib/loader' -import { Instructions, locateSeat } from './locateSeat' - -const load = loader(5) -const input = load('input') - -const l = locateSeat({ rows: 128, cols: 8 }) - -describe('Day 5: Binary Boarding', () => { - describe('Part 1', () => { - it.each([ - ['FBFBBFFRLR', 44, 5], - ['BFFFBBFRRR', 70, 7], - ['FFFBBBFRRR', 14, 7], - ['BBFFBBFRLL', 102, 4], - ])('should solve the sample: %s is row %d, col %d', (passId, row, col) => { - expect(l(passId.split('') as Instructions)).toEqual({ - row, - col, - }) - }) - it('should solve', () => { - const l = locateSeat({ rows: 128, cols: 8 }) - expect( - input - .map((passId) => l(passId.split('') as Instructions)) - .map(({ row, col }) => row * 8 + col) - .sort((a, b) => a - b) - .pop(), - ).toEqual(951) - }) - }) - describe('Part 2', () => { - expect( - (input - .map((passId) => l(passId.split('') as Instructions)) - .map(({ row, col }) => row * 8 + col) - .sort((a, b) => a - b) - .find((id, k, arr) => { - if (arr[k - 1] === undefined) return false - if (arr[k + 1] === undefined) return false - if (id - arr[k - 1] == 2) return true - return false - }) ?? 0) - 1, - ).toEqual(653) - }) -}) diff --git a/day06/collectAnswers.spec.ts b/day06/collectAnswers.spec.ts deleted file mode 100644 index 09797b5..0000000 --- a/day06/collectAnswers.spec.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { collectAnswers } from './collectAnswers' - -describe('collectAnswers', () => { - it(`should collect all answers`, () => - expect( - Object.keys(collectAnswers(['abcx', 'abcy', 'abcz']).answers), - ).toHaveLength(6)) - it(`should count forms`, () => - expect(collectAnswers(['abcx', 'abcy', 'abcz']).n).toEqual(3)) -}) diff --git a/day06/collectAnswers.ts b/day06/collectAnswers.ts deleted file mode 100644 index cb7ea69..0000000 --- a/day06/collectAnswers.ts +++ /dev/null @@ -1,26 +0,0 @@ -export type Answers = Record - -/** - * Creates a record that counts how often a specific answer has been given - * in a list of forms (AKA a group's answers) - */ -export const collectAnswers = ( - forms: string[], -): { answers: Answers; n: number } => - forms.reduce( - (answered, form) => - form.split('').reduce( - (answered, a) => ({ - ...answered, - answers: { - ...answered.answers, - [a]: (answered.answers?.[a] ?? 0) + 1, - }, - }), - answered, - ), - { - n: forms.length, - answers: {} as Answers, - }, - ) diff --git a/day06/input.txt b/day06/input.txt deleted file mode 100644 index 3d0415a..0000000 --- a/day06/input.txt +++ /dev/null @@ -1,2211 +0,0 @@ -ymw -w -wm -vsw -wm - -vs -lqn -ti -uvl - -fryuv -pngtvuhfr -fcbrulv - -pr -rp - -tdvcspxnujak -vektaowjncs -ifybztmhlasqrjkgc - -exvbqomlucjfi -cufeiomgvl -uolcfvmie -eoculrifnmv -fvclmdnoeiu - -iyomzvhpdjtrw -rpnovdhwzmityj - -emplyqxzfjrwb -xrezwjlsqpb -prdvzbhljqxaw - -wtuolk -kwtluj - -kixnqubme -adjgfwvl - -lkzqupo -nsfhbc -rki - -gkmqehib -ngiemuh - -m -s -s -w - -tu -arudi -gukp -u - -hkfs -hpfjk - -yzkuhrncx -dqasvifwne - -x -x -x -x -x - -zabmrcequtghsnlvdpkfij -drbelmtjasiupnhqgfvkc -hdvlprtebgamqfknijycsu -pcirvatkgmhndefulbqjs -hinfqkldbzcretsuvamjpg - -eoc -omvqig -aglo - -qgnjkcirewz -vmwhuafoxpt - -zinoybesugqjhr -fzgeasrhynq -myzngtrwqvl - -gdma -dq - -haugzib -xeghuf - -fsl -fsg -fs -fts -sf - -bysucwlra -ucwylrbas -sbkuarlcwy - -skmphtzonuydfxi -xpidmolthzywfusg -hxtysznfimdpou - -gonabqykhrzmpsl -pyrblhznoswkgqam -pgbohakrqzslmny -ogbqmyprlnkahzs - -hdcl -cdlh -hdcl -hldc -ldhc - -fiwztpbcxreqodunljvyh -fsrmnugobhydpkc - -fcloanbrm -dnkaglrxot -swvylepanjhqzoui - -upali -kyilvspz -rlejqntbmoxi -iklfdw - -tdxwaqsybovjgm -bmxjznqdt -ujtmehxqpldb -qbltpkrxjmd -qjxdzmbit - -avnituwozrgcjmsd -rwsaocnugzjmdtv -zanrotwdusjgcvm - -duqy -iu - -rnatpelzuiv -eaizntulvr -fntbrilvaezu - -vwprtg -nfrwluaodtphg -gtrszpw -writqgmp - -ayxievonwmtchp -aytxowvcpmihe -xtehvomypcwifa -hwmoytcvipjxae -yvawtmeiocxfhp - -dnrpaivezcktfwy -vdpnyfzrmcktwi -icfnyrtpzdkwv - -gejt -getj -ejgto -jtge - -btmwidzrun -mtunzdrbi -oiebudtxkrmyz -ztmbdrui -dmzbrtui - -rasxhidbgw -klxwvhbeacidsg -dhxlacgusirbn -sqabjmhtifxodg - -utpkgqjiycexosvanwl -grjfvnbuscwadmihxzk - -ktnhpvqxzfuwosmgl -fwxmtvzohnrlkgsup -hvlzfroxucmgpksnt -pslyfovbigtukzxnmh - -zde -zed -zed - -v -v - -calfotjxbg -etagbc -brackuvtzpgi -mdhapbtygcv - -hkdb -eahrxg -pohs -hujbq -dchbt - -nw -ewgr -amyh -pquwn - -o -o -o -o -ou - -oakzcxnp -xoclan -oxazcknp -hwcomfxna - -iymzjovgkdrqpalehubc -ptcgyqhrboazuv -vxyohunafqcswzgprb - -azwb -zabw -bzaw -zabw - -zu -zxi -fldo -u -p - -ejhtlbm -etblhm -mtbelh -hbltme -thbelm - -tnqxahufm -bhftnxumaq -ufbahtqnxm -amnhfxtuq -qfxumwanht - -vgdtjm -tdga - -wkzbx -tksxbwz - -niasv -cirenka - -pvbjswzixkcug -bxvjwsiugck -xcwjbkisugv -bgikucvdsjxlw -aswuxibjgcpvk - -vrjcpfuhetkd -mjbhzwctpeyk -qhwepmtljksc - -mkdb -bkmd -omkdb -kmdub -dmkb - -tmharzskfycvnio -abdmulpwjyxeqgc - -skmacnpgzho -ghsnpaczkmo -haposzmgnkc - -mrngvewdsqca -tfjyqhkxes - -ampi -m -mt - -kcduvyaqgtpfmij -vxgfiqcdlajypuk -gcyoeufqkpdijmav -cvfuqpiyeadjkg - -tblyemri -teburlymi -tneidylbrmfc - -jtmkxgehipfuasqrbwvcdyn -azwkvfhsbynrjpgmutdcqex -uobjpcgzstharyvkxefmnwdq - -etgikbzjd -zdybhkwteqig -ouitdbrfgeznvkxs -bekipadqgtzlc - -v -ale -c -h - -neqvowybzx -nybezqwxvo -zbenxwvoyq -vqbxwznyeo - -kwdm -k - -eahrozxdj -aopndezjx -emjaonxyzd -jxeaufdosz -yaoedxjz - -hzwc -s - -bnemwzv -mbzwnve -envbamzw -ebnwmvz -ezvntwbm - -djkqnrcvpseohazmflb -jyzftduhbnparmlscqovk -zksbneljmxcfdprwaovgqh - -zxfgtveb -xfbetvgz -txevgfbz -tfxbvegz - -mfcr -cfmr -mfcr -frmc -rfcm - -qsdvzyixl -zvdlqy -znydvqlku -lvndzyq - -vpok -hoyb - -lucohageisvdtfqnbrxk -naekdgslcqoftxrhbvui -oxgrunehtafkbidqclvs -vrdsfanugtihkxqlcobe - -poayngfzwb -mzyi -clxuesdvqythrjk - -vtsxloimpq -sqvxulbiomtp - -xlo -xol -lox -lxo -lox - -mqtafugsj -wahiptqjbe - -nuosc -usocn -cnuso -socaun - -rwchjlkmidbtxupfvg -jkudgvprhalcfbnymtw - -uptazbcdxywqf -buqywadtfhcx -klbduawtqyx - -klfyrxdzn -lsnrcyvzokhx -eafrzqkxly -xzlqryk -xwriykmljzugp - -gfvxdi -vtwigxdj -xdnvgyi - -vs -sepvngak -vs - -dqzfx -xqdfz -qfdzx -qxzfd - -lfdksujt -ijcdtslkf - -rxqevdwishmjfluy -lwshvauecgrfiqxyjm -txisrubqelyfwvmhj - -ijlvuenzdsykfwc -qkxacuydnehzbglsrfm - -purkflqgovscyedzhtinxa -ensuvzrftpdgcxykhqilo - -f -p -jkxa -p - -rwqcyxtbvn -rtbwcxqnyv -ytwvnbxqrc -vwxcrqtnyb - -takohlgzesf -katgsozeflh -aolgtesfhkz - -jakvrlxipqgwn -xwjhigvkqarlpn -vrlitwjqcagnkxp -ngcljqvpkrwiax - -csg -sgc -sgc -gsc -sgc - -xftrpzkynwjcils -tyzjfncspxwilrk -clxjtnsriykzpwf -rcflzkwpxjynsti -ntwxsapejzkcrilfy - -gmabr -mrbag - -idrvzjbafosemw -fvewdrjazsmibo -woisjrtdvxezkabmuf -aifmbdjowzvres -jzesabwvmdiofr - -cvsr -scvr -srvc -zcrsv -rscv - -ldjs -sdjl -sdjgl -ldjs -jlds - -vf -vf -vf -vf - -nqi -gmiywb -il - -bsvamr -qkvrab -abrqv -ktabvhr -rvbhax - -cpgsqnorkay -yproncgkqsa -okapcgqsnyr - -fhcrk -wjaxbchs -flunch -khorczi - -uyj -jyau -yuj -yju -ykjiu - -yuqwkzf -jaocfzyxpw - -ayqun -vwpzfoj - -ftkx -nftjkr - -saupfiylrhckzdmq -idwlp -ldip -wlidjp - -qhiu -suqni -iuxnq -qui -iumqzg - -xvoqnda -dloqvnxa -donvqax -vqdnoax - -ctblovfpygsmwqrjai -ivfwqgrpsjtacm -pmvqtjfragcwis - -m -ms -m -m - -v -vxcjl -tvgn - -agcvutldfnwpoqhe -panwfvugetxqo -tusfwgmoaeyvnjkpq -wvutgfoeraqmzpn - -pfelnjvha -qmzexonlv -rbyiugdswk - -spmzxl -nhbuvqcagdi - -vpfmjgitk -vefgrdkpit -gfitvkbp -pftjvgik - -eiczmbkfargtosjdlyhwuxqn -uiqdwkptonjzxlfsrgemahycb -mnfzskoytqlbhuidjagwexrc - -ylcroxz -azolxycr -rcxoylz - -ipjvbtacrsuklozxqg -gkczovaibqptulxsjr -zsuctpolbxjikqrgva -aglbcjqsvzxokrupti -tlpurqvxgazoibjsck - -chjtiyplzb -rzcplthisq -lcwgmnzvhei - -uvbqnetmkdsg -tcgizb - -anet -tnea - -b -lbm -b -b - -rjsgkvxnoctybf -onhbkjryzvtcfag -rvtbyfgxsonkjc -fcgoktjnbryv -cvgpjdnyrotfixbk - -woyzins -vml -l -ekh - -imurfjexb -iufxme -midneuxf -ztudmxife -kymfxieuod - -fjevlykwshit -jfpwistkglev -ljidewskvtf -orqwblzsevtcikjfu -xayemltwksfjivn - -jmfbqzsu -jsxbiumfv - -kuytgfqzwolpxdcnjhrsme -xwzjpqsgfmdklhytocuren - -tswk -ztqw -mdrpthif -t -tw - -rnskdcauhe -rukeyndhasc -ahsrknuecd - -mxsaerbdhgqcy -xvqybdmahreos -qyxbmgjsradhe -bqxheasyirmd -rdqehysabmx - -bkzxw -xzkwb -xkwbz -wxjzkb -bwzxk - -avlwfyqrp -jkozmedhgubsxnct - -ie -gkec -epx - -xvbisfp -zxprafsim -pwiqhkfucsx -sflxmjbivyp - -mkhg -dpnflvzhesrt -bmhu - -mpl -pml -pml -pml -pml - -hdrtnziabqscwxp -btdczqxhuwranspi -prwatsxhzbdnicq -hxrnzawpcsqbitd - -gxzafpjvciywskn -wnzvjifscrxykapog -ncsjiapyzkgvxwf -jkexzingwpvscayf -iyjzfwnckavpxsg - -xtdblwyqfsjak -uwtsncvjlm -switjlm - -j -je - -ce -c -cy - -semxdiqw -lbnmaq - -n -n -n -n - -rq -rqes -qr -rq -qr - -ibndxgtuawhokzc -wkxhgdcznjtoaiubp -uxzwtdnblapkchogi -zhtidxwvecobkgyuna -cgabuhrpioxkwdztn - -ekcrfujsopgvbwxtya -jeykusfvpxbowacrztg -frkjsygapcowxubetv -shjoyanumqkertxgbdfwpvc - -mfw -pfwm -mwfi - -ocyhq -chqye - -nzsxagpfuhmqkcy -flyqunphxm -qmpnhxufy -mjurwfpqhnyxe - -pxqf -pqx -xpq -qgpx - -bzhprgot -rzhpaoug -rmhygacqxvkpjzo - -tlzpvdgkafqw -clqvpgtkafd -lgetfbksxivdprqah -kuptalqgjfdnv - -rfkwoalbjdi -bkilwjfro -orwjlkibf -okbdflrjiaw -nrwjzoibflk - -n -n -n -n - -vznusdgkmcrxfpwojtleqhy -rveftohngkxzdljq -lefikohvbxqrjtdzng -xqtnjzvdglfkrheao - -xohambwtulqnpgf -ruxmopbjwtfncdgal -bnsptuwyvlmxzogif - -azbsgpwihlcfmuk -ahfgulbckzsm -gslafkcombuzhj -hujmklzgbafcs - -nzdqthy -wjeagzcxyiq -qzfycp - -hudclx -quczdxhl -chudlx -hlcxdu - -nrmypdbzvolxga -ykgtvfcasz -yagwvqze -zfvygja -iyzgauvht - -eitov -aizw -qjai - -ruptmgzobxa -hjvsdwylieqnkf - -njsgbwltpyeohf -gxsojntpyfwlehb -fontbepsjwgyh -mdfhypjeobsriktqanwug - -pcunvqdgxjfzokwm -awighqdejvnflp -iqdnvfpjwlgs - -upqz -zhyxjdtlv - -nq -qpns -nqfu -qnps - -lve -pi -ipf - -uafxbjp -lfpjcw -rjfp - -obh -h -h -h -h - -ezx -xze -xze -efxz -zxe - -yshdxqelnzmuipowr -oqsedljrinmytwuphx -ljnbcirxshyouqdzewp -wbiqxtrducehoylspn -rvshygoewlqunidpxfak - -e -e -e -e - -hyuwjlgxoa -chajowynxlf -wyfhlnjaox -aztohyxlwj - -eqldmuxigyhktfwbczapnrvjso -vpxflgohmqijwadnbykrecustz -kswxetzualphigncdoqjmfrybv -znilqdpkgratwjvuybxhemfocs -izjbnyvastgdchfeoxmrwqpklu - -qwjzem -ewzmcqj -cqzwejm -mwqejz -qbmkjdzew - -rvuoscwqldtnjfpyk -dstluofwkrqcjnyp -ujnytlcqwsdaokprf - -cbhwotxiglrm -iwlhgcbtrom -ibvrotmjscgwh -gkcltbmrhoxwi -tzrgowmcbihx - -dc -cd -cd -dc -cd - -pnsjqghf -ntqjfhgp -nfphezrjmgv - -gotlaypnhj -ylonphtgja -gahjotynlp -lpajtyonhg -lynopgtajh - -uqkwycrbd -dubvkqrcywm -uqdkybcrw - -hvwialzjfqecpukxdobr -fhkeaczluqwbpvrxdoji -qkabjohpwcurvxlidezf - -zjrqhwbkcdv -cvxjhbqkpwdz -omdzlwkbqgcajhv -rjcvqwzhtdkbp - -olmvrwtagfuyjbzi -mfrtbuvjizaylgow -vafmjgyubzliorwt -orbmjpvigztwafuyl - -rgmodkbs -mogs -suogdrm -togm -mogv - -hf -fha -tfh - -bcazwpirygekfoxjdtnlmuqhvs -fzkrwyuslvmajxqdienot - -xdanjtygfrwhkzblpq -jamxfwzklchngrby -hyvlbzfjrwkonga - -shaxbk -rztkmls -nwjvucedk -okt - -rpvukdoaqfywlciehjnt -qxwhtregcnilvapskuodf -ltacrhfwquvnizkdjpoey -vtqekcpnwauflhiord -hvqlkurptfaiwnemodc - -huqwrpfsilxotcazvygdnj -navdfwistcpzljgruqxoyh -lhdipqtczywaxunbfojvrsg -wotlyvzfjdqgcuarhnxpsi -qfgyonxuzavspjrdhlciwt - -qdzjxfhpnmbwtuskyceg -sxyaqfwcjehkprodzvg -iykjhqscdzfpwxoevg -qsveyhjxczwgdolfkp - -jf -xn -gpw -k -n - -nc -c -c - -iyfavqodmwgzspceblxuhk -favzwqtgkyspuixdcbhr - -hdcazlv -wtqbg -seu -krbju - -myldhzr -wutkednmhla -yidhlvcmr -omhrdgfqblpc -jlsmdxh - -omnhyavdercx -qzncxyamro -wmxynozpbauric -kcnwomxyrba -pnocxymrka - -bj -ybjk -bj - -lgqkmsndwhx -knxsqdmhlgw -msxdqwnghlk -nyxcmgwkseqhldtv - -th -qzxyw -a -m -ohu - -sujpydikhnv -vnjyhuitksp -ajenhpviskuy - -gnjvqlwfxor -fithnsacxjbkmez - -rf -uwklarfc -xrf -vrfd -fjr - -gtoxeicdfqm -gtiqmeochpdx -tedlycbxqmigao - -muxsonhgp -yudpsohm -shpmou -rmpohus -ojmhups - -cjsgzxr -axclosqg -cgxs -cgxsj -ixscg - -v -v -srgbv -vo - -doaphkmvec -adrwme -wytmaesdbun -ieqgzdxfjyam - -lcgmfa -agflc -alcfg -faolgk - -i -ibe - -jemfp -mp -pms -mp - -u -u -rda -u - -hzdl -xrgdz -vjfgdzr -zknswaeuidcmq -zd - -rjwpoqyvzcxektf -xqzwjvetofrcypk -exwjyovkrfzqpct -zctewjxlnorpqakfvy -otxcrkyqfpjewzv - -vyhnmjlgekxobps -prgbyltswioquvfmzex - -q -feq -dqwx -q -q - -i -vbytcon -zksragjq -xdf - -lqtzbjudwhm -etgyxpcvarsnko - -dupshvrnafz -zafnhrpvodus -vzpsufdnrhxa - -ylkzmodvqg -dgmvzqkloy -qkvzgdloym -glqomyzvdk -mldgqkyvoz - -v -o -v - -actqvguieyrf -uvzgaryipqtl -hrlixgyvatu -dsjokyumvirgwt - -q -q - -xqln -lqxnu -xqn -oqxvns - -i -i -xi -i - -cxtnd -dtxcn -vxctdn - -vspoaczketurxdwj -vkjlrwznespouxfcadtg -pwsrxvedktacojzu - -qdis -sud -dnsquvf -bexgrdsj - -mfjcevsywhnuplxiqrzba -ibxrpeunqhzscyfljwmv -yjbqzixfvsupcrhwlenm - -wpvmzkhb -zbvkhpwm -mbhyizvwakp - -bqfzaeoig -fbzixgaoq -foqizgb -dkibvjquszgofy -ogbfizq - -wnz -nwz -nzw - -vthxfdk -hfdkgt -vsfdthxkq - -uzr -rltz -krfqz - -aoshypdlikqfutvebgjnz -qgtdkobisc -rotbdmcwgskqxi - -trbziwe -qlmuxkbyngrt - -nuqdyjmg -nmgqydu -uqmyicgwnvld - -phmc -pd -pd - -slj -usqjl - -q -q -q -q - -zsryajnihfexcguvltk -zvhcanygretxiuk -izcquegtyhxvnakr -nrixgcuaevtyhzk -aeckhzgyqxnvtrui - -bkyhnwitqoflxuz -oqhzbntkuwyxfa -hxbywtkqnzouf -qwgkxntozihyubf -nxkzusfeocbtqwy - -xwloszbpcatn -pwzblgtanoc -abcngtwlozp -lfzabtnwpoc - -paof -paof -aokpf - -yermvpgouhilaxtsf -hiuapfsmvergxl -ulemxsipgvhfar -gfimvphualerxs -pusxveifrmglha - -qwzfjcbxvhaedmu -hczufqwejvmabdx -bvumhayeoxcqdfzjw -awhvdxnfcqzebjmu -xcfwaqubhdzmjve - -p -u - -pabrkst -kptxsb -nofjptbglks - -pwxtihaoryfqjcmk -yrzwjqiokaevmx -ypmdqrkgxubljownai - -wrezth -nbvma - -cxz -xzc - -botydczsvwgikrfa -otkfryqwmgnacisubzxd -zfcdkyaosrbtvigw - -rpestzqxokcb -qrxgimauceftnzkbhdsjw - -msuerxvhajnckb -rcahunbemkljsx -cgmsvxrhjbkuna -zxabprinwjmcshku -rucajnktbmxsh - -infwrgjphdvokebsqzy -eahcnxpljksfqbwdum -ktdpefljwqnabhs - -oilcxdjheuyprna -cpydlhaorjxuie -jzairyhpcouxeldn -hucoibrejxyldap - -jbiglmtowxvkdch -ygmjiwtdlohcxkv -cwtfxlhkmsgnvojid -rakpdiolcvxegjtmhwz -chojlykxmvtgiudw - -vnqoimutgcwyhx -iwqnecovmyg -dsgmiqeyocwnv - -wzjtrynsfqkga -awxkqtnjozdruyg -yngqeajwtzkr - -jrg -jgx -jg -gj -gj - -ryaxghznduqmkve -kxnrfzbye -nzysjlbriexk -rzfxjclenykpw -teyzrkxwno - -mhlaqj -luajh -jhla -jalh - -rdbvoqszekg -ekltghbudosivqarz -qkbgsreovzd - -r -r -r - -il -io -ix -i - -nkyrthauqjb -jyktnabhrgq - -rkjnluewc -ybgmizxto -efwlprvc - -ga -a -a -w -a - -goexmwfchknjbliap -hbxcklgnfipajwmot - -nwzgbjo -njwyclbsk -nhqjirbwv -fwvbnrjo -wjbnud - -thlemzwakn -taylrneqzmh -exsovpcnzitmfua -aetmjzn - -hcozjrtsx -sxrczhtoq -ohxgzirsct - -yojqc -ocqy -oqycd -aycqo -doqcy - -jvuigo -zvujgx - -isolkxcghzvfpajdeuyrb -hutcjnmxgyqvrkeow - -rocqg -g -gcsx -gile -ngu - -jwhoelbgiscfzakmx -wtxkmcoslzigjebafh -fzshoicblxgkemwaj - -mubtlkhjspeynw -lkstuweyjmbhnp - -tdpy -dypt - -set -ts -stol -ts - -tfisjzu -tusfzji -fusjizt -szfitju - -cwlvjiuqkgom -twedofxgvynjqa - -jhuwldvt -twhd -trwdh - -mzlqyv -gzydvqm -mejzytqvb -qmybzv - -qsdpagrf -ybfuikxm -fjdprszch -jdzcofn - -cuemfrdviynwko -ucisbdwftjyxh - -wim -wi -wi -wi - -velqabhypocmxjs -ckvqlnybrughtmapwdzs - -fleghjbtvqrzdpy -njfzrpqyhbkvdlwet -lefdyjvxrhtbqpz - -n -qn -dpn - -hsdxgiartqfczkmeoy -dmothqjezsfyikgx -wsgndtmezoyikqhfx -dfsxqpotemigyknzh - -dhirx -jxbltqdrf -rxnzdyw -xyrdw - -gztrajypuesxmonwlhdbf -opjvelthnqxgfkbdsayrzmwu - -dsqzkpj -kspqjdyz -qszdpljkm -zjpqksdn - -bdvmoeinsw -ldvma -pcytgzqrhufxmjk - -qtvdacproxhyfeig -iqevdchgxtypfr -iqyedcpgxfrvht - -tnkvcfobej -jicwsrbxeamy - -rvqnbulwdgocf -kxgoulzs -mlugyok -kuehijpagtlo - -pnayvm -vmpany -mpvnya -ymapvn -manvpy - -juandk -bqamunz -cnuxt -oshgeinw -nur - -artidpmywzx -bowqmgenkcruj - -ymbgfnv -mynvbfgl -bmfyng -mnfgbiy -nfymgb - -yc -x -y -ksfv -o - -t -gmq -lhrx -zfvb - -rzaokythm -madgkjqyhltz -thaozykm - -jlecfkhazwyqtrsgn -clrwndzstjfqkgeamh -zenxwahslptgrfcjkq - -lhn -qztv -yp - -gv -xqg -cwpierytzuh - -u -tvfy -uo -j - -ywofspubhrgjmcilekv -skejhiorglvbyufw -arezwfukjbgysvhlio - -xpnldkub -wkdnqupx -gkyjduxon - -qubrihmgokzjclvytdfaw -brueisfpazonxcqk - -mykiwzenjtblqasdoux -njuxkbytmwleqridzspa -aubkqjmyinslwdxzte - -kjdn -ts -xw -sypu -c - -iumldrvwogjbs -ujwsemlrvdibgo - -zlknvwbhy -nzms -nitsz -rnzm - -ngde -lge -buatigrcvz -xewgy -jlopdg - -xjnythqakgsruicbld -ezfwpmov - -es -se -nsaer -sxcwplje -gems - -r -s -r -r - -enkqydmrgjvsbhau -hmbgservnjkuyd -dherisgymjvbunk -beyvnhjxgumsrikd - -a -aex -oa -oa - -ibedyc -ondfctsjy -cdykvga -ywacdbvuq - -mlowux -wqplxc -lhxkwp -pwxl -lxws - -truzalwqfpcinjoh -baxwplhjrzvgfynqoic - -fdbshvkcm -dcgzskfwb -iadczkfb -ydfrqcobk - -gpisnoletr -symv -qhmfws - -bjfm -ml -mvcd -mv - -levr -v -qv -vq -v - -j -j -j - -uepmnys -ymgphe - -bvlrqpgj -qbvgrpmlj -vpjgrlqcb - -fmsuteojyqchwrdv -rdyefmqoschwj - -cnudzpksyvbeoxrijqa -iuokqscnjyvpzedarxb -sxijkqybuoavpdrzcen -zckabxsoerjduvpqiyn - -qdwinxo -cxabnqgmiwo -ienqflorpxy - -tsbxdevwi -evbtwidx -vbextiwd -dvtwixeb - -pedufvxjgarqzwy -zvgpfyqrtu -lfzybuscgmvonpr - -pgmqjt -ulaib - -jefg -vb - -ltqevp -grik -qelv - -jh -xh -h - -diaukxtvohzwnbecsgjr -znyrixahutkgbsopvewjcd -zxsbcivunhqojegrtfakwd -dwuzeagjhtcvrbnikoxs - -qnasfbreph -bpka -lpbao -paylb - -flmoxzuakb -dhtnicpys - -vsnxozukyfqmj -ritpgwelahdbc - -ndripfaw -fry -rf -rfy -rf - -dqpouiscz -dfouc -wocdlmuneb - -coiwvtezuf -tvzofcwui -cfoiwutvz -uvtocwfiz -ntvuoczifpw - -aycwonkebidt -vbekioyctad -ckmafdbiyroet - -bne -ben -ebny -nheb - -bcnvuf -fvubqnc -fuvnbc -bcevnuf - -catnl -anclt -catnl -tngcal -nlzcato - -pcohyrgfwitkjzxa -pswmtxigkzhlrjafy -rfahwkxzgtjynspi -vhfgpjtinwxakyzr -jebyraqiwfzkgtuhxdp - -ifzpyvnrxscqmealb -ypnrofazxsbelqvmci -mzxfpgroayqnbscvlie -cesyrfqvixkbhznpalm -pqsenbmxzrfyvidcal - -zyrnivgqhjxsopftadmk -humogbldxfecrpqjwa - -lgwkuxemhaifprosq -rgfsxaiwuqhkpmeol -axgfepmsukroliqhw -aiwqlusgfokmehxrp - -wmanq -owqpagm -abctmxq - -azsnmugchqfv -cqvsmfzebuhagn -qlwafvnxusgmczihd -ekzfcusqhypangvm - -jdfau -ufa -auf -ufna -fua - -jrvyckoizf -bmka - -rvmoylsthqca -ohsriqxyaczt - -gkajpilzfeodcunwsvbrhmqtyx -jdqgenacxzrhotlwbvumfkpyis - -xewygnkia -xyinagekw -nkayewgix -anyxegkiw - -qlykxzcthnprfbej -rlckniyjtzpqbefxh -cxgbtephmkryzjfswqln -hpjtfkcebzyvxlrdnq -ftkyrxblchneqpijz - -p -b - -vc -t -t -t - -vagutfpbqhielzn -bpnligtvqhaefuz -fpevuihnqbatlzg -efvzlhigupqabtn -lufiztepnqghabv - -rfbsmiknjogvhyq -mqpikvjrtfonycsbdh -svyfkbhnpmiqrojz -whnsijavbuyqkrfom -kiyjxoqvblmhfrsn - -gaxwn -pgmeaw -bfxagw -gwlsa -gkawyc - -cxqozuawvliptyjhfs -ahvuqityolspfjwzxc -xifpthoyclaqzvsjwu - -syfbj -ysjfeb -fsbj -jbgsfwk - -rquip -pjiq -pqi -piq -dqpfikv - -p -kiwh -z -fyvmrc - -yh -hygs -haye - -uqxvaojkbw -jqawxuokvb -vuxbqkjawo - -pvzba -bymav -xbyavn -abv - -nfasjxqwrgimztvcludob -ldsxumwtircqvzbynofjga -uchrlvstdmixzkjanqgowbf - -xbsdla -hupjrknzficy -tveoa - -cafoqgjdemsnk -fjivltcdmg -fgdwphcumjb -vyfxjcrgzmid - -orciqajldy -ohdqiylacm - -y -y -yu -y - -li -ilh - -lta -avle - -wnkha -awnkh -nahw -vhanlwd - -cfmurandsiexvwq -vzidurtyboemj - -gosh -hoesg -hgotel -gobhj - -wransfipukq -riflauznhqbpt -rtvaiunfqocpl - -vdajgmsqrpefytzil -txdrisplvafzujk - -elwgstkh - -epwji -jpfe -hmsryxap - -za -abokz -tazefsl -apz -zbar - -wxtufcbpdlesrzkvhgmnyjaqo -oeflsvhjwmrznckxdaqgytu - -wxydrbvmokunatqpe -xoeawvpqtdbmskrun -ovwxrkuqatdpenbm -wreubavpxmtqdnko -xwpkontbvueaqdrm - -npjrtougxm -ptojgmrnx -ngmxpjtfr -jgzxmtrnkp - -c -sc -jg - -vszrmkhqjpgayc -otswxfuibdl - -snwpgtufhaqoxberyjmkdi -tsmbkenrfdujayhwpogqi -fkgsmebvjyanocwurhdqzi - -w -s -w -w -ciy - -ydxstgncopql -umfrvjawnekibhz - -xjw -jwx -xwj -jwx -wjx - -kwgxylvafh -fyvhxklawg -klhygafwv -wyfktslgahv -wkxlmyahfgv - -git -igt -gti -otgi -git - -vnih -vionh -invh - -pstycrxzeg -yrcgtzpe -ctpzyrgs -tkyvpcbgzmri -gzpytrc - -hvlq -hzj -hz - -knrgyxumlio -dyirljutgnv -zagpinwuyhr - -mzlvrsgpid -pftrocn -awqprfnhux - -wvlpjegodb -dvbegwjpol -lzdwjkfgpobveth - -slwmnda -swmdl -sqwdlm - -iahz -hzai -iazh -izha - -ozaq -zoq -zweqo -zoq - -a -qo - -vbylpk -gferiaouxwntc -qjk -hqmks - -kmtqnhjuorx -gjmutoxqdnr -uomnjxqt -omvpxuytqnj - -mdjgyzhnrbqlkixwup -umbnjkwsdolhizgrqpx - -estfmkocwlzua -wertfzuslakm -zsxntkfewylm - -ewozvybutrlc -pcmtlz -ctflzx -zsamtckl - -rcnabkwmljygzdhpos -rpadmzhwgbolknsycj -ojhgrczpwsymklbdan -hmrwybldcskaojgznp - -vuyj -rjuy -ugyvjz - -gtbvkoi -otkbvg - -wzmshqxk -uafswryemj -cvhskzwm -xwohmgqzcs - -fezyavinmdjxwqthp -uhmydqjoewfzaxt - -ytobegs -rebynogpaw -cgyboueh - -hqmen -okqwimt - -n -n -n -n -n - -mtgye -mezq - -njpgvcwbxzqhauds -nghbqsjawpvuxdzc -zsqdahuxwpvbgnjc -vhdaqbspzwgnucxj - -sfebtowpijhcl -xtokqyecmwphlid -urtighewvpoza -tbpofwinehd - -xmlctywhong -rliwocgutxaeyvn -ptydglnfjzxbso -nogqtlxmywauvh - -rjecz -aehocvg -pyufxqbmsltw - -wquytmaroexfgzkclvb -umtzxhavjsqgwrckpb - -cgvbhlyxtifkzsewjru -rhsftpjgmwabzlcvqkuxone - -ndgizukav -zuinkavdg -udzgkvai -wgudikvza - -kfvpnot -nvpotkf -ktpvfon -pokfnvt -vfoktpn - -kqrd -rdkq -krqd -vfrqkd -qkdr - -zyqijxlfdu -zdjfixyq -zihxyfjdq -xoyikqjdbfezg - -rq -qur - -bozhntm -oeprf - -ltx -ij -s -fyvhcdqkm - -cqivpm -vmcpqi - -ntb -tbfn -nbt -pbtn -cbnpt - -a -b -yexo -f -t - -tqfazuimjbxgsvedkp -exczvifmsqwakpjtbug -xijzfqcgsvkbpteamy -esorqhmlpnbaijvtgzfxk -evsjiztqmpafgxkb - -vhljf -iknboam - -kg -jbovgtl -g -gw -iugx - -j -j -j -j -j - -omsul -ucsim - -zykn -aisxbtez -lmzc -zl - -a -a -c -a - -pkso -noku - -rpo -opr - -jh -j -j - -akqpzhoyrjwitlcxvbdume -mwyrjqzavueokiphxlbtc -yxbrckaepwiomvzqltuhj -voithcspxmwlkyaujbeqrz - -naqe -efnq -qne -qenk - -chwluymniztgrxafdb -tghnclypeiufsbkwrxam -iynhrfluwgcmadtobx - -icgwkoretxmyuzaljdvq -qxgfkuicowleaszyvrdmj -gukrvdczaqojyliewmx -rzosixlycukgdmwejavq -qmuleoaygkrjdicxvzw - -erqbuao -peoaiqnf -axoqegwm - -ikaydnx -ykja -yksae - -jmwfaqxrztivlknscghbu -zkruqhclxainsgtjvfm - -mykilgzq -gqzmlki -kwlbiqrzpdgsxj -mgqkuaiznl -cloikfzgyuq - -euba -auewb -leabfu - -zoqb -boqz -obzq -qbzo -ozqb - -lrjvtqf -jrzqltvfha -tlqfjrv - -xosvzaq -qsoa -atqso -asolq -aoqs - -ckilsdrut -ldrsjtgenqiu - -etvizsnywkjobh -jskwoevzltyibnqh - -ctkpmiyohjgbuldarn -hoyfbkvdt -zwthxsoykbd - -dciagsvnmzyruephk -aslrwitjvenxgcd -vebdqnarctisgl - -nlzs -zobwxsln -zsnl -rsiucynlz - -gziwqfy -lodmh -knarujextpscbv - -uhmobwlgj -obhmwugl -hmabwuglo -oawblgumh -owlbughm - -ucsfwbizqdenro -npsrtkmeobfdg - -rvhcidqaysukjxbpgzoe -vauhokjrsybiqcdepzgx -cjibvqsxzoyrkeufphagd -cyzpukrhxdsebogajqvi - -zcojuprtbhg -pdwbauchjtsgkn -gprtulcfhjyba -xbecghvmjtpiu - -qclaiywnujprxdotf -fiuqtwlxocrnayjdp -wdfoacnjipyqtluxr -ejdyblqnihcftpwroavux -nqiayfgucrdjlwxopt - -xhzrepycnwsm -iaxfykeblwp - -eaqkisdgcojhzw -ckhbasd -ckdhpasb -hcpydabks -sckdha - -kn -nk -nuk \ No newline at end of file diff --git a/day06/parseGroupList.spec.ts b/day06/parseGroupList.spec.ts deleted file mode 100644 index 522d25f..0000000 --- a/day06/parseGroupList.spec.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { loadString } from '../lib/loader' -import { parseGroupList } from './parseGroupList' - -describe('parseGroupList', () => { - it('should parse a list of group answers', () => { - expect( - parseGroupList( - loadString(`abc - - a - b - c - - ab - ac - - a - a - a - a - - b`), - ), - ).toEqual([ - ['abc'], - ['a', 'b', 'c'], - ['ab', 'ac'], - ['a', 'a', 'a', 'a'], - ['b'], - ]) - }) -}) diff --git a/day06/parseGroupList.ts b/day06/parseGroupList.ts deleted file mode 100644 index ea25dc5..0000000 --- a/day06/parseGroupList.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Group the list of answers. A blank line denotes a new group. - */ -export const parseGroupList = (input: string[]): string[][] => - input.reduce( - (list, line) => { - if (line.length === 0) { - list.push([]) - return list - } - list[list.length - 1].push(line) - return list - }, - [[]] as string[][], - ) diff --git a/day06/solution.spec.ts b/day06/solution.spec.ts deleted file mode 100644 index df92591..0000000 --- a/day06/solution.spec.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { loader, loadString } from '../lib/loader' -import { collectAnswers } from './collectAnswers' -import { parseGroupList } from './parseGroupList' -import { sumAnswers } from './sumAnswers' -import { sumAnswersByAll } from './sumAnswersByAll' - -const load = loader(6) -const sample = `abc - -a -b -c - -ab -ac - -a -a -a -a - -b` -const input = load('input') - -describe('Day 6: Custom Customs', () => { - describe('Part 1', () => { - it('should solve the sample', () => { - expect( - sumAnswers( - parseGroupList(loadString(sample)) - .map(collectAnswers) - .map(({ answers }) => answers), - ), - ).toEqual(11) - }) - it('should solve', () => - expect( - sumAnswers( - parseGroupList(input) - .map(collectAnswers) - .map(({ answers }) => answers), - ), - ).toEqual(6735)) - }) - describe('Part 2', () => { - it('should solve the sample', () => { - expect( - sumAnswersByAll(parseGroupList(loadString(sample)).map(collectAnswers)), - ).toEqual(6) - }) - it('should solve', () => - expect( - sumAnswersByAll(parseGroupList(input).map(collectAnswers)), - ).toEqual(3221)) - }) -}) diff --git a/day06/sumAnswers.ts b/day06/sumAnswers.ts deleted file mode 100644 index cf2d091..0000000 --- a/day06/sumAnswers.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Answers } from './collectAnswers' - -/** - * Count the questions to which anyone answered "yes" - */ -export const sumAnswers = (answers: Answers[]): number => - answers - // collectAnswers counts how often answer was given - // in keys to the Answers record - .map(Object.keys) - // count how many entries the record has - .map((a) => a.length) - // sum it up - .reduce((total, i) => total + i, 0) diff --git a/day06/sumAnswersByAll.ts b/day06/sumAnswersByAll.ts deleted file mode 100644 index d661f94..0000000 --- a/day06/sumAnswersByAll.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Answers } from './collectAnswers' - -/** - * Count the questions to which everyone answered "yes" - */ -export const sumAnswersByAll = ( - answers: { - answers: Answers - n: number - }[], -): number => - answers.reduce( - (total, { answers, n }) => - // add the number of answers which have been given by all to the total - total + - Object.values(answers) - // filter out those answers which not have been given by everyone - .filter((v) => v === n).length, - 0, - ) diff --git a/day07/countBags.ts b/day07/countBags.ts deleted file mode 100644 index 5a70bd8..0000000 --- a/day07/countBags.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Bag, Bags } from './parseRules' - -const countChildren = (bags: Bags) => (bag: Bag): number => { - // Bag has no children, so no more bags are needed - if (bag.children === undefined) return 0 - - return Object.entries(bag.children).reduce( - (total, [color, count]) => - total + - // Count all the child bags - count + - // and add the amount of bags they contain multiplied by the number of bags - count * countChildren(bags)(bags[color]), - 0, - ) -} - -/** - * Count how many bags are need to transport the given bag - */ -export const countBags = (bags: Bags) => (color: string): number => - countChildren(bags)(bags[color]) diff --git a/day07/input.txt b/day07/input.txt deleted file mode 100644 index cf4a371..0000000 --- a/day07/input.txt +++ /dev/null @@ -1,594 +0,0 @@ -dotted blue bags contain 5 wavy green bags, 3 pale beige bags. -dull lime bags contain 1 dotted olive bag, 3 dim brown bags. -mirrored magenta bags contain 3 mirrored gray bags, 2 plaid beige bags, 4 dull brown bags, 3 pale plum bags. -posh coral bags contain 2 light blue bags, 2 dotted purple bags, 1 pale fuchsia bag, 2 light cyan bags. -bright orange bags contain 2 shiny chartreuse bags. -plaid salmon bags contain 1 faded coral bag, 4 clear lavender bags, 5 wavy tan bags. -wavy lavender bags contain 2 drab purple bags, 2 light brown bags, 2 wavy tomato bags, 1 mirrored plum bag. -clear indigo bags contain 4 dark magenta bags, 2 shiny brown bags. -posh salmon bags contain 4 dull tomato bags, 3 drab black bags, 5 mirrored chartreuse bags, 4 shiny blue bags. -mirrored coral bags contain 4 faded aqua bags, 2 plaid plum bags, 5 striped tan bags, 5 wavy tomato bags. -dotted purple bags contain 1 faded gold bag. -bright purple bags contain 2 muted indigo bags, 3 pale maroon bags, 4 dim coral bags, 2 dark blue bags. -drab olive bags contain 2 shiny coral bags. -dim orange bags contain 1 faded turquoise bag. -drab aqua bags contain 1 faded black bag, 4 clear lavender bags. -bright salmon bags contain 2 bright aqua bags. -dim brown bags contain 1 bright yellow bag, 3 faded cyan bags, 4 dotted chartreuse bags. -clear tan bags contain 2 posh tomato bags, 4 bright tan bags, 1 mirrored gray bag. -faded beige bags contain 2 mirrored olive bags, 5 dark chartreuse bags. -drab chartreuse bags contain 1 shiny white bag. -faded coral bags contain 4 dotted green bags, 2 dim violet bags, 3 striped magenta bags. -vibrant crimson bags contain 5 shiny gray bags, 2 muted black bags, 2 posh brown bags. -mirrored aqua bags contain 5 bright brown bags, 3 mirrored tomato bags, 3 bright bronze bags, 1 shiny magenta bag. -dotted salmon bags contain 2 muted tan bags, 4 light bronze bags. -vibrant salmon bags contain 5 dull yellow bags, 5 wavy tan bags, 3 light fuchsia bags, 1 drab tan bag. -vibrant olive bags contain 2 pale white bags, 2 dull coral bags, 1 mirrored magenta bag, 2 clear crimson bags. -shiny plum bags contain 3 dotted chartreuse bags, 1 striped tomato bag, 4 clear indigo bags. -pale fuchsia bags contain 1 mirrored indigo bag, 2 plaid aqua bags, 1 striped teal bag, 4 drab salmon bags. -wavy beige bags contain 1 mirrored coral bag, 1 bright plum bag, 2 dark lavender bags. -drab silver bags contain 5 vibrant gold bags, 5 pale gray bags. -light salmon bags contain 2 drab chartreuse bags, 3 faded gray bags, 3 pale gray bags, 1 clear olive bag. -faded red bags contain 5 dull chartreuse bags, 2 plaid aqua bags. -clear maroon bags contain 2 muted lavender bags. -dull green bags contain 3 pale olive bags, 5 vibrant gold bags, 2 clear teal bags, 5 dotted plum bags. -striped white bags contain 1 dim cyan bag. -pale coral bags contain 5 dim purple bags, 3 faded silver bags, 3 dim blue bags, 3 dotted brown bags. -drab green bags contain 5 pale teal bags. -posh tomato bags contain 4 drab fuchsia bags, 5 dark brown bags. -shiny chartreuse bags contain 5 dim maroon bags, 5 dull indigo bags, 5 pale purple bags, 3 vibrant gold bags. -dark plum bags contain 4 muted tan bags. -faded green bags contain 4 drab lavender bags. -pale tomato bags contain 3 bright maroon bags, 4 pale turquoise bags, 4 dark gold bags, 3 dull indigo bags. -striped aqua bags contain 1 dull gray bag, 5 dim blue bags, 5 wavy cyan bags. -dotted lavender bags contain 4 pale plum bags, 2 bright coral bags. -light gold bags contain 3 light tan bags, 4 clear indigo bags, 3 shiny tan bags. -striped maroon bags contain 5 drab tan bags, 1 pale black bag. -plaid black bags contain 3 dull fuchsia bags. -dim beige bags contain 1 dim teal bag, 1 muted salmon bag. -mirrored teal bags contain 2 bright coral bags, 4 dotted brown bags, 5 vibrant white bags, 3 clear magenta bags. -faded gold bags contain no other bags. -faded yellow bags contain 1 faded brown bag, 3 clear tomato bags. -bright violet bags contain 1 faded lime bag, 5 dark chartreuse bags, 1 shiny black bag, 3 vibrant yellow bags. -shiny fuchsia bags contain 2 dotted plum bags. -dim aqua bags contain 1 dim cyan bag. -dotted fuchsia bags contain 5 muted blue bags, 1 pale brown bag, 2 shiny salmon bags. -dim fuchsia bags contain 3 muted tomato bags, 2 striped lime bags, 2 clear white bags, 2 striped blue bags. -faded teal bags contain 1 wavy gold bag, 1 clear coral bag, 3 pale crimson bags. -dull plum bags contain 1 bright tan bag, 5 light violet bags, 5 shiny black bags. -light cyan bags contain 1 mirrored turquoise bag, 1 dim gray bag, 5 faded white bags. -vibrant cyan bags contain 1 dotted gold bag, 1 mirrored indigo bag. -bright coral bags contain 1 pale lavender bag, 3 mirrored olive bags, 3 muted tan bags. -dim chartreuse bags contain 3 pale white bags, 5 faded white bags, 3 mirrored magenta bags, 5 faded black bags. -pale green bags contain 3 faded white bags, 5 dotted lavender bags. -wavy gray bags contain 3 wavy tomato bags, 4 dull gray bags, 4 shiny teal bags, 5 pale beige bags. -dotted cyan bags contain 4 bright white bags. -shiny olive bags contain 2 wavy chartreuse bags, 5 dim chartreuse bags, 4 pale gold bags, 1 posh crimson bag. -drab maroon bags contain 3 clear olive bags, 4 dotted blue bags, 4 dim magenta bags. -striped purple bags contain 4 wavy beige bags, 1 pale orange bag, 1 pale brown bag. -dull olive bags contain 2 vibrant yellow bags. -faded tomato bags contain 4 light turquoise bags. -dotted maroon bags contain 2 faded cyan bags, 3 muted tomato bags, 1 shiny aqua bag, 3 bright orange bags. -wavy turquoise bags contain 1 drab magenta bag. -plaid green bags contain 1 light blue bag, 1 mirrored silver bag, 5 striped gold bags. -drab indigo bags contain 5 dull aqua bags. -plaid crimson bags contain 1 posh yellow bag, 5 shiny cyan bags. -drab salmon bags contain 3 bright lavender bags, 4 bright violet bags, 1 mirrored brown bag, 4 shiny gold bags. -dim turquoise bags contain 5 wavy brown bags, 4 mirrored yellow bags. -pale bronze bags contain 2 dotted bronze bags, 5 dim purple bags, 1 plaid red bag. -striped blue bags contain 5 drab fuchsia bags. -wavy aqua bags contain 5 posh plum bags, 1 striped bronze bag, 4 dark magenta bags. -posh beige bags contain 1 faded lime bag, 3 wavy white bags, 2 mirrored gray bags. -plaid magenta bags contain 4 light olive bags, 3 faded salmon bags. -plaid gray bags contain 1 light indigo bag, 5 muted indigo bags. -mirrored white bags contain 3 muted gray bags, 4 dotted beige bags, 5 dotted salmon bags, 5 muted gold bags. -dull chartreuse bags contain 3 muted gray bags. -faded cyan bags contain 4 light violet bags, 4 faded lime bags, 2 bright silver bags, 3 pale olive bags. -mirrored red bags contain 1 dotted violet bag, 5 bright plum bags, 2 pale violet bags, 4 pale plum bags. -shiny purple bags contain 2 pale magenta bags, 2 shiny fuchsia bags. -vibrant plum bags contain 5 light bronze bags, 3 plaid lavender bags, 1 shiny coral bag, 2 vibrant yellow bags. -shiny lime bags contain 1 posh black bag. -mirrored salmon bags contain 5 dull magenta bags, 2 clear gray bags, 1 dim indigo bag, 4 light brown bags. -dotted violet bags contain 2 pale violet bags. -muted orange bags contain 5 dark coral bags, 3 mirrored tomato bags, 1 dotted green bag. -bright lime bags contain 3 shiny gold bags, 4 plaid lavender bags, 3 dull gold bags. -pale lavender bags contain no other bags. -clear aqua bags contain 2 plaid turquoise bags. -clear white bags contain 4 shiny coral bags, 5 striped gold bags, 2 mirrored magenta bags. -clear chartreuse bags contain 1 posh lime bag. -wavy silver bags contain 3 clear orange bags, 2 clear lavender bags. -posh cyan bags contain 1 shiny crimson bag. -light plum bags contain 1 plaid lavender bag. -dim lime bags contain 5 bright crimson bags, 3 dark green bags, 2 vibrant green bags, 3 pale maroon bags. -dim coral bags contain 4 muted crimson bags, 1 mirrored plum bag. -pale salmon bags contain 5 wavy orange bags, 4 dotted gold bags, 4 posh brown bags. -faded chartreuse bags contain 1 dotted chartreuse bag, 3 wavy orange bags. -faded olive bags contain 5 pale blue bags, 3 dim yellow bags, 1 dotted gray bag, 2 dim crimson bags. -clear lime bags contain 3 dull fuchsia bags, 4 wavy red bags. -bright blue bags contain 3 mirrored violet bags, 3 pale gold bags, 4 drab salmon bags, 5 dull silver bags. -muted maroon bags contain 5 dull salmon bags, 3 dim gray bags. -clear teal bags contain 2 muted tomato bags, 4 faded turquoise bags. -shiny white bags contain 1 posh red bag, 3 dotted red bags. -light magenta bags contain 4 drab olive bags. -vibrant coral bags contain 5 pale lavender bags, 5 plaid red bags. -wavy yellow bags contain 3 vibrant beige bags, 4 muted crimson bags, 4 bright white bags, 1 pale maroon bag. -bright black bags contain 2 striped maroon bags. -plaid lavender bags contain 1 drab turquoise bag. -light crimson bags contain 2 wavy chartreuse bags. -muted salmon bags contain 2 bright orange bags, 3 dotted plum bags, 3 light magenta bags. -striped teal bags contain 4 dark chartreuse bags, 1 dim maroon bag. -dull bronze bags contain no other bags. -dotted bronze bags contain 1 striped orange bag, 5 shiny cyan bags, 2 muted tan bags. -dark gold bags contain 3 pale plum bags, 3 mirrored olive bags. -mirrored lime bags contain 3 dim maroon bags, 3 light violet bags, 2 mirrored turquoise bags, 3 vibrant yellow bags. -clear violet bags contain 2 drab salmon bags, 4 pale gray bags, 4 striped tan bags, 5 mirrored blue bags. -plaid beige bags contain 3 dull gold bags. -shiny salmon bags contain 3 dark chartreuse bags, 4 bright yellow bags, 5 dark gold bags, 2 muted tomato bags. -dull brown bags contain 1 bright silver bag, 4 muted tan bags. -dull orange bags contain 1 dim bronze bag. -vibrant lavender bags contain 4 dotted violet bags, 3 striped lime bags. -light blue bags contain 2 shiny teal bags, 5 striped orange bags, 5 shiny gray bags. -plaid teal bags contain 4 dark turquoise bags, 4 posh indigo bags, 1 mirrored tan bag. -drab black bags contain 4 vibrant chartreuse bags, 4 dim turquoise bags. -light beige bags contain 3 pale aqua bags. -mirrored gray bags contain 5 dark chartreuse bags. -faded black bags contain 4 shiny salmon bags. -light yellow bags contain 1 dotted magenta bag. -bright red bags contain 5 bright bronze bags, 3 dull white bags, 3 dim plum bags, 3 light tan bags. -mirrored lavender bags contain 5 faded chartreuse bags. -shiny coral bags contain 3 plaid chartreuse bags, 1 pale lavender bag. -clear bronze bags contain 4 mirrored silver bags, 1 dim coral bag, 3 posh teal bags. -dotted yellow bags contain 1 bright crimson bag, 5 dotted olive bags. -light bronze bags contain 4 dim maroon bags, 3 shiny crimson bags. -wavy tomato bags contain 5 dull red bags, 3 wavy cyan bags, 4 dark gold bags. -dotted turquoise bags contain 5 muted silver bags. -posh orange bags contain 2 bright beige bags, 5 vibrant chartreuse bags, 3 drab green bags. -wavy bronze bags contain 1 dark coral bag. -plaid tan bags contain 1 vibrant bronze bag. -wavy red bags contain 4 dotted gray bags, 2 pale purple bags, 1 bright tan bag. -dull turquoise bags contain 4 dull crimson bags. -faded brown bags contain 5 muted teal bags. -dark violet bags contain 1 dim gold bag, 1 dim beige bag, 5 dull orange bags. -bright brown bags contain 1 plaid aqua bag, 4 light cyan bags. -dull teal bags contain 4 shiny teal bags. -dotted white bags contain 3 pale black bags, 2 drab black bags, 5 faded fuchsia bags, 1 plaid black bag. -dark magenta bags contain 5 shiny teal bags, 4 pale purple bags. -mirrored maroon bags contain 3 plaid chartreuse bags, 2 muted orange bags, 5 pale gray bags, 4 drab green bags. -faded magenta bags contain 1 bright green bag, 5 pale lavender bags, 4 posh fuchsia bags, 2 pale teal bags. -wavy violet bags contain 4 bright indigo bags. -posh gold bags contain 1 bright green bag, 3 dim cyan bags. -muted silver bags contain 3 light lime bags, 4 wavy indigo bags, 5 striped turquoise bags, 5 clear blue bags. -muted fuchsia bags contain 2 pale olive bags, 1 light maroon bag, 3 plaid blue bags, 1 light blue bag. -posh turquoise bags contain 3 light lime bags, 4 wavy tomato bags, 3 vibrant blue bags, 3 posh fuchsia bags. -dull purple bags contain 1 striped tan bag, 2 vibrant tomato bags, 2 dim brown bags, 2 shiny fuchsia bags. -light fuchsia bags contain 2 mirrored turquoise bags, 4 striped lime bags, 4 faded white bags. -dull gold bags contain 5 plaid tan bags, 2 light bronze bags, 1 striped tan bag. -wavy olive bags contain 4 vibrant maroon bags, 1 drab salmon bag. -pale beige bags contain 1 wavy white bag, 1 dotted orange bag, 4 dim gray bags. -clear crimson bags contain 4 dull blue bags. -dotted tomato bags contain 5 dotted olive bags. -drab purple bags contain 1 striped tan bag, 3 mirrored olive bags, 4 mirrored turquoise bags. -plaid red bags contain 2 bright cyan bags, 5 pale lavender bags, 3 dark chartreuse bags, 1 dotted plum bag. -posh silver bags contain 5 light olive bags, 5 bright white bags, 5 light violet bags, 4 faded orange bags. -muted teal bags contain 2 wavy violet bags. -light red bags contain 2 dull white bags, 4 drab fuchsia bags. -bright crimson bags contain 4 light lavender bags, 2 dotted plum bags. -plaid purple bags contain 5 dull magenta bags, 5 light lavender bags. -dark gray bags contain 4 dull plum bags, 5 muted tomato bags, 3 drab brown bags. -vibrant gray bags contain 4 posh black bags. -plaid fuchsia bags contain 1 posh lime bag. -striped chartreuse bags contain 4 posh teal bags, 1 bright purple bag, 1 clear white bag. -dull fuchsia bags contain 3 bright brown bags, 3 striped olive bags, 2 faded white bags. -muted beige bags contain 4 drab chartreuse bags. -vibrant beige bags contain 4 striped crimson bags. -vibrant indigo bags contain 5 dull plum bags, 1 dull maroon bag, 2 striped white bags. -dull silver bags contain 5 dull white bags, 2 dull gold bags, 4 shiny cyan bags, 4 wavy gold bags. -dim blue bags contain 5 posh yellow bags, 5 dim maroon bags. -posh white bags contain 4 dim teal bags, 4 light brown bags. -mirrored tomato bags contain 1 posh purple bag, 3 striped aqua bags. -light black bags contain 1 mirrored chartreuse bag, 3 muted yellow bags, 4 muted tan bags. -plaid silver bags contain 2 dull beige bags, 5 bright tan bags, 5 posh tomato bags. -shiny violet bags contain 1 plaid beige bag, 3 faded teal bags, 4 dotted tomato bags, 1 shiny orange bag. -dull black bags contain 5 vibrant coral bags, 2 clear orange bags. -dim white bags contain 5 drab brown bags, 2 plaid lavender bags. -wavy salmon bags contain 5 dull white bags, 5 vibrant crimson bags, 2 posh silver bags, 1 dim purple bag. -dark green bags contain 1 dull magenta bag, 3 light tomato bags, 1 pale olive bag, 5 pale brown bags. -light chartreuse bags contain 1 dotted silver bag, 3 bright maroon bags, 4 vibrant silver bags, 5 bright coral bags. -dim green bags contain 3 wavy bronze bags, 3 bright tan bags, 1 dotted magenta bag. -shiny tan bags contain 3 striped turquoise bags, 4 drab brown bags, 2 wavy tan bags, 3 light fuchsia bags. -muted lime bags contain 4 dark yellow bags, 5 vibrant blue bags. -dark coral bags contain 5 plaid chartreuse bags. -striped fuchsia bags contain 4 light lavender bags, 4 dull gray bags, 5 wavy cyan bags, 2 striped orange bags. -shiny maroon bags contain 3 striped olive bags, 5 dull green bags, 4 shiny cyan bags. -dotted red bags contain 5 light violet bags, 4 plaid chartreuse bags. -dim salmon bags contain 1 dim blue bag, 3 dotted indigo bags, 4 pale crimson bags, 3 drab blue bags. -pale magenta bags contain 5 pale violet bags, 1 dark blue bag. -clear coral bags contain 2 faded turquoise bags, 2 shiny cyan bags, 4 dull red bags. -dim black bags contain 4 dim aqua bags, 5 pale blue bags. -clear cyan bags contain 2 light violet bags, 5 drab salmon bags, 4 dark teal bags. -dull gray bags contain 2 bright lavender bags, 3 pale plum bags, 5 dull plum bags. -dull salmon bags contain 4 posh violet bags, 3 mirrored indigo bags, 3 plaid tomato bags. -pale cyan bags contain 2 pale chartreuse bags, 4 light brown bags, 1 plaid beige bag, 3 light maroon bags. -faded indigo bags contain 3 dim maroon bags, 3 mirrored violet bags. -wavy orange bags contain 3 plaid purple bags. -dim plum bags contain 2 wavy tomato bags. -pale turquoise bags contain 2 faded lime bags. -drab orange bags contain 2 mirrored turquoise bags, 5 plaid tomato bags, 3 dotted blue bags, 5 wavy red bags. -mirrored cyan bags contain 5 muted chartreuse bags, 4 dim cyan bags, 5 posh fuchsia bags. -vibrant purple bags contain 5 dotted turquoise bags. -posh red bags contain 4 faded turquoise bags, 2 light violet bags. -muted crimson bags contain 5 shiny fuchsia bags. -drab magenta bags contain 1 dull fuchsia bag. -wavy tan bags contain 1 mirrored plum bag. -vibrant tomato bags contain 3 plaid blue bags, 3 clear fuchsia bags, 5 dark yellow bags. -mirrored gold bags contain 3 muted purple bags, 5 dark indigo bags, 5 dotted brown bags, 1 mirrored olive bag. -mirrored plum bags contain 3 faded turquoise bags. -muted gray bags contain 4 light bronze bags. -light olive bags contain 3 bright lavender bags, 4 wavy orange bags, 3 clear lavender bags. -faded tan bags contain 4 vibrant red bags, 1 drab bronze bag, 5 mirrored plum bags. -posh plum bags contain 4 dotted gold bags, 4 dotted plum bags, 2 vibrant gold bags. -faded maroon bags contain 5 dim red bags. -drab teal bags contain 5 faded chartreuse bags, 2 faded silver bags. -clear black bags contain 2 pale red bags, 3 plaid black bags. -mirrored indigo bags contain 3 dim chartreuse bags, 1 wavy violet bag, 1 dull green bag. -pale teal bags contain 4 wavy indigo bags. -drab cyan bags contain 4 dotted plum bags, 5 dim red bags. -striped salmon bags contain 4 clear olive bags, 4 wavy orange bags. -faded bronze bags contain 5 mirrored olive bags, 2 dark green bags. -muted magenta bags contain 2 mirrored beige bags, 1 wavy orange bag, 3 light salmon bags. -wavy plum bags contain 5 light cyan bags, 2 drab turquoise bags. -dark lavender bags contain 2 dim coral bags. -faded lavender bags contain 4 wavy bronze bags, 3 dim yellow bags. -dark maroon bags contain 5 striped orange bags. -clear fuchsia bags contain 1 dull brown bag, 4 posh red bags, 3 plaid purple bags. -shiny magenta bags contain 2 striped maroon bags, 5 mirrored olive bags, 2 drab lime bags. -wavy coral bags contain 4 posh maroon bags, 5 dim white bags, 5 pale indigo bags, 5 dotted maroon bags. -dark silver bags contain 3 posh plum bags. -shiny blue bags contain 1 wavy indigo bag, 4 dark magenta bags, 4 light turquoise bags. -clear lavender bags contain 1 bright violet bag, 4 wavy cyan bags, 2 dim blue bags, 5 posh violet bags. -shiny orange bags contain 2 pale tomato bags, 1 pale teal bag. -mirrored beige bags contain 5 dotted gold bags, 1 faded violet bag, 4 striped gray bags. -bright cyan bags contain 4 muted tomato bags, 1 drab turquoise bag, 4 bright yellow bags. -vibrant fuchsia bags contain 4 striped tan bags, 1 dark black bag, 4 plaid olive bags, 2 wavy aqua bags. -pale olive bags contain 4 posh yellow bags, 4 pale plum bags. -dotted crimson bags contain 3 dim gray bags, 1 mirrored lime bag. -vibrant orange bags contain 5 striped orange bags, 3 plaid blue bags. -light brown bags contain 4 dotted chartreuse bags. -muted plum bags contain 1 muted indigo bag, 5 plaid yellow bags, 1 vibrant silver bag, 1 drab turquoise bag. -dotted chartreuse bags contain 5 dotted red bags, 5 light lavender bags, 4 pale black bags, 3 muted tomato bags. -bright chartreuse bags contain 5 dim salmon bags, 5 shiny salmon bags, 4 bright plum bags, 2 dark lavender bags. -dim gray bags contain 3 dull indigo bags. -faded fuchsia bags contain 2 muted blue bags, 1 mirrored blue bag, 2 dotted green bags, 5 mirrored olive bags. -striped tomato bags contain 4 dull gray bags, 1 vibrant plum bag, 3 mirrored coral bags. -clear turquoise bags contain 4 light orange bags, 3 faded black bags, 5 mirrored lavender bags, 5 posh white bags. -dotted gray bags contain 4 mirrored turquoise bags, 5 light lavender bags, 1 vibrant yellow bag, 4 dull bronze bags. -shiny beige bags contain 3 plaid silver bags, 2 faded chartreuse bags, 2 vibrant lavender bags, 2 wavy olive bags. -pale red bags contain 4 mirrored olive bags. -mirrored silver bags contain 2 vibrant maroon bags, 5 plaid chartreuse bags, 4 vibrant plum bags, 5 faded white bags. -plaid aqua bags contain 5 faded aqua bags, 4 dotted fuchsia bags. -dull yellow bags contain 5 bright turquoise bags, 3 posh plum bags, 1 pale white bag. -faded orange bags contain 3 dotted bronze bags, 1 mirrored tan bag. -wavy green bags contain 1 wavy turquoise bag. -posh tan bags contain 5 striped lavender bags, 4 posh tomato bags. -wavy crimson bags contain 4 pale lavender bags, 2 mirrored tan bags, 5 plaid beige bags. -striped yellow bags contain 3 shiny green bags, 5 dark gold bags, 4 drab teal bags, 3 drab olive bags. -pale plum bags contain 2 dull indigo bags, 1 dotted plum bag, 1 bright yellow bag. -pale yellow bags contain 2 bright green bags, 5 dull beige bags, 3 light coral bags, 3 dull red bags. -striped silver bags contain 1 clear crimson bag, 4 shiny salmon bags. -bright silver bags contain 2 shiny black bags, 3 faded gold bags, 5 bright yellow bags. -shiny red bags contain 1 pale turquoise bag, 5 shiny beige bags. -posh chartreuse bags contain 5 dotted maroon bags, 5 shiny bronze bags, 1 shiny cyan bag, 3 pale aqua bags. -wavy teal bags contain 4 mirrored plum bags, 4 drab silver bags, 3 pale green bags, 1 mirrored lime bag. -posh olive bags contain 2 dim salmon bags, 1 faded black bag, 1 light lime bag. -dark fuchsia bags contain 3 mirrored indigo bags. -dark cyan bags contain 4 muted indigo bags, 4 shiny crimson bags, 2 drab turquoise bags. -posh magenta bags contain 5 bright blue bags, 1 dull turquoise bag. -muted red bags contain 3 light violet bags, 2 dark cyan bags. -vibrant gold bags contain 2 dotted chartreuse bags, 5 pale brown bags, 1 mirrored brown bag, 5 plaid lavender bags. -muted purple bags contain 3 dim blue bags, 3 wavy red bags, 1 clear lavender bag. -dim magenta bags contain 5 muted tan bags, 4 striped olive bags, 5 vibrant gold bags. -faded plum bags contain 1 faded black bag, 1 muted green bag. -light violet bags contain 3 mirrored turquoise bags, 1 dull bronze bag. -faded salmon bags contain 1 pale salmon bag, 1 light teal bag. -posh black bags contain 2 wavy purple bags. -plaid white bags contain 1 shiny salmon bag, 3 posh purple bags. -mirrored green bags contain 3 bright tan bags, 1 plaid white bag, 3 mirrored plum bags. -dark red bags contain 2 bright purple bags, 2 muted white bags, 5 drab cyan bags, 5 plaid olive bags. -vibrant teal bags contain 5 striped olive bags, 1 pale olive bag. -dotted green bags contain 3 dark cyan bags. -dark indigo bags contain 3 bright brown bags, 3 drab white bags, 2 muted purple bags, 2 plaid silver bags. -drab tan bags contain 3 dotted gray bags, 2 faded black bags, 1 dull brown bag, 2 drab salmon bags. -vibrant chartreuse bags contain 5 pale brown bags. -mirrored olive bags contain 2 dim blue bags, 2 shiny gold bags, 4 light lavender bags. -light silver bags contain 3 drab orange bags, 5 light plum bags, 2 dotted olive bags. -light indigo bags contain 4 pale yellow bags, 1 vibrant violet bag, 4 dull cyan bags, 5 dotted tomato bags. -pale orange bags contain 4 pale silver bags, 4 vibrant tomato bags. -vibrant bronze bags contain 5 dark yellow bags. -dull beige bags contain 4 dotted gray bags, 4 pale lavender bags, 5 light lavender bags, 3 shiny coral bags. -bright gray bags contain 3 bright silver bags. -vibrant green bags contain 4 muted tan bags, 3 light lavender bags, 5 light magenta bags. -plaid violet bags contain 4 bright lime bags, 2 mirrored olive bags, 4 faded blue bags. -striped bronze bags contain 1 plaid chartreuse bag. -dim crimson bags contain 3 bright yellow bags, 1 dull gray bag. -posh purple bags contain 3 light fuchsia bags, 5 pale black bags, 5 wavy orange bags, 3 drab blue bags. -clear beige bags contain 4 plaid black bags. -striped gray bags contain 2 pale green bags, 4 light fuchsia bags. -plaid olive bags contain 2 mirrored gray bags. -muted green bags contain 1 plaid coral bag. -clear salmon bags contain 4 muted black bags, 1 bright white bag, 1 drab tomato bag, 2 shiny orange bags. -dark aqua bags contain 5 light bronze bags, 1 wavy turquoise bag. -drab tomato bags contain 5 dim chartreuse bags. -wavy magenta bags contain 3 posh brown bags. -dull crimson bags contain 1 mirrored tan bag, 4 dotted crimson bags, 5 vibrant indigo bags. -plaid turquoise bags contain 1 dark bronze bag, 4 bright maroon bags. -dim cyan bags contain 4 plaid red bags, 4 bright silver bags, 5 vibrant gold bags. -faded blue bags contain 3 plaid salmon bags, 3 clear cyan bags, 1 wavy aqua bag, 4 mirrored teal bags. -light orange bags contain 4 posh chartreuse bags, 3 shiny maroon bags, 4 dim teal bags, 4 drab chartreuse bags. -bright white bags contain 5 drab chartreuse bags. -clear red bags contain 1 dull magenta bag, 1 light cyan bag. -drab gold bags contain 4 plaid violet bags, 5 muted gold bags. -muted chartreuse bags contain 1 plaid crimson bag, 4 vibrant red bags, 1 drab turquoise bag, 5 posh black bags. -mirrored black bags contain 1 dim white bag, 1 clear gold bag. -bright indigo bags contain 1 vibrant gold bag, 2 pale purple bags. -muted indigo bags contain 2 dull plum bags. -striped tan bags contain 2 dotted chartreuse bags. -dim tan bags contain 2 dim red bags, 4 light violet bags, 1 clear beige bag. -muted tomato bags contain 1 faded gold bag, 2 bright yellow bags, 3 dotted plum bags. -vibrant turquoise bags contain 2 light tan bags, 4 wavy salmon bags, 1 dark tan bag, 1 dull tan bag. -dotted magenta bags contain 4 plaid blue bags, 1 plaid turquoise bag, 5 striped silver bags. -dark orange bags contain 3 faded bronze bags. -light tomato bags contain 2 dull bronze bags, 1 pale brown bag, 4 bright violet bags. -dim teal bags contain 5 dull brown bags. -muted lavender bags contain 4 dark yellow bags, 4 shiny teal bags, 2 faded aqua bags, 5 wavy cyan bags. -bright beige bags contain 3 muted black bags, 4 bright blue bags. -light purple bags contain 1 pale lavender bag, 2 shiny aqua bags. -plaid blue bags contain 4 dull beige bags, 3 dull brown bags, 3 dotted crimson bags. -striped lavender bags contain 3 dotted chartreuse bags. -bright tomato bags contain 1 posh violet bag, 3 shiny aqua bags. -wavy indigo bags contain 4 mirrored olive bags, 1 faded turquoise bag, 1 vibrant coral bag, 4 bright gray bags. -pale black bags contain 5 bright silver bags, 3 mirrored turquoise bags. -mirrored turquoise bags contain no other bags. -bright plum bags contain 2 faded turquoise bags. -shiny yellow bags contain 1 clear gold bag. -plaid bronze bags contain 1 dotted teal bag, 3 faded white bags, 2 shiny green bags. -striped beige bags contain 3 vibrant teal bags. -wavy cyan bags contain 5 posh yellow bags. -light tan bags contain 2 vibrant red bags. -pale brown bags contain 2 bright yellow bags, 4 pale lavender bags, 5 mirrored turquoise bags, 1 drab turquoise bag. -bright teal bags contain 3 dark green bags, 2 dull white bags. -drab yellow bags contain 5 dotted purple bags. -shiny cyan bags contain 4 vibrant yellow bags. -vibrant silver bags contain 5 mirrored yellow bags, 5 dull indigo bags, 3 faded cyan bags, 4 faded turquoise bags. -clear plum bags contain 4 pale lavender bags. -posh teal bags contain 2 muted tan bags. -striped crimson bags contain 1 dull plum bag, 2 shiny fuchsia bags, 4 dim maroon bags, 3 bright yellow bags. -dull lavender bags contain 2 clear fuchsia bags, 5 pale silver bags, 5 dim salmon bags, 4 muted salmon bags. -posh indigo bags contain 5 faded chartreuse bags, 5 dark green bags, 5 dark blue bags. -wavy blue bags contain 5 muted yellow bags. -dull magenta bags contain 5 pale brown bags. -mirrored bronze bags contain 3 posh turquoise bags. -posh aqua bags contain 1 dim white bag, 2 clear tomato bags, 2 pale maroon bags. -pale purple bags contain 2 dotted fuchsia bags. -mirrored chartreuse bags contain 5 plaid yellow bags, 5 posh tan bags, 4 vibrant silver bags, 3 drab green bags. -dotted black bags contain 5 muted aqua bags, 1 wavy lime bag, 2 bright lime bags. -plaid chartreuse bags contain 2 bright yellow bags, 2 faded gold bags, 1 pale lavender bag. -dotted plum bags contain 4 dull bronze bags, 4 dim blue bags. -clear gold bags contain 2 bright tan bags, 5 wavy teal bags. -dark crimson bags contain 4 bright teal bags, 2 wavy gray bags, 1 bright chartreuse bag. -faded gray bags contain 2 mirrored magenta bags. -dim gold bags contain 3 drab white bags. -clear green bags contain 2 pale beige bags. -dotted gold bags contain 3 dull indigo bags. -striped lime bags contain 2 dotted chartreuse bags. -clear brown bags contain 4 dark olive bags, 2 striped yellow bags, 4 dotted red bags, 5 dotted plum bags. -striped gold bags contain 1 wavy white bag, 3 posh tomato bags, 4 light magenta bags. -muted brown bags contain 1 clear gold bag. -plaid tomato bags contain 4 plaid plum bags, 2 pale chartreuse bags. -dark salmon bags contain 5 pale plum bags, 3 striped lime bags, 4 dotted gray bags. -drab brown bags contain 1 wavy orange bag, 4 dark cyan bags, 1 drab white bag. -pale gray bags contain 3 bright crimson bags, 1 bright yellow bag. -plaid maroon bags contain 1 pale coral bag. -dim violet bags contain 5 wavy blue bags, 4 shiny coral bags, 4 pale black bags, 3 posh yellow bags. -faded white bags contain 2 pale plum bags. -mirrored orange bags contain 3 striped maroon bags, 1 dull bronze bag, 2 pale aqua bags. -wavy black bags contain 1 faded violet bag, 1 plaid purple bag, 5 dim coral bags, 2 mirrored plum bags. -dim silver bags contain 2 muted brown bags, 1 posh plum bag. -dark tomato bags contain 5 dull magenta bags, 2 faded aqua bags, 3 vibrant lime bags, 3 drab silver bags. -dotted silver bags contain 2 dotted red bags. -muted yellow bags contain 4 drab purple bags, 3 striped olive bags. -shiny lavender bags contain 5 plaid purple bags, 2 vibrant crimson bags, 4 dull olive bags. -clear tomato bags contain 4 shiny bronze bags. -dark turquoise bags contain 5 dim brown bags. -drab coral bags contain 3 dull orange bags. -dotted beige bags contain 1 wavy lavender bag, 5 dull orange bags, 4 dull lime bags, 3 dull blue bags. -dark teal bags contain 3 muted indigo bags, 5 dark gold bags, 3 dull green bags, 2 plaid tan bags. -light lavender bags contain 2 dim maroon bags, 4 muted tomato bags, 4 dull plum bags. -dim lavender bags contain 4 light magenta bags, 4 shiny fuchsia bags, 5 wavy chartreuse bags, 1 faded chartreuse bag. -vibrant brown bags contain 4 dull bronze bags, 1 clear green bag, 3 posh orange bags, 3 mirrored silver bags. -pale tan bags contain 3 bright tomato bags, 5 pale maroon bags, 3 wavy teal bags. -muted black bags contain 1 light lime bag. -posh lime bags contain 3 bright crimson bags, 4 posh beige bags, 1 bright cyan bag. -light aqua bags contain 4 posh olive bags, 4 light tan bags, 4 wavy tan bags, 2 dotted blue bags. -dotted tan bags contain 3 dark yellow bags, 4 posh silver bags, 3 dark beige bags. -shiny black bags contain no other bags. -mirrored fuchsia bags contain 1 bright purple bag, 3 posh lime bags, 5 dim black bags. -dim purple bags contain 3 muted indigo bags. -wavy white bags contain 2 pale olive bags. -bright magenta bags contain 5 dull aqua bags, 3 dull green bags, 2 shiny turquoise bags. -drab white bags contain 1 plaid yellow bag, 2 shiny green bags, 5 posh beige bags, 5 plaid tan bags. -mirrored crimson bags contain 2 shiny teal bags. -pale white bags contain 2 muted indigo bags. -shiny bronze bags contain 5 mirrored crimson bags, 3 pale brown bags, 4 clear chartreuse bags. -clear blue bags contain 1 drab chartreuse bag, 4 striped turquoise bags, 1 plaid aqua bag, 5 pale aqua bags. -shiny brown bags contain 1 dotted bronze bag, 4 shiny fuchsia bags, 4 drab fuchsia bags, 4 dark lavender bags. -dotted teal bags contain 4 dull olive bags, 4 clear black bags. -posh gray bags contain 1 wavy salmon bag. -dark white bags contain 4 pale lime bags, 4 plaid beige bags, 5 dull fuchsia bags, 1 pale yellow bag. -dull cyan bags contain 4 muted lavender bags, 2 plaid tan bags, 2 dim blue bags. -dark olive bags contain 2 dim indigo bags, 1 dark brown bag, 5 dark yellow bags, 4 dull gray bags. -vibrant tan bags contain 4 bright tan bags, 1 pale tomato bag. -drab beige bags contain 4 muted magenta bags, 2 bright plum bags, 3 pale beige bags. -clear magenta bags contain 2 dull indigo bags, 5 vibrant green bags. -posh yellow bags contain no other bags. -vibrant magenta bags contain 2 dark green bags. -posh blue bags contain 2 muted chartreuse bags, 3 vibrant coral bags. -striped violet bags contain 1 dotted orange bag, 5 striped red bags, 5 dull lime bags. -dark yellow bags contain 2 shiny turquoise bags. -bright turquoise bags contain 2 bright yellow bags, 2 posh violet bags, 4 bright plum bags. -pale silver bags contain 4 vibrant bronze bags, 4 faded purple bags, 1 shiny green bag, 1 plaid lavender bag. -muted white bags contain 3 mirrored olive bags. -light green bags contain 5 shiny plum bags, 4 pale lavender bags, 5 faded gold bags. -drab lime bags contain 2 plaid beige bags. -pale chartreuse bags contain 4 dotted brown bags, 1 dark black bag, 3 mirrored plum bags, 1 faded black bag. -mirrored violet bags contain 5 plaid beige bags. -vibrant white bags contain 5 muted tomato bags. -faded violet bags contain 1 dull brown bag, 1 mirrored brown bag. -drab bronze bags contain 3 dim indigo bags, 1 dim magenta bag, 1 bright gray bag. -posh lavender bags contain 1 wavy black bag, 2 wavy magenta bags. -vibrant aqua bags contain 2 light lavender bags, 1 faded crimson bag, 4 dark green bags, 3 mirrored white bags. -bright green bags contain 1 dark gray bag. -shiny turquoise bags contain 2 bright yellow bags. -pale aqua bags contain 3 shiny gold bags, 2 drab silver bags, 3 drab salmon bags. -faded silver bags contain 3 striped teal bags, 5 mirrored indigo bags. -shiny indigo bags contain 3 wavy olive bags, 3 dim blue bags, 2 faded gold bags, 4 clear fuchsia bags. -vibrant yellow bags contain 5 dark chartreuse bags, 3 dull indigo bags, 1 bright tan bag. -shiny aqua bags contain 3 striped olive bags, 2 shiny teal bags, 5 pale teal bags. -bright maroon bags contain 2 striped lime bags. -dark purple bags contain 5 dotted brown bags, 1 bright olive bag, 3 drab orange bags, 1 mirrored olive bag. -drab lavender bags contain 5 wavy beige bags, 4 bright gold bags, 3 wavy cyan bags. -dull white bags contain 4 posh teal bags, 4 mirrored turquoise bags, 1 muted purple bag. -clear silver bags contain 1 dull lime bag, 2 dim plum bags, 5 wavy maroon bags, 3 striped cyan bags. -bright lavender bags contain 1 muted tomato bag. -pale crimson bags contain 1 striped tan bag, 4 dotted red bags, 3 dotted fuchsia bags, 5 dull brown bags. -posh maroon bags contain 3 dark magenta bags, 3 pale gray bags. -vibrant lime bags contain 1 dull maroon bag, 4 light purple bags, 5 dull orange bags, 1 dull purple bag. -drab turquoise bags contain no other bags. -dark bronze bags contain 2 light tomato bags, 1 vibrant gold bag, 3 posh yellow bags, 5 light lavender bags. -muted cyan bags contain 3 dotted black bags, 1 faded violet bag, 5 bright violet bags. -dim tomato bags contain 3 drab chartreuse bags, 1 striped coral bag, 3 pale tan bags. -light teal bags contain 3 pale gray bags. -muted olive bags contain 1 dull green bag, 3 bright violet bags, 1 dark yellow bag. -mirrored tan bags contain 3 dark salmon bags, 1 vibrant red bag, 1 dull gray bag. -light turquoise bags contain 5 posh red bags, 1 dim chartreuse bag, 3 vibrant beige bags, 2 mirrored lavender bags. -dark brown bags contain 2 clear fuchsia bags, 2 dull bronze bags, 3 striped aqua bags, 1 shiny gold bag. -striped orange bags contain 3 shiny gold bags, 1 bright crimson bag, 3 vibrant gold bags. -bright bronze bags contain 3 faded cyan bags, 3 dim blue bags, 2 faded gold bags, 2 bright tan bags. -dotted orange bags contain 4 dim magenta bags, 1 faded white bag, 1 muted tan bag. -dull red bags contain 3 posh yellow bags, 3 pale plum bags. -clear orange bags contain 5 wavy chartreuse bags, 5 dull aqua bags, 1 faded bronze bag, 5 faded chartreuse bags. -dark blue bags contain 2 striped lime bags. -wavy brown bags contain 4 shiny green bags. -wavy purple bags contain 2 dim maroon bags, 1 vibrant coral bag, 4 posh teal bags, 2 dark teal bags. -muted tan bags contain 5 bright violet bags, 4 dotted red bags, 5 dull beige bags, 1 dim gray bag. -posh crimson bags contain 3 dark bronze bags, 3 pale salmon bags, 2 muted beige bags, 2 bright aqua bags. -pale blue bags contain 3 wavy black bags, 5 dotted brown bags, 5 drab chartreuse bags, 5 bright gray bags. -striped plum bags contain 4 light turquoise bags. -posh green bags contain 5 dull cyan bags, 4 muted tan bags, 1 faded silver bag, 3 vibrant black bags. -mirrored yellow bags contain 5 shiny fuchsia bags, 3 bright tan bags, 4 drab fuchsia bags. -striped brown bags contain 4 wavy turquoise bags. -dim bronze bags contain 4 faded black bags, 1 striped lavender bag. -plaid cyan bags contain 5 posh lime bags, 2 wavy white bags, 3 posh crimson bags. -plaid brown bags contain 2 dark bronze bags. -vibrant blue bags contain 4 wavy orange bags, 4 drab silver bags, 2 muted tan bags. -dull violet bags contain 5 posh black bags, 4 shiny tomato bags. -striped magenta bags contain 3 faded white bags, 1 vibrant bronze bag. -striped coral bags contain 1 dull blue bag, 5 faded lime bags, 4 vibrant coral bags. -plaid lime bags contain 1 shiny black bag, 3 mirrored coral bags. -dim indigo bags contain 4 dim coral bags, 3 wavy indigo bags, 3 vibrant red bags, 3 wavy orange bags. -pale violet bags contain 2 drab purple bags. -striped turquoise bags contain 4 drab teal bags, 5 striped bronze bags. -striped indigo bags contain 3 striped purple bags, 4 shiny beige bags. -light coral bags contain 3 bright coral bags, 5 pale teal bags, 5 dull red bags, 3 mirrored tomato bags. -drab plum bags contain 4 dull white bags, 3 clear crimson bags, 2 wavy lavender bags. -dim maroon bags contain no other bags. -shiny crimson bags contain 2 dull indigo bags, 1 bright cyan bag. -dull aqua bags contain 3 dark yellow bags. -drab violet bags contain 4 striped aqua bags. -shiny gold bags contain 2 pale brown bags, 2 dotted chartreuse bags, 1 vibrant gold bag, 4 dull magenta bags. -plaid indigo bags contain 4 striped purple bags, 3 clear brown bags. -muted gold bags contain 1 shiny cyan bag. -dotted lime bags contain 3 dotted olive bags, 4 light tan bags, 4 bright bronze bags, 3 vibrant plum bags. -vibrant red bags contain 2 wavy red bags, 4 dotted chartreuse bags, 5 dim coral bags. -faded lime bags contain 5 drab turquoise bags, 4 pale lavender bags. -striped black bags contain 2 light white bags, 4 posh lime bags, 3 posh chartreuse bags. -posh brown bags contain 1 muted white bag, 2 striped teal bags, 1 faded chartreuse bag. -dotted aqua bags contain 5 dull orange bags. -clear yellow bags contain 5 pale fuchsia bags, 2 posh cyan bags. -faded crimson bags contain 4 vibrant black bags. -dull tan bags contain 1 plaid crimson bag. -dark chartreuse bags contain 1 mirrored turquoise bag. -clear purple bags contain 1 dotted magenta bag, 2 striped lavender bags. -pale indigo bags contain 2 drab tan bags, 2 shiny indigo bags. -plaid coral bags contain 2 dark olive bags, 1 pale aqua bag, 5 shiny bronze bags. -faded purple bags contain 4 dull aqua bags, 2 drab turquoise bags, 5 wavy crimson bags, 2 faded turquoise bags. -pale gold bags contain 3 plaid blue bags, 3 muted plum bags, 4 wavy tomato bags, 3 clear lavender bags. -plaid plum bags contain 1 plaid lavender bag, 3 wavy purple bags. -vibrant violet bags contain 1 posh teal bag, 4 dull gray bags, 5 dim aqua bags, 5 striped yellow bags. -light maroon bags contain 5 clear blue bags. -clear olive bags contain 4 posh yellow bags, 4 dotted olive bags, 2 faded chartreuse bags. -dotted indigo bags contain 1 muted crimson bag, 5 wavy purple bags, 3 dotted crimson bags, 4 dotted chartreuse bags. -muted coral bags contain 3 faded teal bags, 3 pale crimson bags, 1 posh fuchsia bag. -striped olive bags contain 1 plaid chartreuse bag, 1 dull indigo bag, 1 shiny salmon bag, 1 shiny crimson bag. -dull maroon bags contain 4 dull bronze bags, 1 mirrored brown bag, 5 wavy white bags, 5 clear teal bags. -bright aqua bags contain 2 light bronze bags, 3 bright violet bags, 5 posh fuchsia bags. -drab fuchsia bags contain 1 pale black bag. -plaid orange bags contain 2 muted orange bags. -faded aqua bags contain 4 striped orange bags, 3 striped aqua bags. -dull coral bags contain 2 dull aqua bags, 5 dim white bags, 1 striped tan bag. -muted blue bags contain 1 mirrored turquoise bag, 4 bright lavender bags, 4 dull magenta bags. -striped cyan bags contain 1 shiny tan bag, 5 dark cyan bags, 2 pale chartreuse bags, 3 muted gold bags. -muted violet bags contain 4 muted bronze bags, 5 mirrored tan bags, 5 bright yellow bags. -dull blue bags contain 3 striped fuchsia bags, 2 plaid aqua bags, 1 mirrored lime bag. -bright olive bags contain 1 pale turquoise bag, 2 vibrant gray bags, 5 posh chartreuse bags, 4 shiny lime bags. -drab red bags contain 1 light lime bag, 1 mirrored black bag, 4 pale purple bags, 2 drab purple bags. -mirrored brown bags contain 3 dull bronze bags, 3 bright lavender bags. -dotted brown bags contain 1 plaid turquoise bag, 1 dull plum bag. -shiny gray bags contain 2 pale magenta bags. -posh fuchsia bags contain 1 clear gold bag, 5 muted tomato bags, 4 muted white bags, 1 dark brown bag. -shiny green bags contain 5 posh teal bags, 2 dark brown bags, 1 faded turquoise bag. -shiny teal bags contain 1 bright coral bag, 2 plaid aqua bags, 2 vibrant yellow bags. -pale lime bags contain 5 shiny chartreuse bags, 2 striped gold bags. -bright tan bags contain 5 drab turquoise bags, 2 dotted plum bags. -wavy maroon bags contain 3 striped yellow bags, 2 plaid red bags, 4 pale teal bags. -light gray bags contain 3 wavy teal bags, 1 clear brown bag, 5 striped tan bags, 3 muted magenta bags. -dark tan bags contain 5 posh purple bags. -light lime bags contain 4 light brown bags, 3 faded violet bags, 5 bright plum bags. -bright gold bags contain 1 shiny crimson bag, 4 wavy red bags. -drab crimson bags contain 2 dotted purple bags, 4 plaid purple bags, 4 vibrant black bags. -pale maroon bags contain 1 dim gray bag. -wavy chartreuse bags contain 3 bright lavender bags. -plaid gold bags contain 5 posh lavender bags. -plaid yellow bags contain 3 shiny black bags. -dim red bags contain 2 muted indigo bags, 1 shiny aqua bag, 1 dim gray bag. -faded turquoise bags contain 2 shiny coral bags. -mirrored purple bags contain 3 muted beige bags, 4 faded blue bags. -dark black bags contain 4 bright coral bags. -dull indigo bags contain no other bags. -dark lime bags contain 1 shiny chartreuse bag, 5 drab plum bags, 2 dim yellow bags. -dim yellow bags contain 4 dotted plum bags, 2 dim coral bags, 3 dotted red bags. -shiny silver bags contain 5 drab tan bags, 1 bright cyan bag. -posh bronze bags contain 5 dotted salmon bags, 1 light aqua bag. -dull tomato bags contain 1 clear red bag, 1 dull green bag, 1 dark blue bag, 1 striped maroon bag. -bright fuchsia bags contain 1 dark cyan bag. -striped red bags contain 5 mirrored lime bags, 4 dull magenta bags, 2 vibrant yellow bags. -striped green bags contain 2 dim white bags. -wavy fuchsia bags contain 3 muted fuchsia bags, 3 drab blue bags. -posh violet bags contain 2 plaid red bags, 3 faded turquoise bags, 1 faded white bag. -vibrant maroon bags contain 1 clear fuchsia bag, 5 wavy purple bags, 2 dull gold bags. -dim olive bags contain 2 mirrored yellow bags, 2 muted magenta bags, 3 drab coral bags. -muted turquoise bags contain 1 drab white bag, 4 vibrant crimson bags, 5 dark teal bags, 1 drab bronze bag. -light white bags contain 5 vibrant gold bags, 2 faded silver bags, 1 bright beige bag. -dark beige bags contain 4 shiny white bags, 3 wavy chartreuse bags, 1 dotted red bag, 5 plaid crimson bags. -wavy gold bags contain 3 posh teal bags. -muted bronze bags contain 2 dull bronze bags, 2 muted black bags. -wavy lime bags contain 3 dim violet bags, 5 posh violet bags, 1 light white bag, 2 posh olive bags. -clear gray bags contain 2 pale purple bags. -vibrant black bags contain 5 plaid black bags. -dotted olive bags contain 4 dotted fuchsia bags. -drab gray bags contain 3 shiny chartreuse bags, 1 dim yellow bag. -shiny tomato bags contain 1 bright coral bag, 4 mirrored coral bags. -dotted coral bags contain 2 plaid cyan bags, 3 light crimson bags, 1 light white bag, 3 drab aqua bags. -drab blue bags contain 3 bright coral bags, 3 dim coral bags. -mirrored blue bags contain 5 dotted brown bags, 4 clear chartreuse bags, 2 bright gold bags, 3 striped lavender bags. -muted aqua bags contain 2 bright turquoise bags. -bright yellow bags contain no other bags. \ No newline at end of file diff --git a/day07/packBag.ts b/day07/packBag.ts deleted file mode 100644 index 6e21aaa..0000000 --- a/day07/packBag.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Bag, Bags } from './parseRules' - -const unique = (value: unknown, index: number, arr: unknown[]) => - arr.indexOf(value) === index - -const findContainingBag = (bags: Bags) => (bag: Bag): string[] => { - // Find the bags that can contain this bag - const parents = Object.values(bags).filter( - ({ children }) => children?.[bag.color] !== undefined, - ) - // No one contains this bag, so it's just that - if (parents.length === 0) return [bag.color] - - return [ - // Return the parents - ...parents.map(({ color }) => color), - // and the parents of the parents - ...parents.map(findContainingBag(bags)).flat(), - ].filter(unique) -} - -/** - * Determine which bags are needed to package a bag with the given color. - */ -export const packBag = (bags: Bags) => (color: string): string[] => - findContainingBag(bags)(bags[color]).flat() diff --git a/day07/parseRules.spec.ts b/day07/parseRules.spec.ts deleted file mode 100644 index 8a0196b..0000000 --- a/day07/parseRules.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { loadString } from '../lib/loader' -import { parseRules, parseRuleLine } from './parseRules' - -const sample = `light red bags contain 1 bright white bag, 2 muted yellow bags. -dark orange bags contain 3 bright white bags, 4 muted yellow bags. -bright white bags contain 1 shiny gold bag. -muted yellow bags contain 2 shiny gold bags, 9 faded blue bags. -shiny gold bags contain 1 dark olive bag, 2 vibrant plum bags. -dark olive bags contain 3 faded blue bags, 4 dotted black bags. -vibrant plum bags contain 5 faded blue bags, 6 dotted black bags. -faded blue bags contain no other bags. -dotted black bags contain no other bags.` - -describe('parseRule', () => { - it.each([ - [ - 'light red bags contain 1 bright white bag, 2 muted yellow bags.', - { - color: 'light red', - children: { 'bright white': 1, 'muted yellow': 2 }, - }, - ], - [ - 'bright white bags contain 1 shiny gold bag.', - { - color: 'bright white', - children: { 'shiny gold': 1 }, - }, - ], - [ - 'faded blue bags contain no other bags.', - { - color: 'faded blue', - }, - ], - ])(`should parse %s into %s`, (rule, expected) => { - expect(parseRuleLine(rule)).toEqual(expected) - }) -}) - -describe('parseRules', () => { - it('should parse the rules', () => { - /* - Test that it parses the rules into trees: - - light red - / \ - 1 2 - / \ - white muted yellow - - */ - const rules = parseRules(loadString(sample)) - expect(Object.keys(rules)).toHaveLength(9) - // top level bag is light red - const lightRed = rules['light red'] - expect(lightRed.color).toEqual('light red') - // It does not have parents - expect(lightRed.children?.['bright white']).toEqual(1) - expect(lightRed.children?.['muted yellow']).toEqual(2) - // Bottom level is faded blue - const fadedBlue = rules['faded blue'] - expect(fadedBlue.children).toBeUndefined() - }) -}) diff --git a/day07/parseRules.ts b/day07/parseRules.ts deleted file mode 100644 index 238b9c6..0000000 --- a/day07/parseRules.ts +++ /dev/null @@ -1,49 +0,0 @@ -export type Bag = { - color: string - children?: Record -} - -export type Bags = Record - -const ruleDef = /^(?[a-z ]+) bags contain (?.+)/ -const contentsRuleDef = /^(?[0-9]+) (?[a-z ]+) bags?/ - -/** - * Parses a single rule line - */ -export const parseRuleLine = (rule: string): Bag | undefined => { - const match = ruleDef.exec(rule) - if (match?.groups === undefined) return - const children = match.groups.contents - // children counts are separated by comma - .split(',') - .map((s) => s.trim()) - // handle special case of no children - .filter((s) => !s.includes('no other bags')) - // parse the child rule - .map((s) => contentsRuleDef.exec(s)) - .reduce((children, child) => { - if (child?.groups === undefined) return children - return { - ...children, - [child?.groups.color]: parseInt(child?.groups.amount, 10), - } - }, {}) - return { - color: match.groups.color, - children: Object.keys(children).length === 0 ? undefined : children, - } -} - -/** - * Parse the bag in a record with the color as key - */ -export const parseRules = (rules: string[]): Bags => - rules.reduce((bags, rule) => { - const bag = parseRuleLine(rule) - if (bag === undefined) return bags - return { - ...bags, - [bag.color]: bag, - } - }, {}) diff --git a/day07/solution.spec.ts b/day07/solution.spec.ts deleted file mode 100644 index 2c52e7d..0000000 --- a/day07/solution.spec.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { loader, loadString } from '../lib/loader' -import { countBags } from './countBags' -import { packBag } from './packBag' -import { parseRules } from './parseRules' - -const load = loader(7) -const input = load('input') -/** - * These rules specify the required contents for 9 bag types. In this example, - * every faded blue bag is empty, every vibrant plum bag contains 11 bags - * (5 faded blue and 6 dotted black), and so on. - */ -const sample = `light red bags contain 1 bright white bag, 2 muted yellow bags. -dark orange bags contain 3 bright white bags, 4 muted yellow bags. -bright white bags contain 1 shiny gold bag. -muted yellow bags contain 2 shiny gold bags, 9 faded blue bags. -shiny gold bags contain 1 dark olive bag, 2 vibrant plum bags. -dark olive bags contain 3 faded blue bags, 4 dotted black bags. -vibrant plum bags contain 5 faded blue bags, 6 dotted black bags. -faded blue bags contain no other bags. -dotted black bags contain no other bags.` - -const sample2 = `shiny gold bags contain 2 dark red bags. -dark red bags contain 2 dark orange bags. -dark orange bags contain 2 dark yellow bags. -dark yellow bags contain 2 dark green bags. -dark green bags contain 2 dark blue bags. -dark blue bags contain 2 dark violet bags. -dark violet bags contain no other bags.` - -describe('Day 7: Handy Haversacks', () => { - describe('Part 1', () => { - it('should solve the sample', () => { - const rules = parseRules(loadString(sample)) - const packager = packBag(rules) - const bags = packager('shiny gold') - expect(bags).toHaveLength(4) - expect(bags.includes('bright white')).toEqual(true) - expect(bags.includes('muted yellow')).toEqual(true) - expect(bags.includes('dark orange')).toEqual(true) - expect(bags.includes('light red')).toEqual(true) - }) - it('should solve', () => { - const rules = parseRules(input) - const packager = packBag(rules) - expect(packager('shiny gold')).toHaveLength(378) - }) - }) - describe('Part 2', () => { - it('should solve the sample', () => { - const rules = parseRules(loadString(sample)) - const counter = countBags(rules) - expect(counter('shiny gold')).toEqual(32) - }) - it('should solve the second sample', () => { - const rules = parseRules(loadString(sample2)) - const counter = countBags(rules) - expect(counter('shiny gold')).toEqual(126) - }) - it('should solve', () => { - const rules = parseRules(input) - const counter = countBags(rules) - expect(counter('shiny gold')).toEqual(27526) - }) - }) -}) diff --git a/day08/handheld.ts b/day08/handheld.ts deleted file mode 100644 index a4a1c85..0000000 --- a/day08/handheld.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Run the boot program with loop protection - * and return an exit code (-1 on error) and - * the value of the accumulator. - */ -export const boot = (bootCode: string[]): [number, number] => { - // Parse the instructions - const bootInstructions = bootCode - .map((s) => s.split(' ')) - .map(([i, a]) => [i, parseInt(a, 10)]) - let acc = 0 - let ptr = 0 - const lineExecutions = {} as Record - let ins, arg - do { - if (lineExecutions[ptr] !== undefined) return [-1, acc] - lineExecutions[ptr] = true // Record line executions - ins = bootInstructions[ptr]?.[0] - arg = bootInstructions[ptr]?.[1] - if (ins === undefined) return [0, acc] // normal termination - switch (ins) { - case 'nop': - ptr++ - break - case 'acc': - acc += arg as number - ptr++ - break - case 'jmp': - ptr += arg as number - break - default: - console.warn(`Unknown instruction: ${ins} ${arg}`) - return [-2, acc] - } - } while (ins !== undefined) - return [-3, acc] -} diff --git a/day08/input.txt b/day08/input.txt deleted file mode 100644 index 37da8aa..0000000 --- a/day08/input.txt +++ /dev/null @@ -1,613 +0,0 @@ -nop +456 -nop +38 -acc +9 -jmp +153 -acc +15 -nop +560 -jmp +452 -acc +26 -acc +42 -jmp +376 -acc -5 -acc +12 -acc -5 -jmp +15 -jmp +1 -acc -9 -jmp +533 -acc +19 -acc +33 -acc +34 -jmp -6 -nop +404 -nop +140 -acc +0 -jmp +123 -acc +45 -acc +0 -jmp +496 -jmp +487 -acc +9 -acc +34 -jmp +484 -acc +0 -acc -14 -jmp +466 -acc +40 -acc +6 -acc +30 -jmp +444 -nop +386 -jmp +215 -acc +43 -acc +5 -nop -4 -jmp +535 -jmp -13 -acc +3 -acc +7 -acc +49 -acc -1 -jmp +245 -acc +9 -acc +31 -nop +142 -jmp +554 -acc +3 -jmp +493 -nop +399 -jmp +232 -acc -16 -acc +33 -jmp +410 -acc +33 -acc +5 -acc -17 -jmp +272 -acc -3 -acc +37 -jmp +181 -jmp -12 -nop +344 -acc +5 -acc -16 -jmp +290 -nop +530 -acc +15 -acc +3 -jmp +343 -acc +2 -acc +19 -jmp +298 -acc +43 -acc +25 -acc -19 -jmp +439 -acc +43 -acc +45 -acc +20 -jmp +355 -acc +13 -acc +24 -acc -15 -nop +396 -jmp +215 -acc -7 -acc +17 -jmp +441 -acc -8 -acc -19 -jmp +505 -jmp +282 -acc -17 -acc -8 -acc +20 -jmp +359 -acc +26 -acc +14 -acc +47 -acc +3 -jmp +298 -acc +31 -nop +205 -acc +0 -acc +7 -jmp +389 -acc -5 -acc +47 -jmp +94 -acc -13 -jmp +358 -acc -13 -jmp +134 -acc +8 -acc -19 -jmp +312 -acc +43 -acc +17 -jmp +97 -jmp +48 -nop +253 -acc +48 -acc -7 -acc -2 -jmp +23 -acc +26 -acc +14 -acc -14 -acc +17 -jmp +18 -acc +14 -acc +8 -jmp +341 -acc +35 -jmp +227 -acc +15 -acc -7 -jmp -95 -acc -19 -jmp -59 -jmp -31 -acc -6 -acc -4 -acc +24 -jmp +84 -acc -15 -jmp +82 -nop +74 -acc +8 -acc +9 -acc +13 -jmp +194 -jmp +376 -acc +34 -nop -16 -jmp -90 -acc +4 -acc +43 -nop +215 -jmp -147 -acc +0 -acc +11 -acc -15 -acc +23 -jmp +130 -acc +40 -jmp +106 -acc -4 -acc -18 -acc +18 -nop +329 -jmp +230 -acc +19 -nop +172 -acc +43 -jmp +304 -acc +44 -nop +213 -nop +195 -acc +6 -jmp -79 -acc +41 -acc -11 -acc +18 -acc -9 -jmp -25 -acc +27 -acc -6 -acc +31 -jmp -56 -acc +5 -acc +12 -acc +32 -acc +34 -jmp -189 -acc +32 -acc +5 -acc -16 -jmp +301 -nop +108 -nop -108 -jmp -141 -acc -12 -jmp +273 -acc +3 -jmp +140 -acc +7 -acc -11 -acc -17 -nop +194 -jmp -122 -acc -14 -nop +186 -acc +24 -jmp +277 -nop +341 -acc +18 -jmp -64 -acc +45 -acc +42 -jmp +52 -acc +39 -nop +91 -nop -8 -jmp +217 -acc +44 -acc +15 -jmp +72 -acc +24 -jmp -231 -acc -16 -nop +55 -nop +262 -acc +40 -jmp +234 -jmp -14 -acc +31 -nop -177 -acc +40 -jmp +343 -acc -8 -jmp -169 -acc +30 -acc +12 -acc -11 -jmp +41 -acc +9 -acc -9 -jmp +65 -acc +38 -acc +14 -jmp +335 -acc -19 -acc +38 -acc +16 -acc -11 -jmp +230 -jmp -71 -acc +48 -acc -13 -nop -255 -jmp +1 -jmp -220 -acc +2 -jmp +157 -jmp -105 -acc -16 -acc -5 -jmp -196 -acc +30 -jmp +139 -jmp +83 -acc -3 -acc -12 -jmp +254 -jmp -60 -acc +33 -jmp -37 -acc +17 -acc -14 -jmp +93 -nop +178 -acc +38 -acc +47 -jmp -89 -jmp +271 -acc +43 -acc +32 -jmp -240 -acc +26 -acc +32 -acc +30 -nop +284 -jmp +169 -acc -7 -acc +37 -jmp +102 -acc +4 -jmp +86 -jmp -123 -acc +0 -acc -14 -acc +18 -jmp +1 -jmp -5 -jmp -36 -jmp +148 -acc -17 -acc -14 -acc +28 -acc +15 -jmp +79 -jmp -289 -acc +42 -acc -5 -acc +13 -jmp +240 -acc -10 -acc -18 -acc -16 -jmp +103 -acc +21 -jmp +32 -nop +118 -acc +22 -acc -16 -acc +15 -jmp -186 -acc -2 -acc -14 -acc +22 -acc +16 -jmp +73 -acc -6 -jmp -225 -acc -18 -nop +113 -acc +50 -acc -6 -jmp +181 -acc +41 -jmp +1 -nop +92 -acc +23 -jmp +190 -acc +39 -acc +0 -acc +33 -jmp +111 -nop -63 -nop -81 -acc +9 -acc +35 -jmp +50 -acc +11 -jmp -295 -nop +230 -acc +34 -acc +12 -acc +47 -jmp +126 -acc +0 -nop -1 -acc +19 -acc -16 -jmp -360 -acc +29 -acc -2 -jmp -110 -acc +2 -acc +50 -jmp -36 -jmp -107 -jmp +178 -acc -11 -jmp +181 -nop +115 -nop +186 -jmp +95 -jmp +1 -nop +148 -acc +2 -acc +49 -jmp +173 -acc +38 -jmp +178 -acc +28 -acc +6 -acc +15 -jmp +110 -acc +49 -nop +100 -jmp +57 -acc +45 -nop +65 -acc +43 -acc +12 -jmp -272 -jmp -260 -nop +100 -jmp -224 -jmp +142 -jmp +52 -jmp -34 -jmp -110 -acc +35 -nop -112 -jmp +16 -jmp -18 -jmp -157 -jmp +81 -acc +1 -jmp -107 -acc +16 -acc +23 -jmp -255 -acc +22 -jmp +42 -nop +168 -acc +41 -jmp -311 -jmp -163 -jmp +118 -nop +4 -acc +18 -jmp +54 -jmp -414 -nop -181 -acc +10 -acc +23 -jmp -321 -nop -322 -acc -9 -jmp +101 -nop -7 -acc +35 -acc +46 -jmp -312 -nop +64 -nop -386 -jmp -280 -acc +16 -jmp -156 -acc +13 -nop -131 -jmp +1 -jmp -416 -jmp +15 -jmp -94 -jmp -330 -nop +93 -nop -205 -acc +48 -jmp -19 -jmp -70 -nop +21 -acc -5 -acc +19 -jmp +62 -acc +22 -jmp -448 -jmp -77 -acc +26 -acc -2 -jmp +70 -acc -2 -acc +21 -jmp -195 -nop -114 -jmp +107 -acc +37 -acc +6 -jmp -436 -acc +48 -jmp +96 -jmp -121 -acc +0 -jmp -74 -jmp +1 -acc +27 -acc +2 -jmp -279 -acc +7 -acc +0 -jmp +1 -jmp -413 -acc +6 -jmp -180 -acc +18 -acc +10 -jmp -437 -jmp -338 -nop -456 -jmp -463 -acc +1 -nop -54 -jmp -168 -acc +27 -jmp -479 -acc +42 -jmp -408 -jmp +85 -acc -16 -acc +24 -jmp -391 -jmp -206 -nop +8 -jmp +1 -acc +38 -nop -473 -jmp -94 -acc +10 -acc -14 -jmp -425 -acc +17 -nop -208 -acc +39 -jmp -265 -acc +3 -jmp -284 -acc +19 -acc +5 -nop -111 -acc +22 -jmp -309 -acc +12 -acc +39 -jmp -151 -acc +33 -acc -14 -jmp -450 -acc +16 -nop +50 -jmp -188 -acc -13 -acc +15 -acc +4 -jmp -484 -acc +27 -jmp -98 -acc +34 -jmp -120 -jmp -537 -acc +43 -acc -8 -acc -6 -jmp -405 -acc -8 -nop -179 -acc -11 -jmp -264 -acc +24 -jmp -280 -acc -6 -acc +1 -jmp -353 -acc -18 -jmp -58 -acc +1 -acc -7 -acc -2 -acc +44 -jmp -115 -nop -328 -acc +27 -acc +2 -jmp +20 -acc +14 -acc +34 -jmp -460 -nop -445 -acc -9 -acc +24 -acc -11 -jmp -72 -jmp -434 -jmp -370 -acc +35 -acc +43 -acc +45 -acc +44 -jmp -287 -jmp -546 -nop -474 -acc -6 -jmp -357 -nop -163 -nop -218 -nop -342 -jmp -570 -acc +44 -acc +4 -acc +35 -acc +6 -jmp -541 -jmp -274 -acc +48 -acc -18 -jmp -171 -acc -13 -acc -14 -acc +25 -acc +26 -jmp +1 \ No newline at end of file diff --git a/day08/solution.spec.ts b/day08/solution.spec.ts deleted file mode 100644 index cfbca12..0000000 --- a/day08/solution.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { loader, loadString } from '../lib/loader' -import { boot } from './handheld' - -const load = loader(8) -const input = load('input') -const sample = loadString(`nop +0 -acc +1 -jmp +4 -acc +3 -jmp -3 -acc -99 -acc +1 -jmp -4 -acc +6`) -const sample2 = loadString(`nop +0 -acc +1 -jmp +4 -acc +3 -jmp -3 -acc -99 -acc +1 -nop -4 -acc +6`) - -describe('Day 8: Handheld Halting', () => { - describe('Part 1', () => { - it('should solve the sample', () => { - const handheldBootCode = boot(sample) - expect(handheldBootCode).toEqual([-1, 5]) - }) - it('should solve', () => { - const handheldBootCode = boot(input) - expect(handheldBootCode).toEqual([-1, 1087]) - }) - }) - describe('Part 2', () => { - it('should solve the sample', () => { - const handheldBootCode = boot(sample2) - expect(handheldBootCode).toEqual([0, 8]) - }) - it('should solve', () => { - // Find all the jumps - const jmps = input.reduce((jmps, i, k) => { - if (i.startsWith('jmp')) return [...jmps, k] - return jmps - }, [] as number[]) - - // Change one jpm instruction after another and run the program - expect( - jmps.reduce( - (exit, line) => { - if (exit[0] === 0) return exit - return boot([ - ...input.slice(0, line), - input[line].replace('jmp', 'nop'), - ...input.slice(line + 1), - ]) - }, - [-1, 0], - ), - ).toEqual([0, 780]) - }) - }) -}) diff --git a/day09/findInvalidNumber.ts b/day09/findInvalidNumber.ts deleted file mode 100644 index 0e3dde9..0000000 --- a/day09/findInvalidNumber.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { uniqueCombinations } from '../lib/uniqueCombinations' - -const sum = (numbers: number[]): number => - numbers.reduce((total, n) => total + n, 0) - -const equal = (n: number) => (compare: number): boolean => compare === n - -/** - * Finds the invalid number in the input: - * To be valid, the number must be the sum of two of those numbers in - * the subset of preambleLength preceeding it. - */ -export const findInvalidNumber = (preambleLength: number) => ( - input: number[], -): number | undefined => { - const c = uniqueCombinations(2) - // Go through all numbers - return input.find((n, k, arr) => { - // Skip if it is part of the preamble - if (k < preambleLength) return false - // Build a list of all possible pairs of numbers in the preamble - const preamble = c(arr.slice(k - preambleLength, k)) - // If there is no pair which's sum equals this number, it is invalid - return preamble.map(sum).find(equal(n)) === undefined - }) -} diff --git a/day09/findSet.ts b/day09/findSet.ts deleted file mode 100644 index a8b2dbd..0000000 --- a/day09/findSet.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Use backtracking to iterate over growing sets of previous numbers in input - * until a continuous set of numbers is found which's sums up the the number - * we are interested in. - */ -export const findSet = ( - input: number[], - interestingNumber: number, - start = input.indexOf(interestingNumber), - size = 2, -): number[] => { - const begin = start - size - if (begin < 0) return [] - const set = input.slice(begin, start) - const setSum = set.reduce((total, n) => total + n, 0) - if (setSum === interestingNumber) return set - // The set is getting too large - if (setSum > interestingNumber) - return findSet(input, interestingNumber, start - 1) // Move up one line - // Grow the set - return findSet(input, interestingNumber, start, size + 1) -} diff --git a/day09/input.txt b/day09/input.txt deleted file mode 100644 index 92ed3da..0000000 --- a/day09/input.txt +++ /dev/null @@ -1,1000 +0,0 @@ -14 -9 -43 -18 -13 -24 -3 -38 -33 -8 -41 -4 -32 -15 -31 -44 -17 -34 -21 -10 -50 -37 -2 -23 -6 -47 -5 -9 -11 -16 -12 -18 -7 -13 -26 -14 -19 -8 -20 -15 -29 -58 -17 -22 -21 -24 -25 -10 -27 -31 -33 -23 -28 -30 -34 -32 -35 -38 -49 -18 -26 -36 -37 -47 -39 -56 -40 -42 -43 -41 -44 -45 -46 -48 -50 -51 -53 -79 -73 -69 -117 -54 -55 -90 -57 -62 -75 -114 -85 -94 -110 -81 -98 -153 -86 -89 -204 -96 -101 -103 -104 -152 -169 -124 -135 -109 -143 -171 -119 -132 -137 -207 -166 -167 -184 -185 -170 -175 -182 -187 -190 -197 -233 -204 -212 -244 -299 -228 -339 -241 -246 -269 -415 -319 -298 -349 -337 -333 -444 -357 -345 -362 -365 -562 -377 -387 -401 -416 -541 -469 -472 -474 -647 -591 -487 -515 -567 -617 -686 -1158 -793 -670 -678 -702 -864 -710 -856 -781 -817 -764 -1251 -1214 -885 -941 -943 -946 -961 -1002 -1082 -1456 -1269 -1184 -2104 -1364 -1348 -2032 -1372 -1742 -1412 -1474 -1792 -1545 -1649 -2305 -2358 -1826 -2725 -1828 -3282 -2043 -1907 -1963 -2910 -2266 -2814 -2453 -2532 -2712 -2957 -2720 -2784 -3903 -3019 -3123 -4131 -4006 -3789 -3871 -3654 -4811 -3735 -3791 -5866 -4309 -4416 -4439 -4229 -4719 -5576 -5237 -8578 -5244 -6447 -5504 -8510 -7445 -9570 -7920 -6777 -8725 -7389 -12460 -7606 -13305 -15899 -9992 -14957 -8748 -12843 -8855 -14092 -8948 -9956 -10741 -10481 -10748 -11951 -25705 -12281 -26647 -14697 -14166 -25855 -19473 -16244 -24048 -16354 -16461 -36446 -22914 -17603 -20704 -28195 -17803 -18811 -29429 -18904 -20437 -41380 -24914 -22699 -46409 -26447 -26978 -57624 -33639 -33847 -32598 -41141 -39160 -33957 -70570 -34064 -35406 -36414 -80323 -50894 -36614 -36707 -48333 -63592 -39341 -43136 -66445 -59313 -49146 -92952 -99043 -99227 -73028 -66237 -69012 -66555 -70771 -68021 -107362 -69470 -70478 -71820 -73121 -91469 -76048 -73321 -107478 -108353 -122905 -142591 -92282 -108459 -115383 -125194 -142791 -137491 -135567 -132792 -199928 -134576 -163289 -138499 -334504 -205037 -197014 -142298 -144941 -267785 -149369 -271642 -165603 -237223 -200635 -207665 -227849 -200741 -352606 -259770 -257986 -431074 -310544 -267368 -283440 -291667 -273075 -304102 -402068 -287239 -294310 -307901 -314972 -345682 -350004 -350110 -437245 -612376 -401376 -408300 -435514 -636046 -695539 -675143 -547009 -525354 -540443 -684816 -550808 -1076162 -560314 -567385 -933654 -581549 -595140 -602211 -664976 -968614 -695686 -700114 -751486 -809676 -1044346 -926730 -1318871 -960868 -1065797 -1091251 -1225951 -1646557 -2157048 -1121992 -1153019 -1519422 -1127699 -1155454 -1277235 -1176689 -1183760 -1197351 -1267187 -1360662 -1626844 -1395800 -1712354 -2213243 -1736406 -1887598 -1992527 -2088567 -2026665 -2187789 -2218950 -2277446 -2329708 -2249691 -2280718 -2283153 -2304388 -2311459 -3516878 -2453924 -2544422 -5605445 -2464538 -3353189 -3949649 -3132206 -3108154 -5319995 -5686055 -3914263 -3880125 -5220773 -4115232 -4214454 -4437480 -4468641 -4554079 -4563871 -4530409 -5807113 -4587541 -4615847 -4998346 -6378801 -10826218 -5008960 -5596744 -7018617 -6485395 -6240360 -6988279 -7022417 -9022720 -8530110 -7794388 -7995357 -8329686 -8552712 -8906121 -13145957 -8999050 -12016963 -12615361 -9528755 -15015505 -14537715 -10007306 -13258977 -10605704 -12027577 -13504012 -11837104 -15518389 -13228639 -14782667 -27928624 -14816805 -15789745 -16525467 -16325043 -16548069 -21016013 -21844410 -17905171 -23751661 -20134459 -26930747 -19536061 -20613010 -22034883 -22442808 -31843432 -25096081 -29553682 -36661215 -25065743 -26619771 -29018384 -36817550 -38968275 -30606550 -41591210 -32114788 -25918798 -36084130 -34453240 -37441232 -38039630 -47100626 -63748297 -57537297 -40149071 -43055818 -42647893 -44477691 -47508551 -54114465 -61883293 -50984541 -56525348 -51685514 -52538569 -54937182 -58033586 -69574825 -93966580 -60372038 -103019931 -62002928 -70537370 -95576927 -75480862 -117862762 -82796964 -178500793 -112987469 -123689290 -85703711 -107880589 -174870762 -103523110 -124512007 -102670055 -120036514 -125474552 -161053517 -107475751 -112970768 -169478679 -122374966 -130909408 -211178263 -132540298 -137483790 -183361451 -278938378 -198674479 -215640823 -293167969 -416857259 -218244009 -188373766 -193179462 -249986559 -206193165 -220446519 -227182062 -210145806 -294953231 -229850717 -235345734 -244959541 -243880176 -382035930 -319283174 -367886032 -270024088 -315901749 -320845241 -371735217 -468230568 -592181736 -381553228 -544939790 -418224483 -394566931 -436043882 -399372627 -416338971 -426639684 -439996523 -474810258 -611886647 -465196451 -473730893 -480305275 -743754981 -710468680 -1175665131 -585925837 -590869329 -636746990 -796207024 -760841764 -891955376 -776120159 -780925855 -793939558 -810905902 -826012311 -1026913211 -835416509 -815711598 -842978655 -906944959 -905192974 -938927344 -1077083098 -945501726 -954036168 -1066231112 -1845872303 -1176795166 -1970734724 -1222672827 -1387076353 -1761213324 -1536961923 -1726427581 -2016010442 -1574865413 -1591831757 -1739441284 -1720904572 -1754638942 -2768626923 -3420737716 -1844120318 -1748171629 -1812137933 -1850694700 -1884429070 -1899537894 -2011732838 -2020267280 -3595132693 -3860130760 -3199214286 -2609749180 -3862427538 -3141715295 -3111827336 -5215224728 -3425560113 -3166697170 -3295769985 -3312736329 -3460345856 -3469076201 -3502810571 -3560309562 -3592291947 -3598866329 -7027362661 -5049908986 -4494178250 -3896161908 -4509287074 -4032000118 -5523077851 -7020655418 -6963156427 -5721576516 -5751464475 -6424563665 -6253542631 -6278524506 -8718035299 -6635773371 -9753576634 -10572986837 -6905028276 -6929422057 -7488453855 -7095102518 -7152601509 -7191158276 -14803485620 -14583556373 -7928162026 -10859318335 -13788374880 -8541287192 -9555077969 -11244654367 -12005007106 -14417875912 -11473040991 -12029988981 -13060337036 -12532067137 -12914297877 -13540801647 -13730875889 -13834450333 -14000130794 -14024524575 -14082023566 -20883477398 -26072868784 -14343759785 -15119320302 -19933169132 -22959163104 -16469449218 -29488247101 -20799732336 -18096365161 -21028118960 -23274643348 -55561115885 -24533378027 -26894787369 -24562056118 -27540932441 -25446365014 -69561246679 -27271677536 -27565326222 -27834581127 -48424409839 -28106548141 -28425783351 -42629743188 -44991152530 -35143492121 -50169430717 -40732901468 -34565814379 -37497568178 -38896097497 -39124484121 -51456843487 -44302762308 -51700426699 -49095434145 -77710363158 -50008421132 -51833733654 -54837003758 -56532331492 -55106258663 -55378225677 -55399907349 -63569275472 -62672362520 -80134644651 -93398196453 -73690298500 -76622052299 -69709306500 -72063382557 -73461911876 -106856750836 -76393665675 -115746536420 -90958217775 -119204694012 -105627765637 -99103855277 -148235200211 -135512870328 -104845424890 -110778133026 -109943262421 -195803642665 -110484484340 -118969182821 -216800013257 -209588339617 -132381669020 -141772689057 -195591235120 -267867025222 -187809918977 -303556455397 -145525294433 -149855577551 -167351883450 -181239090565 -201442702115 -190062073052 -224832459649 -204731620914 -260741871878 -215623557916 -214788687311 -306288127005 -274154358077 -355161802427 -400322856034 -252257173397 -313620759585 -277906963453 -282237246571 -356561376368 -506416953919 -295380871984 -442319246449 -312877177883 -317207461001 -326764384998 -604671348451 -348590974015 -385970711479 -391504775167 -569950489738 -419520308225 -883571249323 -430412245227 -467045860708 -488943045388 -526411531474 -708712236168 -530164136850 -640385144583 -577618118555 -591527723038 -612588332985 -595114424454 -769083631447 -747619706228 -608258049867 -908735184039 -630084638884 -643971845999 -712735096477 -897458105935 -734561685494 -777475486646 -1027778358092 -1197655281556 -849932553452 -919355290615 -1021939968265 -955988906096 -1019107182238 -1260973216968 -1107782255405 -1284356990582 -1169145841593 -1480017192336 -1221612361922 -1203372474321 -1225199063338 -1238342688751 -1356706942476 -1252229895866 -1274056484883 -1562667649929 -2066603947528 -2216762463794 -1753668867732 -1627408040098 -1696830777261 -1769287844067 -2922814709325 -2144554353953 -1938462472853 -3878803615421 -2063771161501 -2126889437643 -2276928096998 -2311154729726 -2372518315914 -4619645486586 -2428571537659 -2424984836243 -2441715163072 -4310980788767 -3379119333509 -2919374592405 -2526286380749 -2836724134812 -4046215941065 -6798178207826 -3324238817359 -3381076907830 -6374751950268 -3466118621328 -3707750316920 -6630565026245 -4065351910496 -8189784404188 -4190660599144 -4340699258499 -8803323487927 -4588082826724 -4683673045640 -4797503152157 -7048217024245 -9967591616650 -5361089755477 -4968001543821 -5907363288579 -6984726502901 -5363010515561 -15174510907089 -8406051168995 -6705315725189 -6790357438687 -8178580059987 -8391423362560 -7656779220472 -8988163751301 -10821225625389 -9024372304139 -8531359857643 -8778743425868 -8874333644784 -8928782085223 -9271755872364 -11782229655058 -9765504695978 -10158592907634 -12347737018462 -10331012059382 -16184236140950 -14237344160345 -11270373804140 -14351174266862 -14447136659159 -13495673163876 -15096739087749 -14883895785176 -17415795666699 -28531973159412 -17519523608944 -16585561305695 -17405693502427 -17803115730007 -17555732161782 -32439627946958 -17653077070652 -20144707448924 -20542129676504 -32652471249531 -24649400481154 -19924097603612 -20489604967016 -21601385863522 -23826685223258 -24766046968016 -48476085704412 -25621548071002 -27846847430738 -31966660268103 -28379568949052 -29980634872925 -34001356972394 -33991254808122 -44910754416940 -61838102238860 -37127690982199 -34961425664209 -41525483467134 -35208809232434 -48336452397754 -37577174674264 -40068805052536 -53568046131625 -40413702570628 -47222933934524 -68448374001588 -42090990830538 -45428071086780 -54746681840941 -50387595039018 -53468395501740 -54001117020054 -56226416379790 -58360203821977 -62380925921446 \ No newline at end of file diff --git a/day09/solution.spec.ts b/day09/solution.spec.ts deleted file mode 100644 index 20b4652..0000000 --- a/day09/solution.spec.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { loader, loadString } from '../lib/loader' -import { findInvalidNumber } from './findInvalidNumber' -import { findSet } from './findSet' - -const toInt = (s: string) => parseInt(s, 10) -const load = loader(9) -const sample = loadString(`35 -20 -15 -25 -47 -40 -62 -55 -65 -95 -102 -117 -150 -182 -127 -219 -299 -277 -309 -576`).map(toInt) -const input = load('input').map(toInt) - -describe('Day 9: Encoding Error', () => { - describe('Part 1', () => { - it('should solve the sample', () => - expect(findInvalidNumber(5)(sample)).toEqual(127)) - it('should solve', () => - expect(findInvalidNumber(25)(input)).toEqual(25918798)) - }) - describe('Part 2', () => { - it('should solve the sample', () => { - expect(findSet(sample, 127)).toEqual([15, 25, 47, 40]) - }) - it('should solve', () => { - const set = findSet(input, 25918798) - set.sort((a, b) => a - b) - expect(set[0] + set[set.length - 1]).toEqual(3340942) - }) - }) -}) diff --git a/day10/arrangeAdapters.ts b/day10/arrangeAdapters.ts deleted file mode 100644 index 899d3c5..0000000 --- a/day10/arrangeAdapters.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { countDifferences, stringUpAdapters } from './stringUpAdapters' - -const checks = {} as Record - -const hashRatings = (ratings: number[]): string => ratings.toString() - -const isValid = (ratings: number[]): boolean => { - const hash = hashRatings(ratings) - if (checks[hash] === undefined) { - const diffs = countDifferences(ratings) - // All differences must be between 1-3 volts - const diffRatingsValid = Object.keys(diffs).reduce((isValid, rating) => { - if (isValid === false) return false - const r = parseInt(rating, 10) - return r >= 1 && r <= 3 - }, true) - checks[hash] = diffRatingsValid - } - return checks[hash] -} - -/** - * First attempt, mutate the arrangements by removing one or more adapters - * and verifying if this arrangement is valid. - * If yes, remove more adapters until it is not. - * - * This works, but is too slow. - */ -const mutate = ( - ratings: number[], - mutations: number[][], - deviceRating: number = ratings[ratings.length - 1], - deleteFrom = 0, - deleteAmount = 1, - previousPassed = true, -): boolean => { - // We would be deleting the entire list of adapters - if (deleteFrom >= ratings.length) return false - if (deleteFrom + deleteAmount >= ratings.length) return false - // Create the mutation by removing adapters from the given position - const mutation = [ - ...ratings.slice(0, deleteFrom), - ...ratings.slice(deleteFrom + deleteAmount), - ] - // We removed all - if (mutation.length === 0) return false - // We no longer can connect to the device - if (mutation[mutation.length - 1] !== deviceRating) return false - // We already know this is a valid mutations - const mutationHash = hashRatings(mutation) - if (mutations.find((m) => hashRatings(m) === mutationHash)) return false - // We have already checked this mutation - if (checks[mutationHash] !== undefined) { - return mutate(ratings, mutations, deviceRating, deleteFrom + 1, 1, false) - } - if (isValid(mutation)) { - mutations.push(mutation) // Found one - // Continue with this mutation, delete more - mutate(mutation, mutations, deviceRating, deleteFrom - deleteAmount, 1) - mutate( - mutation, - mutations, - deviceRating, - deleteFrom - deleteAmount, - deleteAmount + 1, - ) - // If we found this from a previously valid combination, - // continue with the entire chain and delete more - if (previousPassed) - mutate(ratings, mutations, deviceRating, deleteFrom, deleteAmount + 1) - } - return mutate(ratings, mutations, deviceRating, deleteFrom + 1, 1, false) -} - -export const arrangeAdapters = (ratings: number[]): number[][] => { - const sorted = stringUpAdapters(ratings) - const mutations = [] as number[][] - mutate(sorted, mutations) - return [sorted, ...mutations] -} diff --git a/day10/countAdapterArrangements.ts b/day10/countAdapterArrangements.ts deleted file mode 100644 index 8e4186b..0000000 --- a/day10/countAdapterArrangements.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { stringUpAdapters } from './stringUpAdapters' - -const chainConnections = ( - connections: Record, - chains = 0, - rating = 0, -): number => { - // If there is no more adapter to connect, we have reached the end of the chain - if (connections[rating].length === 0) { - // end of chain - return 1 - } - // For all possible connections to this adapter extend the chain - return connections[rating].reduce( - (total, connection) => - total + chainConnections(connections, chains, connection), - chains, - ) -} - -/** - * Improved implementation: this one first determins all possible adapters one, - * and then creates a chain for all these combinations using backtracking. - */ -export const countAdapterArrangements = (ratings: number[]): number => { - const connections = [0, ...stringUpAdapters(ratings)] - .sort((a, b) => a - b) - .reduce( - (connections, rating, _, ratings) => ({ - ...connections, - [rating]: ratings.filter((r) => { - const diff = r - rating - return diff >= 1 && diff <= 3 - }), - }), - {} as Record, - ) - return chainConnections(connections) -} diff --git a/day10/countRoutes.ts b/day10/countRoutes.ts deleted file mode 100644 index e60a064..0000000 --- a/day10/countRoutes.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { stringUpAdapters } from './stringUpAdapters' - -/** - * Third aproach: count the possible routes - * Go through each adapter and count how many routes lead to this adapter. - * There can be at max three adapters leading to this one in the previous - * connection, because of the rating constraint (diff must be 1-3). - */ -export const countRoutes = (ratings: number[]): number => { - const adapters = [0, ...stringUpAdapters(ratings)] // sort by rating - const routes = adapters.map((_, k) => (k === 0 ? 1 : 0)) // Create the map to store the routes needed to reach each adapter - - // there are n adapters - for (let n = 0; n < routes.length; n++) { - // add the number of routes that lead to the preceeding 3 adapters - for (let j = n - 3; j < n; j++) { - if (adapters[n] <= adapters[j] + 3) { - routes[n] += routes[j] - } - } - } - - // the last entry now contains the sum of all possibly combinations leading - // to the last adapter - return routes[routes.length - 1] -} diff --git a/day10/input.txt b/day10/input.txt deleted file mode 100644 index 33cc291..0000000 --- a/day10/input.txt +++ /dev/null @@ -1,106 +0,0 @@ -66 -7 -73 -162 -62 -165 -157 -158 -137 -125 -138 -59 -36 -40 -94 -95 -13 -35 -136 -96 -156 -155 -24 -84 -42 -171 -142 -3 -104 -149 -83 -129 -19 -122 -68 -103 -74 -118 -20 -110 -54 -127 -88 -31 -135 -26 -126 -2 -51 -91 -16 -65 -128 -119 -67 -48 -111 -29 -49 -12 -132 -17 -41 -166 -75 -146 -50 -30 -1 -164 -112 -34 -18 -72 -97 -145 -11 -117 -58 -78 -152 -90 -172 -163 -89 -107 -45 -37 -79 -159 -141 -105 -10 -115 -69 -170 -25 -100 -80 -4 -85 -169 -106 -57 -116 -23 \ No newline at end of file diff --git a/day10/sample.txt b/day10/sample.txt deleted file mode 100644 index cd1b40b..0000000 --- a/day10/sample.txt +++ /dev/null @@ -1,11 +0,0 @@ -16 -10 -15 -5 -1 -11 -7 -19 -6 -12 -4 \ No newline at end of file diff --git a/day10/sample2.txt b/day10/sample2.txt deleted file mode 100644 index be5c492..0000000 --- a/day10/sample2.txt +++ /dev/null @@ -1,31 +0,0 @@ -28 -33 -18 -42 -31 -14 -46 -20 -48 -47 -24 -23 -49 -45 -19 -38 -39 -11 -1 -32 -25 -35 -8 -17 -7 -9 -4 -2 -34 -10 -3 \ No newline at end of file diff --git a/day10/solution.spec.ts b/day10/solution.spec.ts deleted file mode 100644 index 3afcb58..0000000 --- a/day10/solution.spec.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { loader } from '../lib/loader' -import { countDifferences, stringUpAdapters } from './stringUpAdapters' -import { arrangeAdapters } from './arrangeAdapters' -import { countAdapterArrangements } from './countAdapterArrangements' -import { countRoutes } from './countRoutes' - -const toInt = (s: string) => parseInt(s, 10) -const load = loader(10) -const sample = load('sample').map(toInt) -const sample2 = load('sample2').map(toInt) -const input = load('input').map(toInt) - -describe('Day 10: Adapter Array', () => { - describe('Part 1', () => { - it('should solve the sample', () => { - const adapters = stringUpAdapters(sample) - expect(adapters).toEqual([1, 4, 5, 6, 7, 10, 11, 12, 15, 16, 19, 22]) - const differences = countDifferences(adapters) - expect(differences).toEqual({ 1: 7, 3: 5 }) - }) - it('should solve the seconds sample', () => - expect(countDifferences(stringUpAdapters(sample2))).toEqual({ - 1: 22, - 3: 10, - })) - it('should solve the seconds sample', () => - expect( - Object.values(countDifferences(stringUpAdapters(input))).reduce( - (total, r) => total * r, - 1, - ), - ).toEqual(2482)) - }) - describe('Part 2', () => { - it('should solve the sample', () => { - const arr = arrangeAdapters(sample) - expect(arr).toHaveLength(8) - expect(arr).toContainEqual([1, 4, 5, 6, 7, 10, 11, 12, 15, 16, 19, 22]) - expect(arr).toContainEqual([1, 4, 5, 6, 7, 10, 12, 15, 16, 19, 22]) - expect(arr).toContainEqual([1, 4, 5, 7, 10, 11, 12, 15, 16, 19, 22]) - expect(arr).toContainEqual([1, 4, 5, 7, 10, 12, 15, 16, 19, 22]) - expect(arr).toContainEqual([1, 4, 6, 7, 10, 11, 12, 15, 16, 19, 22]) - expect(arr).toContainEqual([1, 4, 6, 7, 10, 12, 15, 16, 19, 22]) - expect(arr).toContainEqual([1, 4, 7, 10, 11, 12, 15, 16, 19, 22]) - expect(arr).toContainEqual([1, 4, 7, 10, 12, 15, 16, 19, 22]) - }) - it('should solve the sample (using countAdapterArrangements)', () => { - const arr = countAdapterArrangements(sample) - expect(arr).toEqual(8) - }) - it('should solve the sample (using countAdapterArrangements)', () => - expect(countAdapterArrangements(sample)).toEqual(8)) - - it('should solve the second sample (using countAdapterArrangements)', () => - expect(countAdapterArrangements(sample2)).toEqual(19208)) - - // The two above approaches were too slow - it('should solve the second sample (using countWays)', () => - expect(countRoutes(sample2)).toEqual(19208)) - - it('should solve', () => expect(countRoutes(input)).toEqual(96717311574016)) - }) -}) diff --git a/day10/stringUpAdapters.ts b/day10/stringUpAdapters.ts deleted file mode 100644 index 9afb66b..0000000 --- a/day10/stringUpAdapters.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * String up all adapters (by sorting them). - * Finally, your device's built-in adapter is always 3 higher than the highest adapter - */ -export const stringUpAdapters = (adapterRatings: number[]): number[] => { - const sorted = [...adapterRatings].sort((a, b) => a - b) - sorted.push(sorted[sorted.length - 1] + 3) // Add device adapter - return sorted -} - -/** - * Count the rating differences in the string of adapters - */ -export const countDifferences = ( - adapterRatings: number[], -): Record => - adapterRatings.reduce((diff, rating, index, ratings) => { - const previousRating = ratings[index - 1] ?? 0 - const ratingDiff = rating - previousRating - return { - ...diff, - [ratingDiff]: (diff[ratingDiff] ?? 0) + 1, // Increase counter for this rating differences - } - }, {} as Record) diff --git a/day11/input.txt b/day11/input.txt deleted file mode 100644 index 75548d9..0000000 --- a/day11/input.txt +++ /dev/null @@ -1,91 +0,0 @@ -LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLL.LLLLLLL.LLLLLL.LL.LLLL.LLLLLLLLLLLLLLL -LLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLLLLLL.LLLLLLL.LLLL.LLL....LLL.LLL.LLLLLLL.LLL.LLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLL.LLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL -LLLL.LLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLL.LLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLL.LLLL.LLLLLLL.L.LLL.LLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLL.LLL..LL.LLL -LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLL.LLLLLL.LLLL.LL.L.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL -LLLLLLLLLLLLLL.LLLLLL.L.LLLLLLLLLL.LLL.LLLL.LLLLLLLLLLLLL.LLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLL -....L..L....L...L.......L.LL.....L..L...LLLL.LLL..L.L...LL..L...LL.....L..LL.....L....L.L..L -LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLL.LLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL..LLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL.LL..LLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLL -LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL -LLL..LLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLLLLLLL.LLLLLLLLLLL.LLLL.LLLLLLLLL.L.LLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLL.LLLLLLLLLLL.LLL.LLLLL.LLLLLLLLLLLLLLLLLLLLL..LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -.L..L......L.L....L...L..........L.L....L...LL....LL....LL...LLL....LL..L...L...L.........L. -LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLL.LL.LLLLLLLLLLLLLLLLLLLLL..LLLLLLLLLLLLLLLLLL.LLLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLL.LL.LLLLLLL.LLLLLLL.L.LLL.LLLL.LLLLLLLLLLL -LLLLLL.LL.LLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLL.LL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLL -LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLL..LLLLLLLLLL -LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL.L.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLL.LL.L.LLLLLLLLLLLLLL.L.LLLLLLLLLLL -LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL -LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL -..L.L.L..L.L.....LL..L........L..L....L...LL.........L.L.L.L..L......L.........L..L....L.... -LLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLL.L.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLL.L.LLLLLLLLLLLLLLL.LLLL -LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLL -LLLL.LLLL.LLLLLLLLLL..LLLLLLLLL.LLLLLLLLLLL.LLL.LLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLL -LLLL.LLLL.LLL..LLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL -LLLLL.LLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLL.LLLL.LLLLLLLLLLL -LLLLLLLLLLLLLLLL.LLLL.LLLLLLL.L.LL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLL.L.LLLLLLLL.LL.LLLLLLLL -LLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLL -L...L.......LL.LL.L....L...L.....L.......L.........L.L.L..LL.L.L.L.L..L....L.L...L.L.LL..... -LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLL..LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL -LLLLL.LLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL.LLL.LLLLLL. -LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL..LLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLL. -LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL..LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LL -..LLL.L..L..L..L..L..L.L...LL..L.....LLL.L..LL.....LLL.......L.L...L........LL........L....L -LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL -LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLLLLLLL -LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLL -LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL -L.LLLLLLL.LLLL.LLLLLL.LLLLLLLLL.LL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -LL.LL...L......L.L.....L.........L....L...L..L..LLL.L...L......L.L.....LL..LL..LLL....L..L.L -LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLL -LL.LLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLL.L.LLLLLLLLL -LLLLLLL.L.LLLL.LLLL.L.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LL -L..L.L....L......LLLL...L....LL...L..LLL......LLL.LL.LLL...LL..L...LLL........L.....LL.L.LLL -LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLL.LL.LLLLLLLL.LLLLLLLLLLL -LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.L.LLLLLLL.LLLLLLL.LLLLLLL.L.LL.LLLLL.LLLLLLLLLLL -LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLL..LLLLLL.LLLL.LLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL -LL.......L......L...LL.......LL.LL.LL.L.LL.L..L.......L.L.LLLL.LL...LL......LLL..L....LLL... -LLLLLLLLL.LLL..LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLLLLLL.LLLLL.LLLLLLLL.LL.LLLLLLLLL.L.LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLL -LLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLLLLL.L.LLLLLLLL.LLLLLLLLLLL -LLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL..LLLLLLLL.LLLLLLLLLLLLLLLLLLLL -LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLL.LLLLLLLLL -LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLL.L.LLLLLLLLLLLLLLLLLLLL -...L..L..L..L...L.........L.L.L..LLL.....LL......L..LLL..L.L.......L.L.L..LLL...........L... -LLLLLLLLL.LLLL..LLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLL.LLL.LLLLLLLL.LLLLLLLLLLL -LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLL.L.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.L.LLLLLLLLL -LLLLLLLLL.LLLL.LLL..L.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.L.LLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLLL.LLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL -LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLL.LLLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLL.LLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLL.LLLLLLL.LL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL..LLLLLLLLLLLLLLLLLLL -..L.LLL.....L....L.L.L..L.L..L.L..LL.......L.L.L......L..L..L..L..L.......L...LL..LL..L...LL -LLLLLLLLL.LL.LLLL.LLL.LLLLLLLLLL.LLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL..LLLLLL.L.LLLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLL.LL.LLLLLL.LLLLLL.L.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLLLLLLLLL.LL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL -LLLLLLLLLLLLLL.LLLLLL.L.LLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLL.LLLL..LLLLLLLL.LLLLLLLLLLL -LLLLLLLLLLLLL..LLLLLLLLLLLLLLLL.LLLL.L.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL..LL.LLLLL.LLLLLLLLLLL -LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLL.L -LLLL.LLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLL.LLLL -LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL..LLLLLLLLLLL.LLLLLLLLL.L.LLLLLLLLLLLLLLL.LLLLLLLL..LLLLLLLLLL -LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL -LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL -LLLLLLLLL.LLLLLLL.LLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLL..LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL -L.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLL.LLLLLL..LLLLLLLLLLLLLLLLLL.LLL.LLLLLLL \ No newline at end of file diff --git a/day11/seatingSimulator.spec.ts b/day11/seatingSimulator.spec.ts deleted file mode 100644 index 9031a4c..0000000 --- a/day11/seatingSimulator.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { loadString, isOccupied, Direction } from './seatingSimulator' - -describe('seatingSimulator', () => { - describe('isOccupied', () => { - const world1 = loadString(`.......#. - ...#..... - .#....... - ......... - ..#L....# - ....#.... - ......... - #........ - ...#.....`) - it.each([ - [Direction.E], - [Direction.SE], - [Direction.S], - [Direction.SW], - [Direction.W], - [Direction.NW], - [Direction.N], - [Direction.NE], - ])('should see a seat in direction %s', (direction) => - expect(isOccupied(world1, 4, 3, direction, direction)).toEqual(1), - ) - - it('should only see one seat', () => { - const world2 = loadString( - `............. - .L.L.#.#.#.#. - .............`, - ) - expect(isOccupied(world2, 1, 1, Direction.E, Direction.E)).toEqual(0) - }) - }) -}) diff --git a/day11/seatingSimulator.ts b/day11/seatingSimulator.ts deleted file mode 100644 index f7a7868..0000000 --- a/day11/seatingSimulator.ts +++ /dev/null @@ -1,187 +0,0 @@ -enum Tile { - Empty = 'L', - Occupied = '#', -} -export enum Direction { - N, - NE, - E, - SE, - S, - SW, - W, - NW, - NONE, -} - -/** - * Determines whether a seat is occupied by going in direction dir from the start - * row and col. - * Optionally it will walk down the direction until it finds a seat to evaluate. - */ -export const isOccupied = ( - world: string[][], - row: number, - col: number, - dir = Direction.NONE, - walk = Direction.NONE, -): number => { - switch (dir) { - case Direction.NONE: - if (row < 0) return 0 - if (row >= world.length) return 0 - if (col < 0) return 0 - if (col >= world[row].length) return 0 - if (world[row][col] === Tile.Occupied) return 1 - if (world[row][col] === Tile.Empty) return 0 - switch (walk) { - case Direction.NONE: - return 0 - case Direction.N: - return isOccupied(world, row - 1, col, Direction.NONE, walk) - case Direction.NE: - return isOccupied(world, row - 1, col + 1, Direction.NONE, walk) - case Direction.E: - return isOccupied(world, row, col + 1, Direction.NONE, walk) - case Direction.SE: - return isOccupied(world, row + 1, col + 1, Direction.NONE, walk) - case Direction.S: - return isOccupied(world, row + 1, col, Direction.NONE, walk) - case Direction.SW: - return isOccupied(world, row + 1, col - 1, Direction.NONE, walk) - case Direction.W: - return isOccupied(world, row, col - 1, Direction.NONE, walk) - case Direction.NW: - return isOccupied(world, row - 1, col - 1, Direction.NONE, walk) - default: - console.error(`Unknown direction ${dir}.`) - return 0 - } - case Direction.N: - return isOccupied(world, row - 1, col, Direction.NONE, walk) - case Direction.NE: - return isOccupied(world, row - 1, col + 1, Direction.NONE, walk) - case Direction.E: - return isOccupied(world, row, col + 1, Direction.NONE, walk) - case Direction.SE: - return isOccupied(world, row + 1, col + 1, Direction.NONE, walk) - case Direction.S: - return isOccupied(world, row + 1, col, Direction.NONE, walk) - case Direction.SW: - return isOccupied(world, row + 1, col - 1, Direction.NONE, walk) - case Direction.W: - return isOccupied(world, row, col - 1, Direction.NONE, walk) - case Direction.NW: - return isOccupied(world, row - 1, col - 1, Direction.NONE, walk) - default: - console.error(`Unknown direction ${dir}.`) - return 0 - } -} - -export const render = (world: string[][]): string => - world.map((s) => s.join('')).join('\n') - -/** - * All decisions are based on the number of occupied seats adjacent to a given - * seat (one of the eight positions immediately up, down, left, right, or - * diagonal from the seat). The following rules are applied to every seat - * simultaneously: - * - * - If a seat is empty (L) and there are no occupied seats adjacent to it, - * the seat becomes occupied. - * - If a seat is occupied (#) and four or more seats adjacent to it are also - * occupied, the seat becomes empty. - * - Otherwise, the seat's state does not change. - * - * Floor (.) never changes; seats don't move, and nobody sits on the floor. - */ -export const part1rules = (current: string[][]): string[][] => { - const next = [] - for (let row = 0; row < current.length; row++) { - next[row] = [] as string[] - for (let col = 0; col < current[0].length; col++) { - let occupied = 0 - occupied += isOccupied(current, row, col, Direction.N) - occupied += isOccupied(current, row, col, Direction.NE) - occupied += isOccupied(current, row, col, Direction.E) - occupied += isOccupied(current, row, col, Direction.SE) - occupied += isOccupied(current, row, col, Direction.S) - occupied += isOccupied(current, row, col, Direction.SW) - occupied += isOccupied(current, row, col, Direction.W) - occupied += isOccupied(current, row, col, Direction.NW) - if (current[row][col] === Tile.Empty) { - next[row][col] = occupied === 0 ? Tile.Occupied : current[row][col] - } else if (current[row][col] === Tile.Occupied) { - next[row][col] = occupied >= 4 ? Tile.Empty : current[row][col] - } else { - next[row][col] = current[row][col] - } - } - } - return next -} - -/** - * Same as part one, but instead of considering just the eight immediately - * adjacent seats, consider the first seat in each of those eight directions. - * - * Also, it now takes five or more visible occupied seats for an occupied seat - * to become empty. - */ -export const part2rules = (current: string[][]): string[][] => { - const next = [] - for (let row = 0; row < current.length; row++) { - next[row] = [] as string[] - for (let col = 0; col < current[0].length; col++) { - let occupied = 0 - occupied += isOccupied(current, row, col, Direction.N, Direction.N) - occupied += isOccupied(current, row, col, Direction.NE, Direction.NE) - occupied += isOccupied(current, row, col, Direction.E, Direction.E) - occupied += isOccupied(current, row, col, Direction.SE, Direction.SE) - occupied += isOccupied(current, row, col, Direction.S, Direction.S) - occupied += isOccupied(current, row, col, Direction.SW, Direction.SW) - occupied += isOccupied(current, row, col, Direction.W, Direction.W) - occupied += isOccupied(current, row, col, Direction.NW, Direction.NW) - if (current[row][col] === Tile.Empty) { - next[row][col] = occupied === 0 ? Tile.Occupied : current[row][col] - } else if (current[row][col] === Tile.Occupied) { - next[row][col] = occupied >= 5 ? Tile.Empty : current[row][col] - } else { - next[row][col] = current[row][col] - } - } - } - return next -} - -export const occupied = (world: string[][]): number => - render(world) - .split('') - .filter((s) => s === '#').length - -export const loadString = (world: string): string[][] => - world - .split('\n') - .map((s) => s.trim().split('')) - .filter((s) => s.length > 0) - -/** - * Run until equilibrium is reached - */ -export const seatingSimulator = ( - world: string, - rules: (world: string[][]) => string[][], -): string[][] => { - const start = loadString(world) - - let prevOccupied = -1 - let occ = -1 - let gen = start - do { - prevOccupied = occ - gen = rules(gen) - occ = occupied(gen) - } while (occ != prevOccupied) - return gen -} diff --git a/day11/solution.spec.ts b/day11/solution.spec.ts deleted file mode 100644 index add295a..0000000 --- a/day11/solution.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { loader } from '../lib/loader' -import { occupied, part1rules, part2rules } from './seatingSimulator' -import { seatingSimulator } from './seatingSimulator' - -const load = loader(11) -const sample = ` -L.LL.LL.LL -LLLLLLL.LL -L.L.L..L.. -LLLL.LL.LL -L.LL.LL.LL -L.LLLLL.LL -..L.L..... -LLLLLLLLLL -L.LLLLLL.L -L.LLLLL.LL` - -const input = load('input') - -describe('Day 11: Seating System', () => { - describe('Part 1', () => { - it('should solve the sample', () => { - const stable = seatingSimulator(sample, part1rules) - expect(occupied(stable)).toEqual(37) - }) - it('should solve the sample', () => { - const stable = seatingSimulator(input.join('\n'), part1rules) - expect(occupied(stable)).toEqual(2164) - }) - }) - describe('Part 2', () => { - it('should solve the sample', () => { - const stable = seatingSimulator(sample, part2rules) - expect(occupied(stable)).toEqual(26) - }) - it('should solve the sample', () => { - const stable = seatingSimulator(input.join('\n'), part2rules) - expect(occupied(stable)).toEqual(1974) - }) - }) -}) diff --git a/day12/input.txt b/day12/input.txt deleted file mode 100644 index 5931b41..0000000 --- a/day12/input.txt +++ /dev/null @@ -1,768 +0,0 @@ -S1 -F17 -S3 -F56 -W5 -F11 -N4 -F94 -W4 -S1 -L180 -E2 -F38 -S3 -F46 -L90 -N2 -S3 -W3 -L90 -E1 -L180 -F73 -L90 -E1 -N3 -R90 -S5 -E5 -L90 -W2 -F1 -E5 -R270 -W3 -S4 -W5 -F55 -E2 -L90 -W5 -L90 -E1 -L90 -F9 -W5 -F21 -E4 -F63 -E1 -F48 -N1 -F80 -E5 -L90 -N1 -E1 -S4 -R180 -F48 -F87 -N5 -W2 -F90 -S4 -E5 -F76 -F37 -R180 -E5 -F51 -S3 -R90 -F79 -F25 -L90 -W1 -F100 -S2 -E3 -L90 -N1 -W4 -F41 -S5 -L90 -W5 -L90 -W2 -S4 -W3 -F75 -L90 -F20 -E5 -N5 -R90 -F99 -N4 -N1 -L90 -N5 -N2 -E2 -S4 -F29 -L180 -N1 -W3 -L90 -W3 -L180 -F84 -F25 -E1 -S3 -R90 -F64 -L90 -E1 -F40 -N3 -R90 -N3 -F67 -F37 -L90 -F17 -E4 -F87 -N3 -W5 -S2 -R90 -E4 -N1 -W4 -F75 -E2 -F18 -R90 -F6 -S4 -F13 -E1 -L270 -F50 -W2 -R90 -W4 -S5 -R90 -F14 -L180 -N5 -L180 -F78 -E1 -S3 -R90 -E2 -R270 -E4 -S1 -L90 -L180 -F91 -W3 -W5 -F45 -N4 -F44 -L90 -N3 -L90 -S2 -L90 -F76 -W3 -R90 -F3 -W3 -F24 -L90 -F83 -W2 -F19 -S4 -L90 -N4 -E5 -L180 -N5 -W5 -F67 -S3 -R90 -E4 -F51 -L90 -E5 -L90 -F79 -E2 -N2 -W4 -E2 -L90 -F41 -E4 -N2 -L90 -N2 -L90 -N3 -F51 -F79 -N2 -W2 -N5 -W4 -F60 -N3 -R90 -W4 -S1 -F59 -W1 -F3 -N5 -L180 -N5 -F23 -N4 -E3 -R90 -F14 -W4 -F86 -L90 -N2 -S1 -W3 -R90 -N1 -F25 -L90 -F22 -E5 -F88 -L270 -F14 -N5 -F32 -N1 -F98 -S1 -W2 -E5 -L180 -E4 -S2 -F46 -L180 -W4 -F87 -E2 -F83 -R90 -S5 -F68 -E5 -F95 -N1 -F43 -E2 -F64 -S3 -F5 -S1 -W3 -L90 -E4 -L90 -F63 -S3 -F44 -N4 -R90 -F95 -S5 -W1 -N4 -W4 -F87 -W3 -N3 -L180 -W4 -R180 -N2 -E2 -N2 -L90 -W5 -R90 -W1 -F22 -L180 -N4 -W1 -S1 -R90 -N3 -R180 -S5 -W4 -R90 -E3 -S1 -E3 -N1 -L270 -F96 -E2 -N1 -F98 -W4 -L90 -W1 -W4 -R90 -W2 -S3 -F64 -S3 -F67 -N2 -R180 -S5 -F13 -N4 -F53 -W1 -N1 -L90 -F54 -S1 -E2 -F28 -R90 -W3 -L90 -E3 -N4 -F34 -R90 -F51 -L90 -F24 -R180 -W4 -N2 -F88 -F78 -S2 -E1 -N2 -L180 -F58 -E4 -R90 -N4 -L90 -N5 -R180 -N5 -R270 -W3 -F41 -S4 -F61 -R90 -F71 -S1 -F9 -R90 -F47 -W2 -N4 -L180 -W5 -F52 -L90 -N4 -F11 -W3 -L90 -W5 -N4 -F10 -S1 -F75 -S5 -L90 -S2 -F28 -L90 -F80 -E3 -R180 -E4 -F42 -E4 -F85 -N1 -W4 -R90 -E2 -F38 -R90 -F77 -F95 -L90 -S5 -F86 -R90 -N1 -E2 -R90 -N3 -F28 -R180 -N5 -F25 -E3 -F52 -N4 -E3 -N4 -E3 -F37 -L180 -N1 -E2 -L180 -E5 -F82 -N4 -F100 -N3 -E3 -L90 -W3 -S1 -R270 -E5 -W5 -R90 -F44 -F15 -R180 -S3 -L90 -E4 -F44 -R90 -N1 -E4 -N4 -F62 -R90 -S4 -L180 -S1 -F13 -E3 -F70 -L270 -F52 -L270 -F80 -L90 -F89 -N4 -F79 -W5 -F55 -R90 -F62 -E4 -F91 -R180 -E2 -F74 -R90 -F18 -L90 -E3 -N5 -E2 -R90 -W2 -R180 -N3 -F69 -W3 -R90 -F92 -E2 -F48 -N2 -L90 -S3 -F49 -E3 -L180 -F6 -R90 -S5 -F58 -F67 -E5 -S2 -L90 -W5 -F3 -S1 -F73 -W1 -E4 -R180 -N3 -E2 -F72 -L90 -S1 -F31 -W1 -F44 -L180 -F100 -W3 -N1 -W5 -L90 -S2 -N3 -R90 -W4 -S5 -F62 -E5 -F55 -L180 -W2 -L90 -E1 -F45 -S3 -W2 -F49 -N4 -L90 -E3 -N2 -R180 -E5 -N1 -N5 -E5 -R90 -W3 -F73 -E3 -F66 -L90 -S2 -E3 -F100 -S3 -W2 -S4 -W5 -R180 -E4 -S3 -S1 -W2 -R90 -F22 -R90 -F76 -L270 -S5 -F95 -L90 -N3 -F16 -R270 -S3 -N5 -F66 -R90 -F63 -W5 -F37 -N2 -L90 -W1 -F68 -R90 -F98 -E4 -S3 -R90 -E2 -S1 -F91 -E1 -F42 -E1 -F13 -S4 -F10 -R180 -E4 -R90 -N2 -W4 -L180 -N5 -R90 -N3 -F26 -R90 -F42 -L180 -E5 -S3 -L90 -S3 -E3 -F79 -R270 -E4 -F54 -N5 -W3 -F16 -W1 -S3 -R90 -F100 -S1 -W3 -N2 -E1 -S4 -F1 -R180 -F66 -W2 -R90 -W2 -F27 -E2 -F16 -R90 -S3 -F61 -E1 -F4 -L90 -N5 -F45 -L90 -N1 -L90 -F50 -W1 -R90 -N1 -F44 -S2 -F53 -S5 -F59 -E4 -S3 -E2 -N5 -E2 -L90 -E4 -L90 -N1 -L90 -N5 -F31 -R180 -N2 -F18 -E2 -F27 -L90 -F57 -R90 -F40 -R180 -E2 -F94 -S3 -E2 -S4 -E4 -R90 -L90 -E5 -N5 -E1 -N3 -F97 -S3 -F16 -E3 -W5 -F80 -S1 -W2 -S4 -F18 -N4 -E5 -R90 -N1 -F43 -N4 -E4 -N1 -E2 -W1 -F99 -W4 -F79 -F20 -E3 -F63 -W4 -F21 -E1 -F82 -E3 -R90 -F8 -N5 -W2 -L180 -W5 -F13 -S2 -L90 -N3 -R180 -N4 -F9 -L90 -F39 \ No newline at end of file diff --git a/day12/navigate.ts b/day12/navigate.ts deleted file mode 100644 index f0f7ee8..0000000 --- a/day12/navigate.ts +++ /dev/null @@ -1,159 +0,0 @@ -export enum Direction { - N, - E, - S, - W, -} -type Position = { x: number; y: number } - -const instructionRx = /^(?N|S|E|W|L|R|F)(?[0-9]+)$/ - -/** - * Translates the heading to a direction - * - * Note: Turn instructions are only given in 90 degree steps. - */ -const headingToDirection = (headingInDegrees: number): Direction => { - switch (headingInDegrees % 360) { - case 0: - return Direction.N - case 90: - case -270: - return Direction.E - case -90: - case 270: - return Direction.W - case 180: - case -180: - return Direction.S - default: - console.warn(`Unknown heading: ${headingInDegrees % 360}`) - return Direction.N - } -} - -/** - * Move the given position in the given direction. - * pos is modified in place. - */ -const move = (pos: Position) => (dir: Direction, n: number) => { - switch (dir) { - case Direction.N: - pos.y -= n - break - case Direction.S: - pos.y += n - break - case Direction.E: - pos.x += n - break - case Direction.W: - pos.x -= n - break - } -} - -/** - * Convert degrees to radians - */ -const degreesToRadians = (deg: number): number => (deg * Math.PI) / 180 - -/** - * Rotate the given position for the given angle around 0,0 - * pos is modified in place. - */ -const rotate = (pos: Position) => (angleInDegrees: number) => { - const s = Math.sin(degreesToRadians(angleInDegrees)) - const c = Math.cos(degreesToRadians(angleInDegrees)) - - const newX = pos.x * c - pos.y * s - const newY = pos.x * s + pos.y * c - - pos.x = Math.round(newX) - pos.y = Math.round(newY) -} - -/** - * Implements the relative navigation where instructions are applied relative - * to the waypoint - */ -export const navigateRelative = ( - instructions: string[], - waypoint: Position, -): Position => { - const shipPosition = { x: 0, y: 0 } - navigate({ - instructions, - moveTo: move(waypoint), - changeDir: rotate(waypoint), - forward: (n: number) => { - shipPosition.x += waypoint.x * n - shipPosition.y += waypoint.y * n - }, - }) - return shipPosition -} - -/** - * Implements the absolute navigation where instructions are applied to the ship - */ -export const navigateAbsolute = ( - instructions: string[], - shipHeading = 90, -): Position => { - const shipPosition = { x: 0, y: 0 } - const moveShip = move(shipPosition) - navigate({ - instructions, - forward: (n: number) => moveShip(headingToDirection(shipHeading), n), - moveTo: moveShip, - changeDir: (n: number) => { - shipHeading += n - }, - }) - return shipPosition -} - -const navigate = ({ - instructions, - moveTo, - changeDir, - forward, -}: { - instructions: string[] - moveTo: (dir: Direction, amount: number) => void - changeDir: (amount: number) => void - forward: (amount: number) => void -}): void => { - instructions.forEach((s) => { - const m = instructionRx.exec(s) - if (m === null) { - console.warn(`Invalid instruction: ${s}!`) - } - const { dir, amount } = m?.groups as any - const n = parseInt(amount, 10) - switch (dir) { - case 'N': - moveTo(Direction.N, n) - break - case 'S': - moveTo(Direction.S, n) - break - case 'E': - moveTo(Direction.E, n) - break - case 'W': - moveTo(Direction.W, n) - break - case 'L': - changeDir(-n) - break - case 'R': - changeDir(n) - break - case 'F': - forward(n) - break - } - }) -} diff --git a/day12/solution.spec.ts b/day12/solution.spec.ts deleted file mode 100644 index 4e6401c..0000000 --- a/day12/solution.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { loader, loadString } from '../lib/loader' -import { navigateAbsolute, navigateRelative } from './navigate' - -const load = loader(12) -const sample = loadString( - `F10 - N3 - F7 - R90 - F11`, -) -const input = load('input') - -const manhatten = ( - { x: x1, y: y1 }: { x: number; y: number }, - { x: x2, y: y2 } = { x: 0, y: 0 }, -): number => Math.abs(x1 - x2) + Math.abs(y1 - y2) - -describe('Day 12: Rain Risk', () => { - describe('Part 1', () => { - it('should solve the sample', () => { - const pos = navigateAbsolute(sample, 90) - expect(manhatten(pos)).toEqual(25) - }) - it('should solve', () => { - const pos = navigateAbsolute(input, 90) - expect(manhatten(pos)).toEqual(441) - }) - }) - describe('Part 2', () => { - it('should solve the sample', () => { - const pos = navigateRelative(sample, { x: 10, y: -1 }) - expect(manhatten(pos)).toEqual(286) - }) - it('should solve', () => { - const pos = navigateRelative(input, { x: 10, y: -1 }) - expect(manhatten(pos)).toEqual(40014) - }) - }) -}) diff --git a/day13/findShuttle.ts b/day13/findShuttle.ts deleted file mode 100644 index acdf43e..0000000 --- a/day13/findShuttle.ts +++ /dev/null @@ -1,30 +0,0 @@ -export const findShuttle = ( - notes: string[], -): { bus: number; waitTime: number } => { - // Read arrival time from notes - const arrivaleTime = parseInt(notes[0], 10) - // Read bus linses from notes - const buslines = notes[1] - .split(',') - .filter((s) => s !== 'x') - .map((s) => parseInt(s, 10)) - - // Calculate the next time of each bus arriving that is after the arrival time - const schedulAfterArrival = buslines.reduce( - (schedule, line) => ({ - ...schedule, - [line]: Math.ceil(arrivaleTime / line) * line, - }), - {} as Record, - ) - - // Sort by closes arrivale time and pick the bus that arrives first - const [bus, waitTime] = Object.entries(schedulAfterArrival).sort( - ([, timeA], [, timeB]) => timeA - timeB, - )[0] - - return { - waitTime: waitTime - arrivaleTime, - bus: parseInt(bus, 10), - } -} diff --git a/day13/findTime.ts b/day13/findTime.ts deleted file mode 100644 index ca8754c..0000000 --- a/day13/findTime.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Find the time required by multiplying each bus with the time of the - * previous' bus iterations needed to arrive on the correct time - */ -export const findTime = (times: string): number => { - const slots = times.split(',').reduce((slots, k, n) => { - if (k === 'x') return slots - return [...slots, [parseInt(k, 10), n]] - }, [] as number[][]) - - let time = 0 - // start with the first bus' timeslot - let inc = slots[0][0] - // now go over all other buses - for (let bus = 1; bus < slots.length; bus++) { - // increment time until the next bus arrives at the desired time - while ((time + slots[bus][1]) % slots[bus][0] != 0) { - time += inc - } - // the next bus needs it's time multiplied by all previous busses - inc *= slots[bus][0] - } - return time -} diff --git a/day13/solution.spec.ts b/day13/solution.spec.ts deleted file mode 100644 index 5c3f33b..0000000 --- a/day13/solution.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { loadString } from '../lib/loader' -import { findShuttle } from './findShuttle' -import { findTime } from './findTime' - -const sample = `939 -7,13,x,x,59,x,31,19` -const input = `1003240 -19,x,x,x,x,x,x,x,x,41,x,x,x,37,x,x,x,x,x,787,x,x,x,x,x,x,x,x,x,x,x,x,13,x,x,x,x,x,x,x,x,x,23,x,x,x,x,x,29,x,571,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,17` - -describe('Day 13: Shuttle Search', () => { - describe('Part 1', () => { - it('should solve the sample', () => { - const { bus, waitTime } = findShuttle(loadString(sample)) - expect(bus * waitTime).toEqual(295) - }) - it('should solve', () => { - const { bus, waitTime } = findShuttle(loadString(input)) - expect(bus * waitTime).toEqual(3997) - }) - }) - describe('Part 2', () => { - it('should solve the sample', () => - expect(findTime(loadString(sample)[1])).toEqual(1068781)) - it('should solve', () => - expect(findTime(loadString(input)[1])).toEqual(500033211739354)) - }) -}) diff --git a/day14/input.txt b/day14/input.txt deleted file mode 100644 index b9ca38f..0000000 --- a/day14/input.txt +++ /dev/null @@ -1,578 +0,0 @@ -mask = 1101000X0110100X1X1X00001010XX00X0X0 -mem[48482] = 6450058 -mem[5309] = 2219920 -mem[27274] = 43286042 -mem[40233] = 504849 -mask = 1X1101XX1110X000101100XX001X000100X1 -mem[40763] = 53122377 -mem[24930] = 244 -mem[60497] = 16546 -mem[60898] = 654 -mask = 1011100X10111XX0011XX010001X1XX0X100 -mem[35453] = 378 -mem[445] = 17680 -mem[19816] = 1045213 -mem[496] = 222512 -mask = X00100X100100011001011000X0X0110000X -mem[25953] = 120906 -mem[42177] = 14177504 -mem[12302] = 31911950 -mem[33869] = 46903 -mask = 10011X1111100X1110001X0000110000XX01 -mem[43400] = 15586 -mem[5165] = 24662 -mem[3053] = 496403 -mask = 10110110X1X0011XX0110010X11011X0010X -mem[23273] = 359 -mem[8290] = 1906218 -mem[4777] = 33822 -mem[24904] = 92027 -mem[55979] = 348 -mask = X0X1100010X1XX010X0000X00001XX100000 -mem[63411] = 198864361 -mem[2323] = 12235447 -mem[53128] = 3559 -mem[37957] = 978071 -mem[12837] = 57030 -mem[18230] = 7330 -mask = 11X100X111X0001101X01101X11XX0110001 -mem[20551] = 95829554 -mem[52592] = 3255 -mem[14690] = 66824 -mem[53729] = 16600 -mem[14246] = 48015 -mem[49654] = 13036614 -mem[12199] = 78275448 -mask = 100XX00100X0X011001X1010010110X00X11 -mem[11978] = 57478 -mem[23642] = 1593 -mem[26097] = 6120 -mem[54294] = 1426 -mem[25730] = 2662370 -mem[48051] = 283445930 -mask = 0X01111X111X00X11010000010XX001X000X -mem[48807] = 1811127 -mem[54732] = 130682 -mem[14556] = 127239 -mem[8434] = 329378888 -mem[65311] = 30415 -mem[38753] = 129645 -mask = 1101X1X11110X011X0X000XXX00010000110 -mem[58126] = 5447027 -mem[61916] = 262525830 -mem[29247] = 53096 -mask = X010011001100001101111001000X0X0X000 -mem[27274] = 20355 -mem[24280] = 94406194 -mem[46969] = 32599 -mask = 10110110111XXXXX1011X11X111010101XX1 -mem[13208] = 1476 -mem[17525] = 174267 -mem[40650] = 47095 -mem[6880] = 23668444 -mem[18597] = 210524 -mem[61423] = 11469 -mem[28797] = 72808658 -mask = 1101X11X11X001111X101XX001X100X00000 -mem[10402] = 382156 -mem[11615] = 91849 -mem[55387] = 38274 -mem[41608] = 99166858 -mask = 10XXXX1X111000X1101X0X10110010101010 -mem[64410] = 16272 -mem[53605] = 39 -mem[43920] = 231262355 -mem[24494] = 101085 -mem[2266] = 7434 -mem[6405] = 490 -mem[20768] = 56259 -mask = 1101111X11100X11100001X00X00100000X1 -mem[12148] = 1542 -mem[14674] = 32572259 -mem[13208] = 1048025 -mem[10573] = 2522 -mem[25144] = 65748456 -mask = 1X0X1X01X11000XX0X10101100X111X01000 -mem[216] = 3249 -mem[61137] = 125226363 -mem[20373] = 8025 -mem[10889] = 447307190 -mask = 1X01111111100X1110X00110XX1110XX1X0X -mem[43138] = 1515 -mem[59301] = 99565475 -mem[24915] = 103737871 -mem[20768] = 514918 -mem[11898] = 685393 -mem[36252] = 2583474 -mem[5165] = 129314 -mask = 1011100011X1X00XX1X00X1XX01X01111011 -mem[34243] = 6266385 -mem[32449] = 3199 -mem[37594] = 12713 -mem[33859] = 85810 -mem[61637] = 4581168 -mem[40941] = 2511 -mask = 10011XX1XX1X0X011X0100110011110X0000 -mem[11494] = 359697 -mem[45551] = 128326843 -mem[12702] = 427072 -mask = 1X01X0X111100X110010001X001111X000X0 -mem[19264] = 1388 -mem[14556] = 2634 -mem[56860] = 913 -mem[46144] = 410717 -mem[26110] = 286330629 -mem[13224] = 70224078 -mem[51706] = 1781457 -mask = 11X10011111X0X11X0X00XX100XX01000011 -mem[1827] = 352974 -mem[53395] = 1253519 -mem[5593] = 204616 -mem[24059] = 9680329 -mem[51280] = 893 -mem[18437] = 1179 -mask = 10110X101110X001001111X01X1110011000 -mem[27171] = 219265 -mem[47619] = 677 -mem[36434] = 924 -mem[10402] = 23151360 -mask = 1001X1111110001X10000X0X001110101101 -mem[19629] = 665 -mem[52439] = 250 -mem[8361] = 28482 -mask = 101110X110X0X0100110X0110X1010011X11 -mem[20558] = 558 -mem[26949] = 7777 -mem[22160] = 171308 -mem[15631] = 328260 -mem[45856] = 230942 -mask = 110100111100001X101X010000110X0X0010 -mem[30840] = 683 -mem[41251] = 652 -mem[10584] = 103692712 -mem[5860] = 3950330 -mem[61507] = 647961 -mem[43181] = 13247 -mask = X0110110X11011X01011X10001X010111X00 -mem[19238] = 39433935 -mem[19155] = 2409 -mem[16137] = 5550 -mask = 101X1XX0111XX01110100010X00110X01100 -mem[43920] = 947024008 -mem[2335] = 2498 -mem[15363] = 65058906 -mask = 110100X1X11X0011001X01X1000001010000 -mem[31189] = 13626 -mem[41212] = 161 -mem[53454] = 12060062 -mem[47394] = 8828 -mask = 1011X0X011100011X01X0X101000X1110010 -mem[64452] = 5096 -mem[4245] = 745302 -mem[46144] = 3353 -mem[25610] = 1258 -mask = 0101001XX110001101X00X10X1X001010X01 -mem[1677] = 23846073 -mem[50713] = 1754903 -mem[34243] = 619756 -mask = X10110111X1101110010001111111X0X001X -mem[20746] = 11327 -mem[60677] = 55286634 -mem[18904] = 33122 -mem[42335] = 4994 -mask = X101100X1X10001X0X100011X011X0X01001 -mem[32832] = 20230 -mem[54205] = 1405755 -mem[27010] = 1483 -mem[25730] = 416967 -mask = 11110X11111X0X11000001X11XX0X0X00101 -mem[20547] = 993 -mem[32667] = 3520 -mask = 11010XXX011XX000101X1X0011X000001001 -mem[24634] = 245639 -mem[59394] = 184364 -mem[60948] = 20401794 -mem[9342] = 60279080 -mem[17142] = 10401929 -mem[40232] = 3268 -mask = XX011111111000X110XX00101X1X10100000 -mem[6405] = 2064 -mem[31624] = 208587070 -mem[2258] = 3965844 -mem[14742] = 6124264 -mem[2985] = 1824 -mem[4950] = 3019502 -mem[8036] = 157 -mask = 1X01001X11X00011X01001X01011XX01101X -mem[41340] = 163017 -mem[46907] = 1047 -mem[2512] = 1340 -mem[33913] = 20303 -mem[58546] = 153629023 -mem[19536] = 109607 -mask = X01X0X10X1100001X01110101X0X1X00101X -mem[25394] = 131964 -mem[18030] = 99092 -mem[19264] = 12572 -mask = X011X0X110101010011000X00010XX111000 -mem[12088] = 165 -mem[46867] = 6359415 -mem[52891] = 29571 -mem[37957] = 1880 -mem[38886] = 32297 -mem[47674] = 40454 -mask = 1010XX1011100011X01000X1X0111X011010 -mem[62632] = 184293833 -mem[43181] = 6802 -mem[29534] = 17997 -mem[55058] = 527832513 -mem[17560] = 876465884 -mem[33007] = 195444229 -mask = 111100X11X100X11X0100100X0X0X1000000 -mem[22371] = 620962 -mem[27171] = 13951 -mem[23941] = 285120 -mem[53371] = 2727 -mask = 101110011X111011X1000000X101X1X01X00 -mem[57437] = 4447669 -mem[62084] = 14810 -mem[20380] = 2 -mask = X01X100X10X11001X00001X00001X0001111 -mem[10604] = 29217 -mem[40103] = 20019 -mem[5593] = 1282 -mask = XX0100111X100011011X100XX11101X10111 -mem[29655] = 188308404 -mem[16108] = 987052 -mem[27684] = 1845758 -mem[8627] = 30072056 -mem[24904] = 28977792 -mem[24100] = 11388269 -mask = 11X1100XX01X001101100111110000100011 -mem[9003] = 63644817 -mem[23905] = 249772171 -mem[41608] = 566869 -mask = X001X0011110X011X0101X10001010000X1X -mem[19837] = 1474559 -mem[6082] = 213612431 -mem[25394] = 746122 -mask = 101110X1111X101X01100000100101111X10 -mem[41906] = 2538917 -mem[43592] = 738 -mem[38721] = 69444 -mem[24036] = 6469 -mask = 0011100010X111X100001001XX000X000101 -mem[32354] = 709541 -mem[18383] = 3835385 -mem[1313] = 1178709 -mem[30236] = 6347401 -mask = 11011X001X10X0X1X0000100001010000000 -mem[64686] = 4029603 -mem[37187] = 269 -mem[41728] = 15291311 -mem[703] = 176262655 -mem[23732] = 473740 -mem[4238] = 2073061 -mask = 1101011111101X1X0010110X0XX110001X10 -mem[24443] = 487215 -mem[44567] = 898248 -mem[41636] = 11946 -mem[21254] = 1162908 -mask = X01110X11X1X101X01100X0000X01011X101 -mem[41555] = 13384162 -mem[51011] = 12307 -mem[54861] = 435 -mem[61876] = 10233 -mem[3849] = 14042 -mem[25473] = 273 -mem[10402] = 17072 -mask = 100100101110XX110X100110X010000XXXX1 -mem[13744] = 663718668 -mem[18696] = 361798 -mem[21207] = 851454 -mem[21194] = 21025 -mask = 1XX101XXX11X000X10111110111000X1X001 -mem[48482] = 107005 -mem[26156] = 15617 -mem[49747] = 65227757 -mem[52440] = 112190 -mem[36683] = 26159 -mem[19486] = 3181 -mask = X011X0X01XX1000101XX0010X11001110010 -mem[4510] = 7353062 -mem[10923] = 25067923 -mem[16714] = 173017 -mem[41162] = 12385087 -mem[25346] = 1388660 -mask = X10110011110001100101111001X000X1X01 -mem[27395] = 52406 -mem[63935] = 70016372 -mem[61748] = 1598 -mask = 1101101XX111011X001X00001111100X0111 -mem[2512] = 629921058 -mem[48026] = 247446319 -mem[48328] = 2018 -mem[9614] = 49871 -mem[25296] = 53536568 -mask = 10X110X0101X10011X00X010001XX0101011 -mem[62912] = 108898 -mem[22160] = 5738253 -mem[37655] = 5684656 -mem[292] = 103716917 -mem[40727] = 6480899 -mem[43121] = 2495962 -mem[8256] = 9752 -mask = 111X011111100000XX110110110X1X0X10X0 -mem[42306] = 3814 -mem[22173] = 104438687 -mem[60145] = 51698 -mem[44805] = 14155 -mem[23905] = 15867565 -mask = 1X01111X1X1001X110X000XX0000X0000010 -mem[7284] = 513301 -mem[14240] = 9298 -mem[9803] = 254768 -mem[36226] = 722 -mask = 10110111X1101000X011101001X10010101X -mem[19105] = 1399632 -mem[40477] = 14030402 -mem[9180] = 258090132 -mem[2864] = 1722022 -mem[6880] = 31 -mask = 1011100X1X11X001X100X0100X100X1X0X10 -mem[3335] = 303249475 -mem[33869] = 89890 -mem[40724] = 3168 -mem[44588] = 3236692 -mem[43374] = 875137580 -mem[39986] = 327100054 -mem[16676] = 47668 -mask = 1011X00110111100011XX00X00X11111X001 -mem[46881] = 2251035 -mem[31188] = 860796 -mem[15313] = 88528 -mem[33666] = 645 -mem[9205] = 45363830 -mem[57565] = 604 -mem[13224] = 1342 -mask = 10X10X101X10011X101100X101X01X001000 -mem[25292] = 3155 -mem[18230] = 27276287 -mem[16051] = 270672 -mask = 1XX10001101X0011011011000101X11X0011 -mem[46144] = 8381238 -mem[22497] = 2356142 -mem[8433] = 70526 -mem[44424] = 8986 -mem[18442] = 508814 -mask = 101110011X1110X10XX000000X01X1X111XX -mem[20373] = 1622495 -mem[44697] = 127381 -mem[20688] = 4500 -mem[16805] = 923777 -mem[32947] = 8080048 -mask = 0001X101XX10011110000X00000110X00000 -mem[31189] = 51277 -mem[1279] = 7010 -mem[40666] = 1361051 -mem[20337] = 6622 -mem[44409] = 245840 -mem[2587] = 231888105 -mask = 100X00111011XXXXX0X0100111X000010110 -mem[38644] = 122518 -mem[14690] = 853513 -mem[27280] = 499865495 -mask = 1XX1001011110110X011111011101XX0X100 -mem[5253] = 104635924 -mem[9220] = 469551991 -mem[54123] = 603 -mask = 1X01111111100X11101001X110X110100101 -mem[28857] = 4958 -mem[26793] = 43481 -mem[26110] = 2002 -mem[13670] = 737550271 -mem[48748] = 2175 -mem[15379] = 956329 -mask = X001111X101X01111010000100100000100X -mem[5038] = 1896 -mem[1219] = 1590 -mem[2335] = 6839 -mem[44175] = 3246581 -mem[10128] = 861384 -mask = 10X100X1001X0X11011010100100X11000X1 -mem[25953] = 500230911 -mem[56860] = 3606219 -mem[3909] = 4193582 -mem[20077] = 13280564 -mem[42329] = 2622 -mem[19629] = 2920217 -mask = 1000X0111XX1XX11001000011X10110X0110 -mem[65286] = 10087505 -mem[39772] = 5587787 -mem[49314] = 25559 -mem[27912] = 135405924 -mem[46907] = 7910 -mem[36657] = 1549461 -mem[37088] = 74 -mask = 1101001XXX100X1100X0000010110010110X -mem[26128] = 3098182 -mem[19238] = 6294862 -mem[35146] = 4761321 -mem[13782] = 407506 -mem[57435] = 1986 -mem[56396] = 1173362 -mask = 10X110011X11100X01101010X0X0X0010101 -mem[26478] = 5717 -mem[7980] = 895287 -mem[26719] = 254026 -mem[58541] = 444 -mem[43236] = 1222225 -mask = 10101010111100XX101000010X01X0101101 -mem[19246] = 1542 -mem[30987] = 1317750 -mem[15786] = 214473235 -mem[33835] = 989447 -mem[49063] = 63501903 -mem[50294] = 351534 -mem[4146] = 12924485 -mask = 1101100X11X00X1100X00X1X00011000X00X -mem[49673] = 11520693 -mem[8936] = 422236363 -mem[22275] = 116474 -mask = 101110011X11X011000X0XX00X000X011X01 -mem[44344] = 518186197 -mem[20820] = 2429569 -mem[25541] = 30403114 -mask = 1X0X1011111X0111X0100111001111X00X10 -mem[47674] = 15040841 -mem[54205] = 9684 -mem[52058] = 38432 -mem[20458] = 522505115 -mem[16470] = 96407696 -mask = 101110001011X0010100X01011X0001000X0 -mem[2903] = 9215 -mem[24100] = 10412 -mem[65308] = 3449 -mask = 11110100011X00001011011X111101XX0001 -mem[1383] = 20524 -mem[43138] = 1853 -mem[53] = 13474143 -mem[53737] = 139742 -mem[36626] = 111978547 -mem[6473] = 296847 -mask = X00100X11010X01X011001XX101011001X00 -mem[14690] = 2176 -mem[49976] = 138885734 -mem[63369] = 58 -mem[24904] = 127774567 -mem[45788] = 935 -mem[15363] = 3333 -mask = 100100111X100011001X1011010111000XX0 -mem[44478] = 18487 -mem[25541] = 10395 -mem[2258] = 208737 -mem[33632] = 355267 -mask = 1X01001X1XX00111011000101XX10X01X100 -mem[46117] = 129267954 -mem[18953] = 496 -mem[3156] = 23246 -mem[22307] = 471295 -mem[56163] = 6733185 -mem[1324] = 2074915 -mask = 1X0100X1XX1000110X1001100001X10XX0X0 -mem[33913] = 191232 -mem[11074] = 586 -mem[6405] = 52666 -mask = X10X10X01110001X0110X011100100XX1001 -mem[2512] = 177970 -mem[58654] = 2392973 -mem[4166] = 3276 -mem[39753] = 1233 -mem[61980] = 474314617 -mem[37355] = 58269 -mask = X011100X1111X01100101000000X00110X1X -mem[33118] = 5010 -mem[4760] = 111160 -mem[37689] = 823166 -mem[15678] = 1634 -mask = XX0101X111100111100000X0X0X0110X1XX1 -mem[17229] = 4665 -mem[22930] = 1040260 -mem[1324] = 260 -mem[31615] = 5434357 -mem[545] = 215622 -mask = 10110111X11X000110X10100110X0XX01110 -mem[44567] = 220705 -mem[53112] = 1089 -mask = X0010X101X1X11110X1X0110X0X1X0000000 -mem[7] = 1698581 -mem[53112] = 112679 -mem[63935] = 6201 -mask = 1010011011X1111X1011001000X010001X1X -mem[27421] = 22548 -mem[20688] = 29314044 -mem[35943] = 66340108 -mem[17023] = 115252 -mem[47844] = 1957 -mem[20801] = 243380907 -mem[58453] = 1786 -mask = 10X11110X0XX0101X01010101101000X001X -mem[56724] = 25322561 -mem[23838] = 128622093 -mem[14602] = 1871 -mem[9600] = 482868337 -mem[13919] = 427123809 -mask = 110100010110X011X11X11X001XX1X100010 -mem[26083] = 962249 -mem[48067] = 107 -mem[6405] = 979668 -mask = 10110X10111X0110101X010X110010X0000X -mem[27181] = 581 -mem[1935] = 1700145 -mem[31816] = 7821892 -mem[62084] = 16529134 -mem[63391] = 3109 -mem[64545] = 30527 -mask = X101X11X11100111100XX0000X0X101X1001 -mem[8381] = 33407838 -mem[40566] = 15796331 -mem[18597] = 68546 -mem[25473] = 7358888 -mem[41562] = 4109 -mem[8797] = 4761 -mask = 1101001111100011X110X0010001X1X10001 -mem[48089] = 50505 -mem[8627] = 111289788 -mem[49063] = 7497 -mask = 10X1X011XX10X01X0110110X0X0101100011 -mem[6133] = 237 -mem[65302] = 776 -mem[24930] = 240012 -mem[49747] = 1455 -mem[25610] = 77345999 -mem[65463] = 830 -mem[18804] = 409066 -mask = 10X11001111X1001000X01XX11111101XX11 -mem[52439] = 54286 -mem[27158] = 334127093 -mem[50444] = 1667 -mem[1037] = 9375588 -mem[15887] = 95826 -mem[18383] = 4398280 -mask = XX01101111X101110X1X1X010101100001X0 -mem[38753] = 1944309 -mem[56903] = 103577 -mem[52840] = 85 -mem[47810] = 954770 -mem[31815] = 1660528 -mask = 101X011X1X11111110110000001010000X11 -mem[59096] = 180976584 -mem[64686] = 16261 -mem[31497] = 671389398 -mem[23216] = 4065503 -mem[55058] = 1248965 -mem[56396] = 3400500 -mask = 1X011011111001X1X01X000X10X1001X1010 -mem[20173] = 4586 -mem[61916] = 424482839 -mem[63391] = 6915265 \ No newline at end of file diff --git a/day14/run.ts b/day14/run.ts deleted file mode 100644 index 397c451..0000000 --- a/day14/run.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Returns the value with the given mask applied - */ -const mask = (value: number, mask: string): number => { - // Convert to 36 bit long binary string - const valueAsBinary = [...value.toString(2).padStart(36, '0')] - for (let i = 0; i < 36; i++) { - const maskVal = mask[mask.length - i - 1] - if (maskVal !== 'X') { - // Overwrite value bit with mask bit - valueAsBinary[valueAsBinary.length - i - 1] = maskVal - } - } - return parseInt(valueAsBinary.join(''), 2) -} - -export const run = (program: string[]): Record => - program.reduce( - (context, instruction) => { - const [cmd, value] = instruction.split(' = ') - if (cmd === 'mask') { - context.mask = value - } else { - const addr = parseInt(/mem\[([0-9]+)\]/.exec(cmd)?.[1] as string, 10) - const v = parseInt(value, 10) - context.memory[addr] = mask(v, context.mask) - } - return context - }, - { - memory: {} as Record, - mask: 'X'.repeat(36), - }, - ).memory diff --git a/day14/solution.spec.ts b/day14/solution.spec.ts deleted file mode 100644 index c569f89..0000000 --- a/day14/solution.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { loader, loadString } from '../lib/loader' -import { run } from './run' - -const sample = `mask = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X -mem[8] = 11 -mem[7] = 101 -mem[8] = 0` - -const load = loader(14) -const input = load('input') - -describe('Day 14: Docking Data', () => { - describe('Part 1', () => { - it('should solve the sample', () => { - const mem = run(loadString(sample)) - expect(mem[8] + mem[7]).toEqual(165) - }) - it('should solve the sample', () => { - const mem = run(input) - expect(Object.values(mem).reduce((sum, v) => v + sum, 0)).toEqual( - 15403588588538, - ) - }) - }) -}) diff --git a/day15/memoryGame.ts b/day15/memoryGame.ts deleted file mode 100644 index 0f8b3dd..0000000 --- a/day15/memoryGame.ts +++ /dev/null @@ -1,28 +0,0 @@ -export const memoryGame = (numbers: number[], iterations: number): number => { - const spokenTurn = {} as Record - let speak - let lastSpoken - for (let turn = 0; turn < iterations; turn++) { - // Carry over what was said in the last turn - lastSpoken = speak - // They begin by taking turns reading from a list of starting numbers - if (turn < numbers.length) { - speak = numbers[turn] - } else { - // Now, consider the last number spoken - const lastSpokenTurn = spokenTurn[lastSpoken as number] as - | number - | undefined - if (lastSpokenTurn === undefined) { - // If it is the first time the number is spoken return 0 - speak = 0 - } else { - // Otherwise, announce how many turns apart the number is from when it was previously spoken. - speak = turn - lastSpokenTurn - } - } - // Record what was said in the last turn - spokenTurn[lastSpoken ?? -1] = turn - } - return speak ?? -1 -} diff --git a/day15/solution.spec.ts b/day15/solution.spec.ts deleted file mode 100644 index a3a7e14..0000000 --- a/day15/solution.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { memoryGame } from './memoryGame' - -describe('Day 15: Rambunctious Recitation', () => { - describe('Part 1', () => { - const numbers = [0, 3, 6] - it.each([ - [1, 0], - [2, 3], - [3, 6], - [4, 0], - [5, 3], - [6, 3], - [7, 1], - [8, 0], - [9, 4], - [10, 0], - [2020, 436], - ])('the spoken number in turn %d should be %d', (turn, expected) => - expect(memoryGame(numbers, turn)).toEqual(expected), - ) - it('should solve', () => - expect(memoryGame([0, 5, 4, 1, 10, 14, 7], 2020)).toEqual(203)) - }) - describe('Part 2', () => { - // This takes 5 minutes - it.skip('should solve', () => - expect(memoryGame([0, 5, 4, 1, 10, 14, 7], 2020)).toEqual(9007186)) - }) -}) diff --git a/day16/findMatchingRules.ts b/day16/findMatchingRules.ts deleted file mode 100644 index f6915e4..0000000 --- a/day16/findMatchingRules.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Rules } from './isValidTicket' - -export const findMatchingRules = ( - tickets: number[][], - rules: Rules, - rowRules = [] as string[], - row = 0, - testMemory = {} as Record, -): string[] | undefined => { - if (row >= tickets[0].length) { - // We have assinged rules to all rows, which means we are done. - return rowRules - } - // Assing the remaining rules - const remainingRules = Object.entries(rules).filter( - ([ruleName]) => !rowRules.includes(ruleName), - ) - const matchingRules = [] - for (const [ruleName, [[min1, max1], [min2, max2]]] of remainingRules) { - const key = `${ruleName}-${row}` - const previous = testMemory[key] - if (previous === false) continue // We have tested this rule already for this row and it never matches - if (previous === true) { - // We have tested this rule already for all tickets and can use it - matchingRules.push(ruleName) - continue - } - // Check if all tickets match this rule - let allTicketsMatch = true - for (const ticket of tickets) { - const v = ticket[row] - if (!((v >= min1 && v <= max1) || (v >= min2 && v <= max2))) { - allTicketsMatch = false - testMemory[key] = false - break - } - } - if (allTicketsMatch) { - matchingRules.push(ruleName) - testMemory[key] = true - } - } - if (matchingRules.length) { - for (const matchingRule of matchingRules) { - const res = findMatchingRules( - tickets, - rules, - [...rowRules, matchingRule], - row + 1, - testMemory, - ) - if (res) return res - } - } - return -} diff --git a/day16/isValidTicket.ts b/day16/isValidTicket.ts deleted file mode 100644 index 1a01d96..0000000 --- a/day16/isValidTicket.ts +++ /dev/null @@ -1,44 +0,0 @@ -export type Rules = Record - -export const parseRules = (rules: string[]): Rules => - rules.reduce((rules, rule) => { - const m = /^(?[^:]+): (?[0-9]+)-(?[0-9]+) or (?[0-9]+)-(?[0-9]+)$/.exec( - rule, - ) - if (m === null) { - console.error(`Could not parse rule ${rule}!`) - return rules - } - return { - ...rules, - [m.groups?.class as string]: [ - [ - parseInt(m.groups?.from1 as string, 10), - parseInt(m.groups?.to1 as string, 10), - ] as [number, number], - [ - parseInt(m.groups?.from2 as string, 10), - parseInt(m.groups?.to2 as string, 10), - ] as [number, number], - ], - } - }, {} as Rules) - -/** - * Returns the invalid numbers in a ticket - */ -export const findInvalidNumbers = (rules: Rules) => ( - ticket: number[], -): number[] => - ticket.filter((n) => { - const range = Object.values(rules).find( - (ruleRanges) => - ruleRanges.find(([from, to]) => { - if (n < from) return false - if (n > to) return false - return true - }) !== undefined, - ) - const isInRange = range !== undefined - return !isInRange - }) diff --git a/day16/rules.txt b/day16/rules.txt deleted file mode 100644 index a503013..0000000 --- a/day16/rules.txt +++ /dev/null @@ -1,20 +0,0 @@ -departure location: 26-715 or 727-972 -departure station: 45-164 or 175-960 -departure platform: 43-247 or 270-972 -departure track: 25-306 or 330-949 -departure date: 26-635 or 660-961 -departure time: 42-773 or 793-961 -arrival location: 28-928 or 943-952 -arrival station: 36-593 or 613-966 -arrival platform: 33-280 or 297-951 -arrival track: 44-358 or 371-974 -class: 39-815 or 839-955 -duration: 39-573 or 589-959 -price: 49-846 or 865-962 -route: 30-913 or 924-954 -row: 29-865 or 890-965 -seat: 44-667 or 683-969 -train: 32-473 or 482-969 -type: 40-424 or 432-953 -wagon: 49-156 or 164-960 -zone: 34-521 or 534-971 \ No newline at end of file diff --git a/day16/solution.spec.ts b/day16/solution.spec.ts deleted file mode 100644 index 2c9d343..0000000 --- a/day16/solution.spec.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { loader, loadString } from '../lib/loader' -import { findInvalidNumbers, parseRules } from './isValidTicket' -import { findMatchingRules } from './findMatchingRules' - -const sampleRules = loadString(`class: 1-3 or 5-7 -row: 6-11 or 33-44 -seat: 13-40 or 45-50`) - -const load = loader(16) -const rules = load('rules') -const tickets = load('tickets') - -describe('Day 16: Ticket Translation', () => { - describe('parseRules', () => { - it('should parse the rules', () => - expect(parseRules(sampleRules)).toEqual({ - class: [ - [1, 3], - [5, 7], - ], - row: [ - [6, 11], - [33, 44], - ], - seat: [ - [13, 40], - [45, 50], - ], - })) - }) - describe('findInvalidNumbers', () => { - it.each([ - [[7, 1, 14], []], - [[7, 3, 47], []], - [[40, 4, 50], [4]], - [[55, 2, 20], [55]], - [[38, 6, 12], [12]], - ])('the ticket %s invalid numbers are %s', (ticket, invalidNumbers) => - expect(findInvalidNumbers(parseRules(sampleRules))(ticket)).toEqual( - invalidNumbers, - ), - ) - }) - describe('Part 1', () => { - const ticketScanningErrorRate = ( - rules: string[], - tickets: string[], - ): number => - tickets - .map((s) => s.split(',').map((s) => parseInt(s, 10))) - .map(findInvalidNumbers(parseRules(rules))) - .flat() - .reduce((sum, n) => n + sum, 0) - - it('should solve the sample', () => - expect( - ticketScanningErrorRate( - sampleRules, - loadString(`7,3,47 - 40,4,50 - 55,2,20 - 38,6,12`), - ), - ).toEqual(71)) - it('should solve', () => - expect(ticketScanningErrorRate(rules, tickets)).toEqual(21081)) - }) - describe('Part 2', () => { - it('should solve the sample', () => { - const step2sampleTickets = loadString(` - 3,9,18 - 15,1,5 - 5,14,9`).map((s) => s.split(',').map((s) => parseInt(s, 10))) - const sample2Rules = parseRules( - loadString(`class: 0-1 or 4-19 - row: 0-5 or 8-19 - seat: 0-13 or 16-19`), - ) - const validTickets = step2sampleTickets.filter( - (t) => findInvalidNumbers(sample2Rules)(t).length === 0, - ) - expect(validTickets).toHaveLength(3) - - expect(findMatchingRules(step2sampleTickets, sample2Rules)).toEqual([ - 'row', - 'class', - 'seat', - ]) - }) - it('should solve', () => { - const r = parseRules(rules) - const f = findInvalidNumbers(r) - const validTickets = tickets - .map((s) => s.split(',').map((s) => parseInt(s, 10))) - .filter((ticket) => f(ticket).length === 0) - const res = findMatchingRules(validTickets, r) - expect(res).toEqual([ - 'route', - 'arrival track', - 'departure location', - 'type', - 'arrival station', - 'duration', - 'arrival platform', - 'departure platform', - 'train', - 'row', - 'arrival location', - 'wagon', - 'seat', - 'departure time', - 'departure station', - 'class', - 'departure date', - 'price', - 'zone', - 'departure track', - ]) - }) - }) -}) diff --git a/day16/tickets.txt b/day16/tickets.txt deleted file mode 100644 index bee67ee..0000000 --- a/day16/tickets.txt +++ /dev/null @@ -1,236 +0,0 @@ -279,705,188,357,892,488,741,247,572,176,760,306,410,861,507,906,179,501,808,245 -51,436,407,893,228,722,213,239,813,460,415,571,95,98,116,138,811,552,164,813 -407,242,909,340,99,906,566,749,880,708,273,843,737,244,244,461,903,198,806,64 -83,740,373,298,441,199,633,271,397,437,693,624,461,372,296,684,122,795,754,124 -294,541,629,865,767,632,434,189,86,799,891,667,466,707,419,197,225,627,243,750 -158,405,551,439,803,149,737,773,220,910,341,798,536,209,753,199,273,141,617,122 -457,176,371,757,456,192,304,803,256,627,695,762,232,400,755,520,706,926,200,382 -566,92,846,448,743,796,54,210,442,623,423,247,52,262,386,747,337,514,145,635 -729,403,105,108,514,434,752,244,175,291,147,78,520,708,843,494,409,392,744,572 -799,76,122,195,129,298,242,547,563,909,750,438,178,632,514,273,858,397,708,151 -482,119,106,800,341,112,804,846,436,566,890,925,515,886,763,236,793,420,908,133 -665,335,739,444,989,246,461,57,684,443,842,146,80,372,152,133,306,628,206,753 -519,350,70,729,633,949,500,664,726,572,844,211,694,399,912,416,199,97,219,691 -379,747,806,134,757,763,334,404,893,909,103,795,522,546,559,394,132,77,457,401 -78,142,536,664,128,804,795,906,204,947,339,388,778,96,766,709,118,227,85,305 -182,465,484,349,383,94,508,345,61,238,299,540,555,735,353,438,378,500,403,289 -132,735,427,356,147,233,905,456,373,712,128,71,559,191,270,350,299,709,453,110 -446,445,408,494,423,3,357,625,702,390,511,896,79,712,493,452,510,205,193,554 -416,667,449,483,803,348,566,569,753,378,762,497,690,208,81,740,522,187,357,276 -890,927,405,213,694,733,76,516,429,489,398,537,540,621,486,727,141,204,145,505 -757,354,134,684,83,73,482,846,800,547,206,808,106,763,685,877,771,221,194,591 -445,857,432,384,630,418,185,108,569,621,619,451,809,763,744,590,698,520,457,247 -769,800,271,50,685,895,125,692,217,419,379,473,18,66,80,381,74,65,57,385 -454,348,573,88,351,551,358,896,380,468,630,400,104,405,591,201,556,542,939,346 -126,236,111,226,241,159,378,686,68,208,810,534,742,356,182,243,302,943,409,540 -120,755,700,704,483,378,666,397,520,209,137,276,361,353,687,709,438,108,129,688 -350,274,153,297,177,909,69,547,762,715,395,729,412,185,53,205,943,807,347,874 -344,472,705,183,192,431,200,53,110,666,332,209,896,376,454,713,768,98,215,148 -417,903,567,89,330,739,447,894,488,57,409,542,274,532,148,737,746,661,753,747 -331,194,101,513,145,81,0,198,226,843,807,88,62,223,904,86,901,737,509,753 -480,270,382,439,707,343,91,458,383,119,808,82,60,684,147,454,110,545,807,405 -760,617,358,697,690,796,55,449,205,510,340,61,66,215,565,650,567,241,229,242 -419,626,848,662,230,392,687,278,625,298,230,756,765,210,840,71,401,633,351,148 -211,544,797,975,432,89,105,713,555,376,115,53,690,703,948,274,809,591,844,541 -628,204,110,450,408,544,812,505,417,769,494,148,147,537,727,902,924,771,202,429 -177,428,57,407,564,243,143,382,500,134,177,304,215,405,624,865,843,486,551,796 -690,454,56,467,144,209,490,458,353,807,731,762,180,990,423,727,444,247,152,391 -675,83,107,514,537,411,444,223,121,154,452,811,180,196,567,591,110,896,696,534 -61,387,141,813,932,793,277,410,902,630,230,272,80,337,493,205,461,797,507,495 -204,124,997,550,378,388,551,189,138,391,560,139,222,149,467,627,702,220,68,436 -273,179,231,383,683,943,499,665,214,508,209,218,127,614,814,63,353,464,290,905 -120,100,143,278,592,486,493,18,149,707,196,302,538,844,145,796,482,764,772,238 -179,561,395,841,699,626,509,126,399,796,771,445,208,700,331,156,285,152,418,755 -116,949,434,491,172,618,416,842,793,947,182,908,629,216,194,846,796,634,496,390 -395,381,94,116,466,402,4,418,511,793,697,927,448,904,454,619,94,110,95,493 -379,521,684,715,944,692,892,276,901,924,373,525,593,238,435,108,512,801,111,944 -733,246,898,356,150,498,195,57,750,210,119,663,823,378,418,66,744,573,538,924 -625,389,928,891,291,305,84,109,794,399,926,181,95,459,464,278,401,347,459,713 -688,275,683,517,559,297,948,439,907,347,710,181,76,739,739,454,548,736,432,989 -237,118,394,111,208,378,138,171,696,412,399,109,210,331,125,205,632,634,696,490 -614,222,593,103,810,55,762,503,945,541,182,693,75,124,400,414,710,213,177,781 -927,689,185,155,852,703,927,189,386,51,155,53,280,928,634,76,543,456,815,806 -990,410,149,206,666,384,394,903,345,97,77,214,473,244,152,618,534,242,560,208 -70,220,193,447,202,77,420,733,627,686,513,948,121,746,900,488,453,284,589,192 -897,707,928,247,434,623,516,854,703,416,589,905,739,485,468,341,799,491,683,451 -377,507,192,518,208,352,217,554,390,910,194,878,699,109,927,182,735,705,146,415 -548,101,144,738,801,455,372,571,899,301,350,271,155,337,714,791,436,619,133,304 -460,400,122,744,132,754,624,570,572,500,566,436,17,513,699,749,483,709,403,738 -181,57,627,947,429,758,593,512,504,101,799,842,155,843,901,633,555,563,211,144 -322,928,464,714,793,621,731,71,551,509,910,354,708,388,809,666,208,623,543,467 -61,331,911,372,765,445,494,621,631,472,519,352,345,409,338,152,154,763,55,658 -405,438,749,236,551,593,895,539,846,246,749,513,259,376,106,82,467,194,440,564 -549,924,407,756,689,692,105,349,943,50,80,622,282,438,63,235,748,846,912,946 -557,550,557,415,483,544,621,802,520,566,397,274,425,846,57,493,800,537,556,742 -120,572,517,114,423,499,634,110,357,435,684,349,861,707,483,434,389,702,661,61 -98,976,516,114,927,899,566,104,903,796,758,633,538,411,148,499,553,383,506,227 -80,510,571,571,837,518,111,139,550,843,387,76,305,544,543,456,683,707,124,711 -450,710,277,420,123,843,59,123,151,414,712,197,929,202,663,896,400,749,75,486 -545,504,550,621,143,815,543,517,837,502,765,590,513,398,338,558,107,573,468,50 -574,865,925,711,122,812,442,732,738,743,758,460,948,572,140,102,896,372,499,543 -222,450,273,686,384,806,619,153,58,378,356,628,355,191,176,683,193,132,881,518 -725,386,299,568,689,402,68,65,223,412,802,804,123,151,115,689,338,448,615,355 -276,696,105,492,279,424,623,118,215,334,556,708,875,615,626,213,246,503,693,487 -431,147,183,619,441,411,50,565,909,406,407,692,109,243,799,404,743,540,117,928 -114,492,740,453,302,279,666,948,356,107,393,104,411,345,560,110,436,437,83,171 -375,571,195,376,194,755,242,232,216,698,336,244,928,946,412,231,793,887,97,808 -545,473,297,408,563,386,713,385,624,378,414,483,766,941,761,731,210,149,538,243 -173,810,239,98,186,492,84,50,332,355,395,710,906,303,741,451,812,795,272,404 -398,106,207,892,383,435,913,404,332,793,541,345,339,466,549,382,744,124,430,558 -452,806,843,623,734,395,341,330,192,84,206,184,988,226,75,794,544,762,413,103 -539,406,740,772,794,211,892,294,635,393,235,694,176,627,772,449,710,502,63,622 -128,813,68,945,275,453,902,402,79,736,696,21,891,132,204,626,797,667,843,470 -404,205,793,552,946,830,76,56,728,213,563,154,468,347,272,927,225,630,357,395 -695,199,943,764,147,58,216,147,377,633,635,123,735,442,568,710,944,543,754,937 -178,218,127,156,316,118,624,82,449,747,125,624,387,233,177,376,154,446,554,385 -764,564,557,793,913,591,984,568,276,188,518,542,807,627,80,388,93,554,689,439 -692,810,19,84,553,571,353,736,56,486,451,756,121,710,342,145,740,729,706,565 -487,548,700,762,763,132,99,811,446,688,509,728,806,614,140,99,942,189,270,502 -412,526,756,894,233,515,703,460,865,464,86,145,228,772,231,211,85,132,446,247 -202,70,211,110,96,370,197,216,768,344,799,191,56,135,540,905,356,715,459,763 -620,56,419,354,708,414,488,710,766,77,463,712,225,8,713,741,204,616,635,626 -84,721,443,572,337,560,813,108,768,432,535,190,231,623,406,114,799,411,151,386 -890,807,897,400,278,570,95,103,626,430,68,299,731,701,625,113,503,617,747,497 -53,376,540,383,336,780,136,925,353,805,346,747,411,911,386,542,116,913,772,803 -382,508,553,893,490,377,186,924,121,573,379,420,306,1,739,589,128,379,734,434 -903,383,741,350,103,350,179,407,72,521,628,773,646,401,755,236,61,372,812,330 -740,565,373,400,491,563,737,625,461,761,67,303,913,979,383,844,711,357,865,740 -701,243,62,760,126,684,343,149,982,444,179,693,212,902,421,347,100,341,617,498 -270,796,626,699,518,735,205,559,13,842,896,909,237,809,102,376,809,558,471,462 -346,565,630,97,382,393,270,904,300,199,465,941,497,126,98,504,705,897,397,567 -908,806,284,518,276,748,113,419,628,86,352,800,745,414,625,213,83,146,137,106 -842,656,845,82,665,489,626,573,242,184,510,400,116,135,215,623,773,892,177,150 -610,949,795,630,201,110,736,891,626,270,198,710,748,89,727,901,55,345,763,613 -395,345,797,185,684,814,738,375,861,737,613,305,381,78,798,766,394,554,548,278 -613,811,302,188,905,96,693,160,441,80,201,692,736,270,626,557,896,485,734,279 -465,13,90,519,760,64,483,613,907,911,408,904,339,537,336,842,155,451,393,134 -67,683,631,389,869,518,385,705,344,212,712,809,80,114,230,415,109,766,482,689 -805,413,65,65,703,564,537,798,277,153,301,393,708,552,759,167,187,744,118,767 -844,153,337,926,845,433,703,176,715,131,130,98,801,122,937,72,737,811,509,742 -409,624,234,846,349,683,406,53,709,773,706,445,557,752,728,455,427,517,695,500 -666,441,92,903,421,526,624,745,443,143,83,175,347,571,123,96,118,194,713,201 -734,592,214,140,786,91,74,560,794,146,741,127,765,217,665,736,561,232,405,505 -201,613,104,413,542,68,179,193,402,757,463,926,844,572,376,553,541,532,492,814 -946,683,522,117,561,613,448,701,123,806,144,383,769,559,179,449,51,892,555,407 -70,490,497,486,666,699,155,374,590,843,57,221,51,169,52,372,145,71,502,223 -728,844,519,105,560,767,449,841,463,240,903,593,21,80,239,900,729,58,275,691 -565,454,713,386,585,545,403,242,356,911,100,234,406,147,339,549,380,297,127,553 -945,229,242,183,534,110,132,374,421,504,911,705,214,628,797,11,552,541,753,520 -354,352,377,124,944,211,203,126,521,386,738,683,350,593,510,948,744,937,494,155 -186,928,801,633,75,299,487,443,375,935,762,152,542,572,573,276,766,217,450,813 -410,59,388,487,419,238,408,488,206,661,236,812,469,551,537,529,119,793,280,613 -501,556,444,750,924,304,155,912,439,137,470,176,907,120,225,227,761,378,692,530 -869,702,773,482,453,372,496,88,698,65,730,229,735,689,105,352,803,709,759,438 -495,891,306,79,839,397,191,371,80,353,539,728,907,419,187,907,13,842,87,947 -850,688,56,305,630,202,398,620,622,798,235,126,799,421,493,131,558,379,395,212 -846,483,500,559,487,100,618,911,642,626,112,306,540,494,150,273,764,707,492,60 -520,749,504,549,502,755,664,338,143,542,388,770,913,402,135,391,572,101,713,722 -751,842,395,629,769,500,663,898,906,119,304,839,714,69,403,431,900,801,592,202 -125,272,125,175,740,56,898,430,549,928,192,570,471,280,510,129,129,471,521,458 -382,868,564,113,185,333,411,247,494,177,228,803,67,912,211,374,483,760,493,487 -372,222,190,306,555,710,186,273,60,688,410,142,514,508,567,848,415,632,728,189 -190,571,374,737,482,476,449,506,807,689,549,489,741,946,727,98,352,238,104,392 -456,182,71,182,463,728,88,138,620,150,342,535,229,228,112,664,735,429,750,120 -941,383,447,520,104,127,89,99,729,841,890,736,623,125,183,142,279,798,729,514 -3,141,589,447,213,498,465,906,146,436,132,539,795,128,733,73,551,562,93,502 -142,102,191,744,130,206,467,241,294,472,520,218,50,896,100,415,561,691,743,131 -757,285,734,924,493,539,485,66,77,343,135,210,442,424,514,50,628,280,397,392 -755,546,755,741,630,187,489,92,689,271,568,59,279,814,545,935,773,519,767,903 -484,348,756,346,184,754,518,695,435,701,415,102,515,54,102,373,139,758,221,266 -904,373,548,420,571,465,865,716,444,446,68,56,231,387,492,141,204,454,568,635 -490,126,752,237,840,441,271,563,499,490,736,18,77,688,751,841,279,814,706,164 -543,895,509,469,893,383,149,485,663,240,442,375,991,193,331,352,464,513,188,727 -205,949,665,231,688,230,413,940,239,764,100,136,684,56,234,377,232,735,737,558 -335,234,516,735,231,128,72,544,81,534,747,975,383,247,591,737,220,213,631,188 -613,803,391,913,692,303,467,71,543,771,414,106,736,133,526,619,740,763,80,57 -805,87,904,745,186,183,196,763,147,448,627,771,157,561,341,731,444,331,728,465 -230,195,809,220,747,613,552,225,70,766,707,743,946,558,298,162,466,302,699,615 -403,91,695,846,99,244,415,105,892,926,350,985,333,505,806,224,746,356,807,343 -798,740,272,936,568,891,535,519,740,701,63,413,66,272,280,204,280,235,123,560 -112,444,470,509,79,207,140,869,539,58,177,123,418,841,772,87,399,562,384,744 -89,550,247,632,563,846,349,763,184,194,898,757,167,222,64,272,456,63,693,415 -492,20,416,846,178,447,495,944,805,237,593,408,501,178,298,228,377,404,224,358 -741,386,138,125,478,553,83,101,304,894,466,437,373,341,623,844,946,810,555,115 -741,162,502,891,131,152,551,113,512,58,760,894,705,505,753,406,743,909,773,547 -404,188,223,57,731,653,124,805,234,752,371,707,356,712,945,331,747,151,947,148 -138,553,98,176,256,457,756,754,108,349,133,422,97,489,565,911,662,147,373,240 -236,51,945,68,67,144,771,763,690,807,505,521,219,572,373,257,195,517,753,53 -391,811,353,558,495,404,374,734,714,335,122,454,589,472,280,890,506,162,683,79 -767,825,905,904,519,332,708,506,436,237,801,302,711,84,196,424,947,84,72,191 -438,568,237,460,347,558,15,304,799,423,69,843,772,185,500,77,150,355,683,238 -497,134,396,536,224,223,414,412,776,416,303,125,275,501,502,839,216,754,687,232 -516,244,444,152,556,297,689,665,445,107,225,293,88,573,113,913,401,769,814,463 -149,902,76,505,508,542,839,176,494,560,900,128,578,156,223,893,218,225,684,807 -54,802,276,514,620,68,797,411,54,273,742,213,715,724,556,80,590,811,96,751 -907,57,490,727,592,86,223,647,444,504,346,708,418,278,404,191,738,62,215,376 -52,265,279,273,336,752,456,768,372,466,272,844,686,410,134,223,203,389,468,196 -223,324,865,68,149,505,488,244,547,117,392,589,896,494,747,98,298,569,507,467 -436,137,440,538,471,385,766,615,846,809,928,689,307,212,446,514,418,203,662,422 -338,697,19,705,689,104,686,538,56,538,434,214,80,214,116,298,183,560,734,414 -58,474,53,498,698,752,752,698,146,155,706,753,894,452,52,415,385,697,904,765 -56,200,449,226,343,76,177,409,228,484,135,350,762,794,691,384,333,945,109,996 -215,140,537,696,390,353,736,550,91,514,235,126,68,79,156,764,874,384,891,228 -297,939,114,134,505,461,706,683,357,246,222,460,763,75,563,392,337,535,546,549 -132,378,395,518,78,746,425,103,357,896,450,233,899,750,634,451,100,274,65,176 -471,893,801,755,528,488,246,665,74,702,489,110,126,138,729,190,752,120,225,437 -396,783,548,357,543,84,150,118,794,891,459,559,633,77,225,558,247,398,67,555 -464,350,68,274,335,352,617,91,555,620,548,708,737,345,852,126,129,555,416,904 -539,74,118,353,160,559,225,435,928,435,205,454,242,234,752,737,815,274,469,742 -422,136,752,128,340,456,507,504,664,551,634,404,733,425,197,534,564,217,536,536 -618,592,432,536,769,347,693,540,241,412,191,554,299,352,218,319,236,727,500,543 -456,180,137,901,569,258,59,900,913,331,462,418,187,747,450,384,210,384,729,373 -813,563,211,800,773,298,238,52,989,454,85,766,102,741,243,752,510,535,483,240 -448,390,933,621,242,50,71,484,104,350,752,271,492,730,335,54,747,103,144,566 -146,742,446,619,744,772,931,52,538,275,75,302,164,499,415,763,140,110,111,400 -123,443,356,91,78,878,507,944,444,949,492,690,740,212,763,714,553,126,278,348 -568,664,563,199,561,315,552,55,198,228,202,493,141,455,691,727,336,175,132,239 -455,514,693,144,198,331,354,383,395,796,460,219,729,341,99,753,623,228,338,162 -550,684,66,278,724,438,60,499,274,199,298,276,707,945,409,445,457,181,349,242 -493,590,810,381,509,898,382,461,301,58,465,743,392,728,376,746,15,142,198,715 -792,183,551,191,349,122,184,695,399,767,735,735,452,446,893,245,70,660,335,507 -403,801,380,689,237,770,192,729,175,205,622,194,383,392,556,724,773,74,949,535 -538,754,418,433,737,552,803,496,352,510,240,303,601,537,797,748,709,901,497,795 -390,193,216,904,228,443,550,627,663,379,219,749,484,163,345,86,733,913,75,707 -106,801,75,913,300,736,614,209,736,76,898,749,298,380,305,435,52,982,129,744 -385,796,354,807,626,272,105,372,441,421,506,508,239,892,224,284,763,766,229,278 -619,422,911,383,347,446,689,347,397,94,232,98,480,455,512,380,198,693,153,548 -60,510,423,890,227,850,924,178,759,182,590,184,453,465,904,466,616,502,63,684 -197,913,442,894,702,226,214,409,513,376,468,538,626,739,731,994,417,227,553,502 -197,625,403,117,300,713,70,795,754,549,815,409,121,148,995,189,796,742,690,273 -689,592,83,122,301,128,235,224,522,566,212,750,102,434,116,630,620,534,434,410 -642,948,901,421,225,666,64,138,635,358,344,690,79,613,98,413,392,57,487,372 -156,419,275,139,745,629,388,805,949,352,63,549,94,746,874,297,568,375,801,74 -710,554,768,379,136,932,376,380,403,739,177,458,391,469,756,180,204,907,244,865 -617,166,415,565,926,119,420,414,560,298,924,381,747,306,468,661,116,240,688,195 -221,358,420,246,368,75,68,279,694,280,341,378,81,752,501,696,404,902,345,752 -900,547,798,277,446,222,152,527,144,509,551,89,713,218,189,624,452,503,246,330 -395,407,16,547,421,517,665,389,97,298,140,126,467,164,420,183,807,93,703,153 -191,337,63,450,517,284,408,135,899,800,126,623,450,435,563,904,420,924,84,146 -693,618,910,843,500,185,509,181,438,461,845,430,450,805,123,247,432,738,374,571 -141,907,556,298,739,302,469,510,548,402,767,893,436,665,62,814,622,944,51,855 -446,434,447,146,643,626,489,344,111,112,801,467,91,177,186,204,613,207,100,519 -911,333,159,241,446,444,199,771,244,419,627,419,543,411,439,485,138,893,99,698 -632,799,441,800,796,439,120,394,536,735,664,794,897,235,121,86,174,519,132,625 -176,760,53,135,347,336,732,487,169,418,67,352,536,454,800,136,133,423,199,125 -508,397,814,752,381,697,243,906,936,144,175,660,842,126,377,749,926,569,620,665 -398,687,231,619,842,270,505,948,806,712,573,925,407,246,191,741,158,631,119,84 -554,844,457,125,88,185,562,120,231,741,341,154,572,279,428,758,306,83,798,338 -833,440,150,616,398,704,521,899,706,771,153,793,571,384,733,334,397,907,541,615 -359,845,422,58,302,629,387,240,627,902,487,455,235,215,353,683,193,440,129,696 -371,226,949,434,56,906,103,387,511,451,473,164,72,805,928,374,748,229,453,16 -155,68,205,133,592,762,60,732,488,133,752,119,507,545,20,97,386,79,727,534 -392,627,416,116,994,684,894,749,615,621,913,767,81,946,192,82,814,631,393,466 -268,494,667,947,393,67,435,135,744,441,840,572,58,270,71,145,229,541,300,464 -214,221,372,749,440,90,402,438,944,732,178,153,118,805,331,418,724,175,625,913 -452,667,686,456,185,472,130,807,898,663,810,354,344,650,385,797,399,708,622,100 -812,149,593,450,212,421,742,613,355,301,450,89,192,899,162,151,843,460,515,92 -531,201,557,279,633,68,131,338,804,199,489,452,220,203,745,128,665,946,410,240 -745,842,703,100,802,735,909,749,461,865,661,512,237,20,694,106,453,709,705,103 -406,247,62,91,375,547,796,53,751,463,753,121,358,293,213,413,631,947,332,355 -633,347,549,56,464,246,700,489,77,90,904,432,181,392,717,415,556,273,562,225 -800,180,876,110,804,375,627,225,892,120,116,117,619,557,81,88,112,537,106,123 -451,233,73,405,746,169,556,551,548,444,91,630,150,521,553,376,332,771,342,560 -348,556,567,684,865,910,200,695,311,418,384,483,905,422,510,185,473,631,560,344 -515,391,442,687,843,412,545,469,159,400,123,153,745,180,842,751,394,492,494,485 -409,442,390,469,223,335,552,77,758,339,94,186,721,683,539,486,924,684,632,192 -700,298,999,164,410,279,113,377,813,909,233,209,376,152,390,340,701,632,153,406 \ No newline at end of file diff --git a/day17/cubes.ts b/day17/cubes.ts deleted file mode 100644 index ced973e..0000000 --- a/day17/cubes.ts +++ /dev/null @@ -1,143 +0,0 @@ -type ActiveCube = [number, number, number] - -export const loadSeed = (seed: string[]): ActiveCube[] => - seed.reduce( - (cubes, line, y) => [ - ...cubes, - ...(line - .split('') - .map((s, x) => { - if (s === '#') return [x, y, 0] - return undefined - }) - .filter((c) => c !== undefined) as ActiveCube[]), - ], - [] as ActiveCube[], - ) - -const unique = (v: T, k: number, arr: T[]) => arr.indexOf(v) === k - -export const printCubes = (cubes: ActiveCube[]): void => { - const zs = cubes - .sort(([, , z1], [, , z2]) => z1 - z2) - .map(([, , z]) => z) - .filter(unique) - const xs = cubes - .sort(([x1], [x2]) => x1 - x2) - .map(([x]) => x) - .filter(unique) - const ys = cubes - .sort(([, y1], [, y2]) => y1 - y2) - .map(([, y]) => y) - .filter(unique) - - const width = xs[xs.length - 1] - xs[0] - const xOffset = -xs[0] - const height = ys[ys.length - 1] - ys[0] - const yOffset = -ys[0] - - for (const z of zs) { - console.log('') - console.log(`z=${z}`) - const cubesOnLayer = cubes.filter(([, , cubeZ]) => cubeZ === z) - const space = [] as string[][] - for (let y = 0; y <= height; y++) { - space[y] = [] - for (let x = 0; x <= width; x++) { - space[y][x] = '.' - } - } - for (const cube of cubesOnLayer) { - space[cube[1] + yOffset][cube[0] + xOffset] = '#' - } - console.log(space.map((s) => s.join('')).join('\n')) - } -} - -const equal = (a: ActiveCube) => (b: ActiveCube) => - a[0] === b[0] && a[1] === b[1] && a[2] === b[2] - -const notEqual = (a: ActiveCube) => (b: ActiveCube) => !equal(a)(b) - -const neighbor = (a: ActiveCube) => (b: ActiveCube) => - Math.max( - Math.abs(a[0] - b[0]), - Math.abs(a[1] - b[1]), - Math.abs(a[2] - b[2]), - ) === 1 - -const countActiveNeighbours = (cube: ActiveCube, world: ActiveCube[]): number => - world.filter(notEqual(cube)).filter(neighbor(cube)).length - -// Return all the cubes around the given cube -const expand = (cube: ActiveCube): ActiveCube[] => { - const [x, y, z] = cube - return [ - // Front slice - [x - 1, y + 1, z - 1], - [x, y + 1, z - 1], - [x + 1, y + 1, z - 1], - [x - 1, y, z - 1], - [x, y, z - 1], - [x + 1, y, z - 1], - [x - 1, y - 1, z - 1], - [x, y - 1, z - 1], - [x + 1, y - 1, z - 1], - // Center slice - [x - 1, y + 1, z], - [x, y + 1, z], - [x + 1, y + 1, z], - [x - 1, y, z], - //[x, y, z], // Do not return the cube itself - [x + 1, y, z], - [x - 1, y - 1, z], - [x, y - 1, z], - [x + 1, y - 1, z], - // Back slice - [x - 1, y + 1, z + 1], - [x, y + 1, z + 1], - [x + 1, y + 1, z + 1], - [x - 1, y, z + 1], - [x, y, z + 1], - [x + 1, y, z + 1], - [x - 1, y - 1, z + 1], - [x, y - 1, z + 1], - [x + 1, y - 1, z + 1], - ] as ActiveCube[] -} - -const containsCube = (world: ActiveCube[]) => ([x, y, z]: ActiveCube) => - world.find(([wx, wy, wz]) => wx === x && wy === y && wz === z) !== undefined - -const containsNotCube = (world: ActiveCube[]) => (cube: ActiveCube) => - !containsCube(world)(cube) - -export const cycle = (seed: ActiveCube[]): ActiveCube[] => { - const iteration: ActiveCube[] = [] - for (const cube of seed) { - const activeNeighbors = countActiveNeighbours(cube, seed) - // If a cube is active and exactly 2 or 3 of its neighbors are also active, - // the cube remains active. Otherwise, the cube becomes inactive. - const [x, y, z] = cube - if (activeNeighbors === 2 || activeNeighbors === 3) { - // console.log(`Cube ${cube} stays active (${activeNeighbors} neighbors)`) - iteration.push([x, y, z]) - } else { - // console.log( `Cube ${cube} becomes inactive (${activeNeighbors} neighbors)`, ) - } - - // If a cube is inactive but exactly 3 of its neighbors are active, - // the cube becomes active. Otherwise, the cube remains inactive. - const notInSeed = containsNotCube(seed) - const notInIteration = containsNotCube(iteration) - const inactiveAround = expand(cube).filter(notInSeed).filter(notInIteration) - for (const inactiveCube of inactiveAround) { - const activeNeighbors = countActiveNeighbours(inactiveCube, seed) - if (activeNeighbors === 3) { - // console.log( `Cube ${inactiveCube} becomes active (${activeNeighbors} neighbors)`, ) - iteration.push(inactiveCube) - } - } - } - return iteration -} diff --git a/day17/solution.spec.ts b/day17/solution.spec.ts deleted file mode 100644 index 7d78841..0000000 --- a/day17/solution.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { loadString } from '../lib/loader' -import { loadSeed, printCubes, cycle } from './cubes' - -const sampleSeed = loadString(`.#. -..# -###`) - -const input = loadString(`####...# -......#. -#..#.##. -.#...#.# -..###.#. -##.###.. -.#...### -.##....#`) - -describe('Day 17: Conway Cubes', () => { - describe('Part 1', () => { - it('should solve the sample', () => { - let space = [...loadSeed(sampleSeed)] - for (let c = 0; c < 6; c++) { - console.log('') - console.log(`Cycle ${c}: ${space.length}`) - space = cycle(space) - printCubes(space) - } - expect(space).toHaveLength(112) - }) - it('should solve', () => { - let space = [...loadSeed(input)] - for (let c = 0; c < 6; c++) { - console.log('') - console.log(`Cycle ${c}: ${space.length}`) - space = cycle(space) - printCubes(space) - } - expect(space).toHaveLength(286) - }) - }) -}) diff --git a/day18/calc.ts b/day18/calc.ts deleted file mode 100644 index 80da934..0000000 --- a/day18/calc.ts +++ /dev/null @@ -1,65 +0,0 @@ -export const isNumber = (s: string): boolean => /^[0-9]$/.test(s) -export const isSpace = (s: string): boolean => /^ $/.test(s) -export const isOperator = (s: string): boolean => /^[+*]$/.test(s) -export const isOpeningParenthesis = (s: string): boolean => /^\($/.test(s) -export const isClosingParenthesis = (s: string): boolean => /^\)$/.test(s) - -export const findClosing = (expr: string, start: number): number => { - let level = 0 - for (let i = start; i < expr.length; i++) { - if (isOpeningParenthesis(expr[i])) level++ - if (isClosingParenthesis(expr[i])) level-- - if (level === 0) return i - } - throw new Error( - `Could not find closing paranthesis in ${expr}, starting at ${start}`, - ) -} - -/** - * @deprecated see calcToken - */ -export const calc = (expr: string): number => { - let a = 0 - let op = '' - let b = 0 - let pos = 0 - for (let i = 0; i < expr.length; i++) { - const e = expr[i] - if (isNumber(e)) { - if (pos === 0) { - a = parseInt(`${a}${e}`, 10) - } else { - b = parseInt(`${b}${e}`, 10) - } - } else if (isOperator(e)) { - pos = ++pos % 2 - if (pos === 0) { - a = calc(`${a} ${op} ${b}`) - b = 0 - pos++ - } - op = e - } else if (isSpace(e)) { - // Pass - } else if (isOpeningParenthesis(e)) { - const closingPos = findClosing(expr, i) - const res = calc(expr.substr(i + 1, closingPos - 1 - i)) - if (pos === 0) a = res - else b = res - i = closingPos - if (closingPos >= expr.length - 1 && pos === 0) return a - } else { - throw new Error(`Unexpected character "${e}" at pos ${i}!`) - } - } - - switch (op) { - case '*': - return a * b - case '+': - return a + b - default: - throw new Error(`Unexpected operator "${op}"!`) - } -} diff --git a/day18/calcToken.spec.ts b/day18/calcToken.spec.ts deleted file mode 100644 index b348e66..0000000 --- a/day18/calcToken.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { calcTokens } from './calcTokens' -import { loader } from '../lib/loader' - -const load = loader(18) -const input = load('input') - -describe('calcToken should calculate using the tokenized expression', () => { - it.each([ - ['1 + 2', 3], - ['3 * 3', 9], - ['1 + 2 + 3', 6], - ['1 + 2 * 3', 9], - ['1 + 2 * 3 + 4 * 5 + 6', 71], - ['(2 * 3)', 6], - ['1 + (2 * 3)', 7], - ['1 + (2 * 3) + 4', 11], - ['(2 * 3) + (3 * 4)', 18], - ['1 + (2 * 3) + (4 * (5 + 6))', 51], - ['2 * 3 + (4 * 5)', 26], - ['5 + (8 * 3 + 9 + 3 * 4 * 3)', 437], - ['5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', 12240], - ['((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', 13632], - ])('%s = %d', (expression, expected) => - expect(calcTokens(expression)).toEqual(expected), - ) - it('should solve the puzzle input', () => - expect(input.map(calcTokens).reduce((total, n) => total + n, 0)).toEqual( - 7293529867931, - )) -}) diff --git a/day18/calcTokens.ts b/day18/calcTokens.ts deleted file mode 100644 index a710a94..0000000 --- a/day18/calcTokens.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Token, tokenize } from './tokenize' - -export const calc = (token: Token): number => { - switch (token.type) { - case 'op': - switch (token.op) { - case '*': - return calc(token.left) * calc(token.right) - case '+': - return calc(token.left) + calc(token.right) - default: - throw new Error(`Unexpected operation ${token.op}!`) - } - case 'value': - return token.value - case 'group': - return calc(token.group) - default: - throw new Error(`Unexpected type ${token.type}`) - } -} - -/** - * Calculate the expresssion using the tokenizer - */ -export const calcTokens = (expression: string): number => - calc(tokenize(expression)) diff --git a/day18/groupAdditions.spec.ts b/day18/groupAdditions.spec.ts deleted file mode 100644 index faabb67..0000000 --- a/day18/groupAdditions.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { calcTokens } from './calcTokens' -import { groupAdditions } from './groupAdditions' - -describe('groupAdditions', () => { - it.each([ - ['1 + 2', '(1 + 2)', 3], - ['1 + 2 * 3 + 4 * 5 + 6', '(1 + 2) * (3 + 4) * (5 + 6)', 231], - ['1 + (2 * 3) + (4 * (5 + 6))', '((1 + (2 * 3)) + (4 * ((5 + 6))))', 51], - ['2 * 3 + (4 * 5)', '2 * (3 + (4 * 5))', 46], - ['5 + (8 * 3 + 9 + 3 * 4 * 3)', '(5 + (8 * ((3 + 9) + 3) * 4 * 3))', 1445], - [ - '5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', - '5 * 9 * (7 * 3 * (3 + 9) * (3 + ((8 + 6) * 4)))', - 669060, - ], - [ - '((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', - '(((((2 + 4) * 9) * (((6 + 9) * (8 + 6)) + 6)) + 2) + 4) * 2', - 23340, - ], - ])(`should group %s to %s and equal %d`, (expression, escaped, expected) => { - expect(groupAdditions(expression)).toEqual(escaped) - expect(calcTokens(groupAdditions(expression))).toEqual(expected) - }) -}) diff --git a/day18/groupAdditions.ts b/day18/groupAdditions.ts deleted file mode 100644 index f8702fd..0000000 --- a/day18/groupAdditions.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { isNumber } from './calc' - -const reverse = (s: string): string => s.split('').reverse().join('') - -const addParen = (paren: '(' | ')', exp: string): string => { - let parenCount = 0 - for (let i = exp.length - 1; i >= 0; i--) { - const c = exp[i] - if (['(', ')'].includes(c) && c !== paren) parenCount++ - if (c === paren) { - parenCount-- - if (parenCount === 0) { - return `${exp.substr(0, i)}${paren}${exp.substr(i)}` - } - } - if (isNumber(c) && parenCount === 0) { - return `${exp.substr(0, i)}${paren}${exp.substr(i)}` - } - } - - throw new Error(`Could not add parenthesis "${paren}" to "${exp}"!`) -} - -const addOpeningParen = (exp: string): string => addParen('(', exp) - -const addClosingParen = (exp: string): string => - reverse(addParen(')', reverse(exp))) - -/** - * Groups all aditions in the expression, e.g. `1 + 2 * 2` => `(1 + 2) * 3` - **/ -export const groupAdditions = (expression: string): string => { - let res = expression - for (let i = 0; i < res.length; i++) { - if (res[i] === '+') { - const l = res.substr(0, i - 1) - const r = res.substr(i + 2) - const left = addOpeningParen(l) - const right = addClosingParen(r) - res = `${left} + ${right}` - i += 2 - } - } - return res -} diff --git a/day18/input.txt b/day18/input.txt deleted file mode 100644 index f8777b6..0000000 --- a/day18/input.txt +++ /dev/null @@ -1,375 +0,0 @@ -(7 * 5 * 6 + (9 * 8 + 3 * 3 + 5) + 7) * (6 + 3 * 9) + 6 + 7 + (7 * 5) * 4 -(4 + 9 + (8 * 2) + 5) * 8 + (3 + 2 * 3 * 7 * (7 * 4 * 5) * 9) * 2 -3 + 7 + (9 + 6 + 4 * 7 * 3 + 5) * 9 -3 + 3 * (5 + (7 * 5 + 4 * 8 + 9 * 2) + 3) * 8 * 7 -(8 + 3 + 7 * 7) + (3 + 8) * 4 + 2 -2 + 9 * (7 + 3 * 3 * 8) + 9 + 3 -2 * ((5 + 7 + 9 + 7 * 3 * 7) * 2 + 4 * 4 + (2 + 2 + 7) + 3) + 6 -8 * 3 * (6 + (6 * 8 * 2)) + 9 + 9 * 3 -(9 * 7 + 6) + 5 * (7 + 5 + 4) + 2 -(9 + 4 * (5 + 5 + 4 * 2) * 7) * 7 * 9 * 5 * 3 -7 * 6 * ((5 + 6 + 8 + 4 * 3) + 2 + 2 * (4 + 6 + 2 + 7) + 8) + 4 -6 + 5 + 3 * (4 * (8 + 8 + 7 + 2 * 6) + 3 + (7 * 6 * 3) * (9 + 5)) + 4 -9 + 4 + (7 + 3 + 3 + 2 + 8) + (2 * (4 * 2) + 8 + (9 + 9 * 9 * 5 + 2 + 3) * (6 + 4 * 5)) * (4 + 8 * 2) -(2 * 3 + 7 * 5 * (2 + 3 * 7) * 3) + 9 -9 + (6 * 6 * 3) * 3 -((3 * 6) + (5 + 5 * 9 * 7 + 8) * 7 * 8) + 8 + (6 * (4 * 2 + 6 + 7 + 2) * (2 * 8 + 3) * 5 + 7) + 5 + 7 -(2 * 3 + 4 + 9 + 8) + (5 * 4 * (5 + 5 + 3) + 2 * 8 + 2) -7 + 7 + 7 + 4 + (7 + 7 + 8) -9 * (8 + 7) + 2 * 6 -6 + 8 + 8 * 6 * 8 + ((5 + 2 * 2 * 6 + 8) + 9 + 3 + (5 * 3 * 8) + 7) -4 * 9 + 8 + (5 * (5 + 6 * 8) + 5 + 4 + (7 * 2 * 6)) * 5 -(8 * 5 + 3 * 6 + 8 + 6) + 5 * 2 + 6 + (3 + 8 + 3 + 7 * 7 * 6) -5 + (2 * (6 * 8 * 9 + 3 + 9 * 6) + 8 * (7 + 6 + 8) + 9 + 7) + 6 * 6 -7 + 2 * (5 + 4 * 8 + (8 + 9) + 3) * 3 -2 * ((8 + 3 + 2) + 9 * (6 * 2 * 5 * 6)) * 7 * 2 * 9 -((6 + 6) + (4 * 4 + 7 * 6 * 3) * (2 + 2 + 5 + 8) + 7 + 5) + 6 * 8 * 7 * 4 * 7 -6 + 5 * 8 + (8 + 5 + 4 + 6 * 5) + 8 + 9 -2 + (2 + (8 + 8) + 2) -3 * 3 * (8 + 2 + 3) * (2 + 4) + 7 -9 * 2 + 9 + (3 + 5 + 5 * 2 * 2 + 7) -(7 * (2 + 6 * 7 * 2) + (8 + 4 + 4) + 4 + 5) + 3 -(7 * 5 + 7) + (3 * 9 * 4 * (8 * 2 + 9) * 8) * 6 + 9 * 9 -9 + (2 * 5 + 2 * 7 * 3 * 7) + 5 + 3 -(3 * (5 * 3 * 4) * (5 + 2)) + 7 -(7 + 4) + 9 * 2 -3 * (5 * 6 * 5 * 8) * 2 * 2 * 7 * 7 -(7 + (7 * 2 * 5 * 6 * 7 + 2)) * 5 + 9 * 9 -(5 * (3 + 6 + 4 + 4 * 8)) * (8 * 6 * 6 + (4 + 8)) * 2 + 8 + 8 -((9 * 8) * 3 * 7 * (3 + 9 * 8 + 6)) + (4 + 2 + 7 * 9) -(6 * 4 + 8 * 2 * 9) + 5 * 5 * 3 -5 + 6 * 9 * 7 -(2 * 5 * (2 + 8 + 5 + 2 * 5) * 2 * 9) + (6 + 8 * 2) + 5 -7 * ((4 + 8 + 8) * 7 * 3 * 3 * 5 + (5 + 6 + 9 * 6)) -(6 + 5) * 2 -7 * 2 + 4 + (2 * 4) + 5 + 2 -8 * 6 + 9 * (3 + (4 + 2 + 9 + 3 + 8) + (8 + 6 + 3 * 9 * 3 + 7) + 4 + 2) + (5 + 4 + 6) -2 + ((7 * 4) * 9 * 8 + 2 * 8) -6 + 2 * 8 * (5 * 9 * 7 * 9 + (3 + 2 * 9 * 8 * 6 + 7)) * 7 * 6 -9 * 6 * 9 * 8 + (2 + (7 * 4 + 6) * 8 + (3 * 7 + 3 + 4 + 2)) * 7 -5 * 9 * 8 * 2 + 7 -9 + (2 * 6 * 6 * 3) + 7 + 4 + 3 -(9 * 6) * ((5 + 3) * 5) + 2 + 3 + 6 * (6 * (8 + 6 + 2 * 2 + 9 + 8)) -((2 + 5 + 6 + 2 + 5 + 9) + 4 * (5 + 7 * 5) + 2) * 3 + 9 * (6 + 9 * 8 * 7) + 7 -2 * 9 + (4 * (3 + 7 + 3) * 4) + 5 + 9 -((9 * 4 * 4) + 3 + 2 + 3) + 8 + ((7 * 6 * 5 * 2 * 9) + (9 * 6 + 8 + 3 * 8 + 4) * (6 * 8) * 6 + 8) * 5 + 6 -2 * 8 + 5 + 4 -6 + (6 + 6 + 6) + 3 * 4 -6 + (7 + 4 * 9 * 2 + 7) + 7 + 3 * 2 * 2 -(7 * 7 + (3 * 6 + 4 + 9) + (5 * 5 * 7 * 7 + 4 + 6) * (4 + 9 + 7 * 5 * 9)) * 2 + 8 + 3 * 8 -4 * (5 + 5) + (8 + 5 * 4) + 7 * (5 * 6) -9 + 4 * 4 * 3 + 6 + 3 -5 + 5 * (6 + 6 * 5 + (3 + 5 * 6) + (2 * 9) + 2) * 6 + 8 + 5 -5 * 8 * 8 * 5 * 3 + 2 -6 * 2 + 3 + 7 + (6 + 4) + 3 -(5 + 7 + 6 + 5 + (9 * 5 + 5 + 6) + 8) + 3 * 6 * 9 * 6 -(8 + 2 * 7 * 2 * (8 + 9)) + 7 * (4 + 4 + 5 * (8 * 9 * 8 + 4) * (8 + 8 * 5)) * 8 -8 + ((4 * 8 * 8 * 7 + 6 + 9) + 5) + 9 * 4 -((4 * 8 * 5) + 6 + (8 + 4 * 5 + 2) * 5 * 8) + 6 * 3 -8 * ((2 * 9 * 9 * 7 * 2) + 4 + 8 + 2) -2 * 9 + (9 + 6 + 7) * ((8 * 3 * 3 * 7 * 3 + 9) + 4 * 4 + (8 * 7 * 6 * 3) * (6 * 5 * 2 + 6 + 3)) + (2 + 9 + 9 * 5 * 7) -(4 + (9 + 3 * 6) * 8) + 2 -7 + 5 * (3 + 7 * 3 + 7 + (4 * 7) + 3) + 4 * 9 -(3 * 7 * 9 + 7) + 6 * 6 + 7 + (9 * 3) * 7 -6 + (9 + 5 + (9 + 9 * 9 + 8) + 2 + 5 * 9) -9 * 4 -3 + 8 + (4 + 2 + 3) + (7 * 9 * 9 + 3 * (4 + 5 + 3 + 4 * 3) + 8) * 8 * 9 -7 + (7 + 9 * 2 * 2 * 5) -8 * ((5 * 8 * 7 + 5) * 6) * 7 * 5 * 8 -7 + 6 * 6 * 6 * 5 * (4 * (2 + 6 + 6 * 3 * 7)) -((8 + 2 + 2) * 2 * 4) + 5 + (8 + 8 + 2 + 4 * 8 + 9) + 9 -(2 + (5 * 3 * 2 + 3 + 5 + 6) * (5 + 8 + 5 + 3 + 2) + (3 + 3 + 9)) + 9 -(6 * 2 + (3 + 3 + 3 * 6 + 8)) * (6 * (4 + 9 * 9 * 9) + 6) * 4 * 2 -7 + ((9 + 3 * 6 + 4) + 4 * (3 * 9 * 7 * 2) + 2 + 7) * (2 + (5 + 8 + 7) * 9 * (6 * 2 + 3 * 7) + 3) -9 * (7 + (6 * 7 * 2 * 3 + 7) + 4 + 4) * 9 * 7 + (2 * 6) + 8 -6 * (5 + 5 * 5 * (6 * 3) + 6) -7 * 8 * 7 * (9 + (4 + 3 + 9 + 3 + 9)) * 9 -(9 + 6) + (2 + 8) * 9 * 3 -(3 * 9) * 3 * 6 * 5 * 9 -8 * 2 + (7 * 6 * 6) -(9 + 4 * 3 * 9 * 4 + 3) * 3 -2 * ((4 + 9 * 4 + 3 * 9) * 9) + 2 + 2 -8 + 2 * 7 + (4 + 8 * 6) -7 * ((7 + 8 * 9) + 4 + 4 + (7 + 4 + 7 + 5) * 3 + (6 * 9 + 2 * 9)) * 8 + (5 * 7 + (3 + 7 * 3)) -3 * 9 + (3 + (9 + 8 + 4 * 5) + (4 + 2 * 2 * 4)) * 2 + 3 -(5 + 3 * 5) * 8 * 9 * 5 + 2 * 2 -(3 * 4 + 8 + 2 * (7 * 8 * 8 * 9 * 3 * 3) * 7) + 7 + 4 * 7 * 7 -2 * 6 * 6 + (6 * 7 + 8 * 8 * (5 * 9 * 3 + 2 * 2 + 4) + (4 * 5 + 7 + 2 * 8 + 6)) + (9 * (5 + 6 + 4) * 9 * 8 * 8) * (4 + 8 + 7 + 6) -(2 * (6 * 2 * 4 * 7 * 4)) + 4 * 7 * 5 -9 * 7 + 2 + (4 * (4 * 5) * 3 + (2 * 3 + 4 * 4) * 9 * 6) -6 * 6 + (8 * 3 + 5 + (8 + 6 * 2)) * 6 + (7 * 3 * (8 * 8 * 2 * 3) * 7 * 5 * 8) -5 + 2 + 9 -7 * 9 + (8 + 3 + 9) * (3 + 8 * 7) -(7 * 9 * 3 + 8) * (8 * 9) + 7 * 8 * 9 + (2 * 3 + 6 * (6 * 2 * 7) * (2 * 7 + 6 + 8 + 4) + 8) -2 + 2 + 4 * (8 + 2 * 8 + 2) + 5 * 8 -2 * 6 * 8 + (6 * 7 * 2 + 9 + 9) -4 + (3 * 5 + 6 + (9 + 2 + 9 + 4 * 7) * 8 + 7) -9 + ((5 + 2 * 8) * 6 + 9 * 5) -6 * ((2 * 2 * 7 + 8 * 5) * (7 * 7 + 3 + 5 + 6) + 8 * 3) + 9 -2 * 5 + ((5 + 5 * 9) + 5 + 6) * 6 -5 * 5 + 7 * (2 * 9 * 2 * 5) -5 + 2 + 3 * (5 * 5 + (3 * 2) + 8) -(5 + 7 * (4 + 2 + 5 + 7 + 6)) + 9 * 9 * 5 + 4 * 2 -(6 + 8 * 8 + (4 + 5 + 9 * 6 * 9 * 7) + (2 + 7 * 3) + 2) * 5 * 7 -9 * 5 + ((3 + 7 * 7 * 3 + 3) * 6 * (5 * 5 + 8 + 9 * 2 + 7)) + 8 -(5 + (5 * 3 + 5) + (3 * 8 * 7) + 2 * 5 * (8 + 2 + 5)) + 7 * 5 -7 + ((2 * 4) * (3 + 2 * 8 * 3 * 8) * 5 + (9 + 7 + 6 + 3 + 7 * 9) * (4 * 4 + 6 + 9 * 7) * 4) -2 + (8 * 2 + 8 * 4 + 3 + 3) * 9 * 6 + 9 + 2 -8 + 3 + ((3 * 9) * 4 + 6 * (2 * 3 * 3) + 2 + 5) -3 * (7 + (2 * 5 + 7 * 6) * 6 + 9 * 3) + 7 * (3 + 2 + 4) + (5 * 4) + 9 -((2 + 6 + 4 + 4 * 9) * 2 * (4 + 8 + 4) * 7 + 2) * 3 * (6 * 6) -5 * 4 * (2 * 9) -(3 + 4 * 3 + 4) + ((9 * 2 + 2 + 8 * 8 * 9) * 7 * 7 * (7 * 8 + 3 * 2) * (8 + 2 * 7 * 7 + 7 + 7)) + 8 + ((2 * 4) + 8 * 2 + 2 + 3 + 2) -8 + ((8 * 2 * 2 * 5) + 2 * 8) -9 * ((6 * 8 + 9) * 8 * 7 * 2) * 5 * 3 * (7 * 8) + 6 -(3 + 5 + 8 + 7 * 2) * 2 + 8 * (5 * (3 + 3 * 9 * 3 * 9) * 9 + 5 * (2 + 5 + 8 * 3)) + 4 * 3 -(8 + (6 * 5 * 9 + 3 * 3) * 5) + (4 * 3 + 7) -5 + 6 + 3 + 6 + ((5 + 4 * 2 + 7 * 8 * 3) + 5) -6 * 4 + (2 * 6 * (5 * 4 + 7 + 9 * 5) + 9 * (5 * 7) + 6) * 7 * 8 -5 * 7 * ((7 * 6 * 8) + 5 + 8 * (3 * 3 * 4 * 2 + 7 + 4)) * (9 * (5 * 8) + 3) * 3 -4 + ((7 * 6 * 4 + 3 + 6 + 8) * 7 * 4 * (6 + 3 * 5)) -9 * 8 -((5 * 5) * 7 * 4 * 2 * 9 + (7 * 6 + 6 + 7 * 7)) + 8 * 7 + 6 -3 + (5 * (2 + 4 * 4 + 4) + 5) * 4 + 2 -(4 + 3 + 4) * 3 * 7 + (2 * (6 * 3 * 7 * 8) * 8) -(4 * 9 + 3 * 2 * 5) * 5 + (5 * 4 + 2) -8 + (2 + (2 + 4 + 2) + 8 + 7 + 6) + 9 + 3 * (7 * 4 * 6 + 7) -9 * 7 -9 + 7 * 6 -6 + 7 * 3 + 5 + ((4 * 6 + 9 * 6 * 6) * (8 + 8 + 2 + 8 + 6 * 5)) + 9 -3 * 6 * 3 * (4 + 8 * 6 + 5 * 7) + 8 -7 * (8 + 2 * 6 + 4 * 2) * 7 + 8 * 5 -7 + ((6 * 2 * 9 * 7 * 5 + 5) * 2 + 7 + (3 + 3 + 5 * 6) * 2) * (6 + 8 * (8 + 4 + 4 + 7 * 4 + 9) * 6) * 4 * 3 -6 + 5 * (9 + 2 * 7 + 7 + 4 * 9) * 2 * 8 -3 * 5 + (7 + 5 * 2 + 2 * 8) + 9 * 2 -8 * 8 * 4 + (3 + 7) -(2 * 8) * 2 + 7 * 6 + 5 * (7 + 4) -8 + 5 + (2 + 3 + 7 * 7 * 8 * 2) + 2 + 8 * 6 -(5 * 7) + (7 * 4 + (2 + 9 + 7 * 8) * 7 + 2 * 5) * 2 * (7 + (3 * 7 * 6) + (8 * 6 * 6 + 6)) + 8 * 9 -5 + 9 + 6 * 6 * 8 * (5 + 7 * 8 * 2) -((6 + 2) * (6 + 5 + 5 + 6 + 9) + (4 + 2 + 8 + 9) + (4 + 9 + 6 * 3 + 4 * 9) + 6) + (4 + 2 + 2) -(7 + (4 + 8 * 4 * 9)) + 6 + 8 -9 * 7 + 4 * (6 + 4 + (4 * 4 * 3 + 9) * 9 + 8) + (3 * 5 + (3 * 5 * 6 + 6 * 2 + 4) * 7 * 3) + 8 -6 + 9 * 8 * ((4 + 7 * 9 + 8) + 7) + 7 * 7 -5 * (9 + 9) -(5 + 5) + 2 + 7 * (7 + 5) + 6 -4 + 3 * (8 * 7 + 4 * 3 * (2 * 9 * 4)) * 5 -((6 + 5) * 5 * 6) + 8 + 7 + 4 -9 * 9 + (6 + 6 + (7 * 6 + 2)) -9 + 4 * 6 * 9 + 9 -4 * 9 * 8 + (5 + 5 * 8) + (2 * 6 * 7) -9 + 8 + ((9 + 4 * 6 + 3) * 8 * 8 * 4 + (7 * 5 * 9 * 9 * 4 + 4) * (4 + 6 * 7)) + 5 -5 * 7 * (6 * (2 * 2 * 9 * 3)) + 2 * 7 * 5 -9 * (6 + 7 * 7) * 3 * 2 + 4 -(2 * 3 + (7 * 3 + 7) + 6 * 3 * (4 + 7 + 6 + 2 * 9 * 5)) + 9 * 4 + 2 -9 * (4 * 6 + 8 * (4 + 4)) -(8 * 4 * 4 + 6 + (8 + 9 * 4 * 7 * 3) * 4) * 7 * 4 * 8 + (4 * 3 * 6 * 5) + 5 -(3 * 4 * 6 * 6 + 3) * 6 -9 + (5 * 8 * 8 * (2 + 2 + 7) * 8 * 5) -((5 + 4 + 2 + 9 + 2 * 8) * 2 * 2 + 4 + 7) + 2 + 6 -(5 + (9 * 5 * 9 * 9) * 3 * 7 + 2 + 9) + ((5 + 4) + 4 * (8 + 3 + 4 + 8)) * 6 + 4 * (5 * 3 + 9 + 6) + 6 -((8 + 4) * (4 * 9 * 8) * 7 + 4 + 5 * 6) + (8 * 9 * 4 * 2 + 2) -(8 * 7 + 8 + (6 + 2 + 4 + 8 * 4 * 8) + 7 * 4) * (6 * 2 + 6 + 2 + 3) + ((5 * 8 * 8 + 7 * 5 + 3) + 8 * (6 + 6 * 4)) -5 * 8 + (4 * (3 * 9 * 5 * 5 + 5)) * 7 + 3 -5 * 8 + 3 + 4 -3 + ((9 + 3 + 6) * 4 * 9 * (9 + 8 * 3 * 6) + 7 + 2) + 4 * (5 * (9 * 2 * 2) * 9 * (6 * 8 + 4 * 8)) -((2 * 5) + 5 + 4 + 9 + (4 + 5 * 4) * 6) * 8 + 3 -5 + 7 * (9 + 6 * 7 * 5) -7 * (5 * 3) + 7 * (7 + 6 + 8) -(5 + 7 * (8 + 8 * 3 * 7 * 6) + (6 * 4)) * 2 + 9 -8 * (6 + 5 + 6 + (3 + 7 * 3 + 9 * 8 * 6)) -(6 + 5) + 9 + (8 * 7 + 8) + 4 -6 + 2 + 4 * ((2 + 2 + 5) + (5 + 2 + 6) * 4 + 2) * 5 * 4 -8 + 6 -(6 + (4 * 5) + 8) * 8 * 6 + 2 * 2 + 7 -7 + 4 + ((2 + 7 * 2 + 9 + 9 * 7) + 5) + (9 * 8 + 4 + 7 + 8) + 5 -4 + 2 * 2 * 6 + 7 * ((7 * 2 + 3) + 7 + 6 * (8 + 4 + 2 * 6) + (9 + 7 + 3)) -(4 + 8 * 7 * 8 + 9 * 8) + 6 * 6 * ((9 + 2 * 2 + 7) * 3 + 3 * 9) -6 + (3 + 2 + 2 + 4 + (5 + 9)) * 8 + 4 + 7 -((5 * 4 * 7 * 9) + 7) + 7 + 4 * (8 * 7 * 3) + 3 -5 * (6 * 8) + (3 * 7 * 3 * (8 * 9 + 6 * 2) * 9 + 3) * 7 -6 * 5 + (7 * 4 * 2 * 4 * 6) + (5 + (3 + 3 + 9 + 9 * 4 * 6) + 2 + 9 * 9 * (8 + 5)) -4 * 5 * 5 * 3 + 5 -2 * 6 + (2 + 7 * 6) * (7 + 3 + 3 * 3 * (6 + 7) * 7) + (4 + (8 * 7 * 6) + 4) * 9 -3 * 9 + (8 * 4 + 8 * (6 + 7 * 3 * 3) * (6 + 8)) -2 * 6 * (9 * 6 + 8) + (2 + 3 * 7 * 4 + 3) * 2 * ((8 + 6 * 5 + 8) * 5 + 4 * 8) -6 + 3 * (6 + 3 * 7) + 8 + 7 * 3 -8 + 3 * (3 + 4 * 5 + 6 + 8) + 7 + 5 * 2 -2 * (2 + 7 + 4 + 6) + (4 * (9 * 9) + 8 * 8 + 5) + 7 * 5 * 7 -7 + (5 + (5 * 8 + 2 + 7 * 4) + (9 * 9 + 4 * 3 * 5 + 4) + 4 + 5 * 3) -(8 + 2) * 9 * 6 * 7 -3 * 5 + 5 * ((4 * 3) + 3 * 3 + 8) + 5 * 5 -4 * 7 * 6 + 4 + (4 * (4 * 5) * 3 + 2 + 8 * 4) -2 + 7 * (2 + (7 + 6 + 8 + 3 + 4) * (7 * 9 + 8 * 9) * (2 + 5 * 3 + 9 + 2 + 9)) -6 * (6 + 2 + (8 * 3 + 7 * 5 + 6 + 6) * (4 + 2 * 6 + 5) + (7 * 8 * 8 + 8) + (9 + 4 * 8 * 3 + 4)) * 3 -(6 + 9 + 8 * 6 + 8) + 4 * 7 + 2 + 5 -(9 * (2 * 9 + 8 * 5 * 2 + 3) + 9 * 7) + (6 + (7 * 6 + 9 + 9)) -6 + 6 + (2 + 7 * (5 * 3 + 3) * 7 + (2 + 6 + 8 + 3 * 8 + 4) * 2) * 5 + 5 * 4 -(6 * 7 * 6) * ((4 + 4) + 2 * 6 + 2 + 3 * 8) * 4 * 2 * 7 * 9 -9 + ((3 + 6 + 6 + 2 + 3) * 5 + 6 * 6 + 3 * (4 + 4 * 8 + 4 + 5 * 2)) * 5 * 7 -8 + (7 * 4 * 6 * 4 * 8) * ((4 + 6) * 5 + (9 * 6) + (7 + 9 + 3) * 2) * 5 * (2 * 5 * (2 * 4 * 8 * 5 * 4 * 3) * 9 * 3) + 5 -(7 + 2 + (6 * 7) * 5) * 3 -3 + 5 * 9 + (9 + 9) * 3 -9 * 3 + (9 * 4 * 9) * 8 * 3 -4 * 4 + 6 + (7 * 8 * 6 * (8 * 6) * 6) -(6 + 5 * 7 + 3) + (4 * 8 * (5 * 7 + 9 + 9 + 2)) + 5 -2 + (2 + 9 * (4 * 7 * 3 * 3) + 8) + 9 * 9 + (6 + 9 * (4 * 5 + 6 * 6 + 8)) * 5 -9 * 7 + 9 -7 + 7 * 7 * (5 + 5 + 7 * 7) * 6 -2 + 2 + (6 + (8 + 6 * 9 + 9)) -(7 + 6 + 3 * 3) * 8 -8 + (7 + 9 + 9 * 2 * 5 * 3) + 5 * 7 + 3 -5 + 8 * (5 + 2 * 7 + 4 * 4) + ((8 * 8 + 2 + 5 + 5) * 9 * 3 + 9 * 6 * (4 + 7)) * 2 -8 * 5 * 3 + 2 * (8 * 8 + 8 * 9) + (5 * (9 + 3 * 2 + 7 + 3) * 2) -8 + 4 + 2 + 4 + 8 * 4 -9 + 2 * 8 + 8 * ((2 + 8 * 2) + 2 + (8 * 4 + 7 + 7 + 9)) + 9 -7 * (9 + 6 + 8 * 7) + 5 + (8 * 7 + (4 + 3 + 9 * 6) + 9 + (5 * 7 + 5 + 6 * 2 + 2) + 2) * 4 -7 + (9 * 7 + 5 * 9 + (4 + 9 * 2 + 8 * 8 + 3) * 9) -(5 * 9) + 9 + (7 + 5 * 2 * 2) * (2 + (8 + 4 + 5 * 5 + 2)) * 6 + 6 -9 * (9 * 3) * 2 + (2 + 3 * 6 * (8 * 4) * 4) + (9 + 8 * 3 * (7 + 6 * 7 * 6 * 5) + 3) -6 * 9 * (9 + 9 * 9 * (3 + 2 * 9 * 6 * 6) + (4 + 8) * 3) * 4 + 7 -(8 * 4 + 8 * 3 * 7) + ((9 + 9) + 3 * 3 * 5 + (3 * 7 * 3 * 9 + 4)) + 9 + 9 + ((9 * 6 * 7) * 9 + 8 + 9 * 8) + 9 -(3 * (3 * 2) + 5 + 9) * 6 + 5 * 3 -(5 + 5) + 5 * 8 * 3 * 3 * (9 * 9 * (4 + 5 + 9) + 4) -3 * 8 + 9 + 8 + (6 + (9 * 3 + 7) + 9 * 3 * 6 * 2) + 6 -3 + 9 + 3 * 5 -5 * 7 + 4 * (2 * 7 * 7 * 5 * 7 + 9) * 4 -8 * (3 + (8 * 7 + 8 + 6 * 5 + 5) * 4) -9 * 6 * (8 + 6) * 5 + 7 * 6 -(8 + 2 + (4 * 9 * 9 + 3) + 5) + 4 -(9 * 7 + 3 + 8) * 3 * 5 + 9 + (2 * 9 + 7 + 8 + 8 + 5) -3 * (8 + 9) * 6 -4 + 6 + 6 + ((5 * 5 * 2 + 9 + 7) + 6 * (6 + 4 * 8 * 9 + 8) * 4 + 9 + (9 + 4 * 5)) + 7 -8 + 8 * (9 + 8 * (2 * 7)) + 6 * 9 -(3 + (8 + 2) + 8 + 8 * 6) * 5 -(9 * (2 + 3 + 3 + 5) * 8 * 7) + 6 + 9 + 6 -(8 * (7 * 5)) + 6 * 6 * ((3 * 8 + 7 + 2 * 7) + 6 * 3 + 6 + 9 * 9) * 4 -(6 * (4 + 3 * 3 * 9 * 3 + 6) + (7 * 7 + 6) + 8 * (3 + 2) * 5) + 4 -(5 + 4 * 3 * (8 * 6) * (3 + 6 + 3) + 7) + 8 + ((3 * 7) + 9 + (7 + 4)) * 3 -(9 * 5 * 4 * 6) * 6 * 2 + ((8 + 6 * 5) + 4 + 5) * 9 -(3 * 8 + 8) * 9 + (8 + 4 * 7 + 8 + 7 + (7 + 8)) -6 + ((8 + 9 + 9 * 9) + 2) * 5 + 7 -2 + (8 + (6 * 9 + 6 + 2 + 3 * 8) + 6 * 9 + 3) + 9 + 2 -6 + (5 + 3) * 3 + 9 * 3 -9 * ((9 + 7 * 2 + 5 * 7 + 2) * (9 * 5 + 6)) + ((9 * 7) + 4) * 3 -9 * (6 * 6 + (5 + 7 * 6) * (5 + 3) + 4 + 9) * 5 -(9 * 7 * 9) + 5 * 9 * 8 -7 * ((8 + 9 + 5 * 2 * 2) * 5 * 5 * 8 + 4) * (5 * 7) + 9 * (7 + (8 + 2)) -(3 * 6 * 6) + 7 + 2 + (9 * 2 * 4 + (5 * 8 + 8 * 6) + 8 + 6) * 9 -3 + (6 + 7 * 5 + 4 * 6) * 5 * 4 * 2 * ((3 + 3) * 9 + 9 * 5 * 4) -5 * (5 + 2) * 6 + (4 * 6) + 4 + 9 -(6 + 9) * 2 * 2 + 2 + (3 + 9 * (3 * 7 + 6 + 7 + 9 * 2) + 9 * 5 * (9 + 2)) -9 + (2 + 3 * 8 * 3 + 8 + 8) + 8 -8 * (3 + 4 + 9) + 5 + (2 + 4 + 3 * 4) -(2 + 6 + 4 * 9) * 9 * 3 * (5 + 5 * 9 + (6 * 5 + 7 * 6) * 8 + (7 + 7 * 8 * 8 + 8 + 6)) -6 * 6 * 6 + ((3 * 5 * 6 + 8 + 3 + 7) + 5 * (2 + 3 + 5 * 9 * 5) * 2) + (9 * (7 * 9 + 9) + (8 + 3 + 9 + 5 + 6) + 5 + 9) * 7 -((4 * 3 + 9 * 7 + 3 * 9) * 5) * 5 * 6 * 6 + 7 -((6 * 3 + 8 + 6) * 6 + 4 + (6 + 5 + 6 * 5 + 8 * 2) * 7 + 2) * 9 * 6 -9 + 5 * 2 * (8 + 8 * 9 + 7 * (4 * 8 + 2)) + 8 * 5 -(4 + 7 * 4 * 4) + 5 * 4 * 2 -(8 + 3 * 3 * 6 * 4 * 7) * 7 * 3 + 8 -3 * 8 + (5 + 7 * 7 + 6 * (4 * 6 * 6 * 9 * 6 + 5) * 2) * 7 + 6 * 7 -5 + 2 + (7 + 9 * 3 + 8 * (2 * 4 + 4 * 3 * 9)) * 5 * 9 + (5 * 7 + 6 * 2 + 5 + 9) -9 * 3 * (6 * 7 * 7) * 2 -3 + 8 * (2 + 6 + (8 + 8 + 9) * (3 * 5 * 6 + 7 + 2) + 2 * 9) + 4 * 7 -4 + (7 + 9 * 8 * 7) * (9 + 7) * 7 + 6 * 3 -(5 + 4 * 4) + ((8 + 9 + 4 * 9 * 5) * (3 * 3) * 8 + (6 + 5 + 8 * 7)) * 9 + 8 * 8 -6 + (4 * 9 * 2 + 2 * 2 + 6) + (9 * 7 + (6 + 5)) * (7 * (2 + 5) * 9 + 7 + 5) * 4 -(2 + 4 * 7 * 7 + (2 * 7) + 8) + 5 * 6 * 9 -7 + 7 + (5 + 5) + 7 * 2 -4 * (9 * 5) * 5 * (8 + 4 + (4 + 3) + 3) -4 * ((7 + 5) + 3 * 4) * 5 * 2 + 6 + 3 -(7 + 3 * 2 + (4 * 2 * 5 + 9 * 5) + (8 * 2 + 5 + 9 + 8) + 7) + 8 + (7 + 9 + (4 + 9) * (9 + 6 + 2 + 8) + (4 + 2 + 8 + 9)) + 3 * (9 * 7 * 3) -5 * (6 * 6 * 8 + 6) * 4 + 9 -(4 + (7 * 7 + 2 + 8 * 3 * 3) + 9 + 4 + (9 * 2) + 6) + ((2 + 7 * 2) * 5 + 3) * 8 + 8 -2 * 5 * (6 * 6 + 4 + 5 * 2 + 9) + 5 * 7 + (5 + 8) -9 * (3 * 9 + (8 + 5) + 6 + (6 * 7 * 9 + 3 + 8 * 4) * 9) + (6 + 3 + 9 + 9 * (5 * 3 + 8) * 8) -(6 * 9 * (6 + 5 * 2 + 8 + 9 + 8) + 5 + 6) + 4 -(3 + 5 * 9) + (8 * 2 * 4 + 3 + 9 * 3) * 7 -((3 + 2 * 9 + 7 * 9) * (9 * 7 * 3 + 5 + 6 * 3) + 6 * 8 * (8 + 9 + 9)) * (7 + (7 * 3) * 9 * 3 + 5) * 5 -((9 * 7) * 2 + 5 + 4) + (2 + 5 * 5) -(3 + 6 + 2 * 7) + 6 + 6 -9 * ((4 * 6 + 4 + 5 * 7 * 9) + 9 + 9) + 5 -6 * 8 * 4 + 9 + 4 -5 + (9 * 5) * 6 + (3 * 4 + 7 * 7 + 7) + 7 -(8 * 6 * 8 * 3 * 8 + 7) + 4 + 4 * (4 * 6 * (9 + 5 * 2) + 5) * (4 + 5 * 6 + (6 * 4 * 6 * 5) * 8 + (4 + 5 * 2)) -3 * 8 + 8 -5 * 8 * (9 + (8 + 2 + 4)) -9 + (2 * 5 * 9 + 2) + 3 -(2 + 6 + (3 * 6 + 2 * 4 + 4) * 3 * 7 + 6) * 6 * 6 + 6 -((9 + 3 * 7) + (2 + 8)) * ((2 * 3 + 3 + 4) * 8 + 5 + 9 + 3 * 9) -(3 * 9 + 3 + 6 * 8 * 7) * 3 * 5 + ((6 + 8 + 4) + 8 * (7 * 4 + 6 + 5) * 3 * 9) -9 * 4 + 7 + (8 + (4 + 6 * 6 * 7 + 9) * 7 + 4 * (5 + 7 + 7) + 2) * 4 * 5 -2 * 7 + ((6 + 4 + 3) + (8 * 8 * 7 + 2 + 4) + 3 * 9 * 9 + 7) -4 + 6 * 2 + 8 + (6 * 9 * 6 + 6) * 9 -3 + 3 * 8 + 9 * (7 + (2 + 8 + 5 + 5) * 7 + 3 * 2) * (7 * 7 + 7) -9 + 4 * 9 * 2 * (4 * 9) -9 + 4 * 5 + (4 * (2 * 8 * 5 * 7 * 8) * (3 * 8) + 6) + 3 * 4 -7 + 3 * (8 + 7 * 9 * (2 + 9 + 4) * (3 + 5) + (7 * 9 * 2 * 8 + 9 + 8)) * (9 * (2 * 7 * 9) + (6 * 8 + 9 + 7) + 3 + (2 + 3 + 4) + (5 + 8 + 4 * 9 + 7)) -3 * 9 + 4 * (7 * (5 + 4 + 9 * 3 + 3 * 4) + 6 * 6) -3 + (8 + 8 * 9) + 9 + 5 * (7 + 4 * 3 * (7 * 4 + 2 + 8 * 4)) -(8 * 2 * 4 * 6 + 4) * 5 * 9 * (8 * 5 * 5 + 7 + 8 + 5) -2 + (5 * 2 + (2 * 8 * 3 * 2) * 5 * 5) + 4 + 9 + 2 -7 + (5 + 5 * 3) -4 * 6 * (5 + 2 * 3 * (3 + 8 * 3)) + 9 * 4 -2 * 7 * (8 * (2 * 3 * 8 * 8 * 5) + 2 + 2 + 5) * 7 -2 + ((5 + 2 * 8 * 3 * 4 * 7) + 4 + 3 + 5 * 5 + (5 * 8 + 6)) -3 * 7 * ((9 + 8) * 8 * 3) + (9 * (8 + 8 + 2)) * 9 * 9 -5 + (5 * (7 + 8 * 2 * 9) * (7 + 5 + 2 + 5 + 4 + 2) * 4 * 7) + 2 + ((6 * 7 * 2 + 9) * 6) * 9 -6 * 6 + (2 + (6 + 4) + (4 * 8 + 2 + 6) + 8 * 3) -2 * 3 + 5 + ((7 * 8 + 8 * 5 * 8 * 9) + 2 * 4 + 2 + 8) -(8 + (9 * 9)) + (6 + 2 * 7) -2 + 5 + 4 + 8 + 4 -8 + 2 + ((5 * 5 + 5) + (6 * 8 + 6 * 3) * 8) * 7 + 6 -9 * ((2 + 5) + 2 + 8 * (5 + 7 + 5 * 3) * 6) + 9 -9 + 6 + ((9 * 7 * 7) + 5 * 9 + 8 * (4 * 9 + 3 + 3) * 5) + 7 * 2 -(3 * 3 + 5 + 6 + 5 * 5) + 8 * 4 * 4 + 2 -7 * 2 + 3 + 9 * 4 + 4 -5 + (2 + 9) + 5 + 3 + 8 * 6 -9 * 3 + 5 + 3 * (6 * (4 * 8 + 6 * 9 * 9 + 6) * 7 + (9 * 2 * 3 + 7)) -7 * 8 + 3 + (7 + 3 + 9 + 7 * 2) + (9 + 6 * 3 * 3) -((9 * 7) + 2) + 9 * (4 + 4) -((9 + 5) * 2 + (2 + 4 * 4 * 3 + 9 * 9)) + (7 + (7 * 6 + 4) + (9 + 7) * 9) + 8 + 9 -4 + 7 * 3 + 2 * (7 + 2 * 8 + 9 * 3 * 3) -5 + 3 -(2 + 3 * 5 * 6 * 2 * 2) + (8 * 8 + 3 * 3 + 7 * (7 + 3 + 9 * 8)) + 7 + 5 -(7 + 3 * 5) * 7 -4 * 6 + (6 + 7 + 9 * (3 + 4 * 4) + 3 + 2) * (6 + 8 * 9 * 6 * 5 + (2 * 5 * 8 + 8 + 5 * 2)) -8 * (7 + 5 * 8 * 7 + 6) * ((4 + 5) * 9 + 9 * 2 * 7) * 5 + 8 -6 + 8 * 5 -(8 * (7 * 4) + 5 * 9 * 9 + 3) * 7 -8 + 5 + 7 + (8 + (6 + 5) + 7 + (7 * 9 * 2 * 6 + 4) * 8) * 2 -((4 + 3 * 9 + 9) + 4 * (9 + 2 + 4 + 8 + 9) + 5 + 7 * 4) + 6 * 9 -9 + (9 * 8 * 3) * (8 * 6 * 7 * 8 * 6) -5 * 7 * (9 * 3 + 6 + 8 + 8 + 5) -2 + (2 + 7 * (5 * 7 * 3 + 2 * 7 * 8) + 7 + (5 + 8 * 5)) * 8 * 3 * 3 + ((6 * 5 * 8 + 8 + 9) + 6 * (8 + 3) * 6) -9 * 5 * 9 * 8 -6 + 5 + 7 + 2 + (8 + (5 * 5 * 7 * 3 + 7 + 7) + 2 + 7) -4 + 4 * 2 + 3 * 7 + 6 -4 + (5 + 3 + 2 * 8 * 5) + 2 -2 * 2 * 8 + (6 + 9 * 4 * 7 * (4 + 7 * 7 * 2) + 2) + 9 -4 * 7 * 8 + (3 * (9 * 2 + 4 * 4 * 5 * 5) + 5 * 2 * 7 + 7) + 8 + 5 -(8 + (7 + 9)) * 6 -9 + ((8 * 7 + 5 * 3) + 7 + (6 * 4 * 6 + 8)) * 5 -3 + (6 + 5 * 7 + 4 * 2) * (3 * 3 + 7 * 6 + 4 * (6 + 7 * 3)) * (4 + 8 * 9) -7 * (7 + (4 * 3) + 4 + 5 * 4) -8 * 2 * (9 * 7 + 5 + 8) + 4 * 8 + (3 * 3) -7 * (3 + 2 * 3) + ((2 * 8) * 4) * 8 -((8 + 3 + 4 + 7 * 5 * 6) + (3 + 2) * (8 + 6 * 9 * 4 + 9 + 2)) + 3 + 8 * (8 + (4 + 9 * 2 + 8 + 6 + 9) * 9 * 3 * 3 + 3) + 9 -4 * (7 * 4 * 8 * 5) + 7 * 8 * (2 * 4 * 5 * 4) -(3 + 8 + 6 * 6 * 4) * (4 * 6 + 8 + 3 * 6) * 5 -2 + (3 + (6 + 9 + 6 * 3) * 7 + (9 + 7 + 8)) + 9 * 7 -9 + 7 * (4 * 8 + 3 * 2 * 9 + 4) + ((6 * 8) + 3 + 7 + 7 * 8 * (9 + 5)) * 9 + ((3 * 9 * 8 * 8) + (5 + 2) + 2 * 4 * 3 + 8) -6 * 3 + 3 * (8 * 7 + (2 * 8 + 4 + 6 + 5 * 6) + 3 + 3 * (9 * 9 * 8 + 2 * 5)) + (3 + (3 + 5 + 6) + 8 + 9 * 4) + 8 -9 * ((7 * 6) * 9 * 2) * ((8 * 9 * 3 + 8 * 2) * 6 + 8 + 9 * 5 + 3) + (5 * 4) * (7 + 4) * 7 -(4 * 7 + 8 * 9) + (7 + (3 + 9 * 2 * 9 * 4) * 9 * 3 * 4 * 7) * 4 * 6 + 2 -6 + 9 * 6 + (2 + 9 * 4) * 8 -3 * (6 * 5 + (7 * 6 * 5 * 8) + 7 * 5 * 4) + (3 * (6 * 5 + 7 * 9) + (4 * 9 + 2 * 3) * 7 * 8 * 3) + 9 + 5 + 9 -3 + (2 + (6 * 3 * 8 + 3) + 4) * (8 * 9) * 7 + 6 -(2 * (7 * 9)) * 6 + 7 * 2 + 9 * 4 -((5 + 4 * 2) + (3 * 2 * 6 + 3 + 5 * 5) * 4 + (2 + 5 * 9 * 8 + 3 * 5) * (7 * 2 * 8 * 2) + (5 * 4)) + 7 * 8 + 9 -(8 + 4 + (5 * 4 * 6) * 2 * 8) * (6 + (9 * 4 * 5) * 7 * 5 * 4) + 3 + ((2 + 2) + 7 + 5 * 7 * 2 + 4) * 5 + (9 * 3 * (9 + 3 * 4 * 8 * 7 + 9)) -6 * 7 * 3 * (7 * 2 + (6 * 4 * 5) * (5 * 3 * 8 + 8 + 3 + 9)) * (7 * 9 + 7 * 5) -4 + 2 + (3 * (9 + 7) * 6) -(8 + (8 * 4)) + (7 + 3 * 5) + 4 + 4 + 7 -(7 + 7 * 4 * 4 * 4) * 4 + 3 \ No newline at end of file diff --git a/day18/solution.spec.ts b/day18/solution.spec.ts deleted file mode 100644 index b59fd3f..0000000 --- a/day18/solution.spec.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { loader } from '../lib/loader' -import { calcTokens } from './calcTokens' -import { groupAdditions } from './groupAdditions' - -const load = loader(18) -const input = load('input') - -describe('Day 18: Operation Order', () => { - describe('calc', () => { - it.each([ - ['1 + 2', 3], - ['3 * 3', 9], - ['1 + 2 + 3', 6], - ['1 + 2 * 3', 9], - ['1 + 2 * 3 + 4 * 5 + 6', 71], - ['(2 * 3)', 6], - ['1 + (2 * 3)', 7], - ['1 + (2 * 3) + 4', 11], - ['(2 * 3) + (3 * 4)', 18], - ['1 + (2 * 3) + (4 * (5 + 6))', 51], - ['2 * 3 + (4 * 5)', 26], - ['5 + (8 * 3 + 9 + 3 * 4 * 3)', 437], - ['5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', 12240], - ['((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', 13632], - ])('%s = %d', (expression, expected) => - expect(calcTokens(expression)).toEqual(expected), - ) - }) - - describe('Part 1', () => { - it('should solve', () => - expect(input.map(calcTokens).reduce((total, n) => total + n, 0)).toEqual( - 7293529867931, - )) - }) - - describe('Part 2', () => { - describe('calc (addition is evaluated before multiplication)', () => { - it.each([ - ['1 + 2 * 3 + 4 * 5 + 6', 231], - ['1 + (2 * 3) + (4 * (5 + 6))', 51], - ['2 * 3 + (4 * 5)', 46], - ['5 + (8 * 3 + 9 + 3 * 4 * 3)', 1445], - ['5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))', 669060], - ['((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2', 23340], - ])('%s = %d', (expression, expected) => - expect(calcTokens(groupAdditions(expression))).toEqual(expected), - ) - }) - it('should solve', () => - expect( - input - .map(groupAdditions) - .map(calcTokens) - .reduce((total, n) => total + n, 0), - ).toEqual(60807587180737)) - }) -}) diff --git a/day18/toExpression.ts b/day18/toExpression.ts deleted file mode 100644 index e6b2f91..0000000 --- a/day18/toExpression.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Token } from './tokenize' - -export const toExpression = (token: Token): string => { - switch (token.type) { - case 'value': - return `${token.value}` - case 'op': - return `${toExpression(token.left)} ${token.op} ${toExpression( - token.right, - )}` - case 'group': - return `(${toExpression(token.group)})` - default: - throw new Error(`Unexpected token ${token.type}`) - } -} diff --git a/day18/tokenize.ts b/day18/tokenize.ts deleted file mode 100644 index 7b6350e..0000000 --- a/day18/tokenize.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { - isNumber, - isOpeningParenthesis, - isOperator, - isSpace, - findClosing, -} from './calc' - -type Noop = { type: 'noop' } -export type Value = { type: 'value'; value: number } -export type Group = { type: 'group'; group: Token } -export type Op = { type: 'op'; op: '+' | '*'; left: Token; right: Token } -export type Token = Noop | Value | Op | Group - -const findNextToken = (expression: string, groupAdditions: boolean): Token => { - let i = 0 - let token: Token = { type: 'noop' } - while (i < expression.length) { - const c = expression[i] - if (isNumber(c)) { - if ( - groupAdditions && - token.type === 'group' && - token.group.type === 'op' && - token.group.op === '+' - ) { - token.group.right = { type: 'value', value: parseInt(c, 10) } - } else if (token.type === 'op') { - token.right = { type: 'value', value: parseInt(c, 10) } - } else { - token = { type: 'value', value: parseInt(c, 10) } - } - i++ - } else if (isSpace(c)) { - // pass - i++ - } else if (isOperator(c)) { - if (groupAdditions && c === '+') { - console.dir(token) - if (token.type === 'op' && token.right.type === 'value') { - token.right = { - type: 'group', - group: { - type: 'op', - op: '+', - left: token.right, - right: token, - }, - } - } else { - token = { - type: 'group', - group: { - type: 'op', - op: '+', - left: token, - right: { type: 'noop' }, - }, - } - } - } else { - token = { - type: 'op', - op: c as '+' | '*', - left: token, - right: { type: 'noop' }, - } - } - i++ - } else if (isOpeningParenthesis(c)) { - const closing = findClosing(expression, i) - if (token.type === 'op') { - token.right = { - type: 'group', - group: findNextToken( - expression.substr(i + 1, closing - i - 1), - groupAdditions, - ), - } - } else { - token = { - type: 'group', - group: findNextToken( - expression.substr(i + 1, closing - i - 1), - groupAdditions, - ), - } - } - - i = closing + 1 - } else { - throw new Error(`Unexpected token ${c} at position ${i}!`) - } - } - return token -} - -export const tokenize = (expression: string, groupAdditions = false): Token => { - const nextToken = findNextToken(expression, groupAdditions) - return nextToken -} diff --git a/lib/uniqueCombinations.spec.ts b/lib/uniqueCombinations.spec.ts deleted file mode 100644 index c6fa97e..0000000 --- a/lib/uniqueCombinations.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { uniqueCombinations } from './uniqueCombinations' - -const seq = [2, 3, 5, 7] -describe('uniqueCombinations', () => { - it.each([ - [0, seq, []], - [1, seq, [[2], [3], [5], [7]]], - [ - 2, - seq, - [ - [2, 3], - [2, 5], - [2, 7], - [3, 5], - [3, 7], - [5, 7], - ], - ], - [ - 3, - seq, - [ - [2, 3, 5], - [2, 3, 7], - [2, 5, 7], - [3, 5, 7], - ], - ], - [4, seq, [[2, 3, 5, 7]]], - [5, seq, []], - ])('combinations of length %d', (length, items, expected) => - expect(uniqueCombinations(length)(items)).toEqual(expected), - ) -}) diff --git a/lib/uniqueCombinations.ts b/lib/uniqueCombinations.ts deleted file mode 100644 index 4e5f2a5..0000000 --- a/lib/uniqueCombinations.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Returns a list of unique combinations of length n of the items - */ -export const uniqueCombinations = (len: number) => (items: T[]): T[][] => { - // Trivial case: only one item per combination - if (len === 1) return items.map((i) => [i]) - // Otherwise: go over all items in the list ... - return items.reduce((combinations, item, i) => { - // ... and combine it with the remaining entries in the list - const pairs = uniqueCombinations( - // which means the list will be one item less - len - 1, - )( - // and starts from the next entry in the list - items.slice(i + 1), - ) - // which is all previous entries - combinations.push( - // and this element, combined with all found pairs - ...pairs.map((p) => [item, ...p]), - ) - // Return the result - return combinations - }, [] as T[][]) -} diff --git a/package-lock.json b/package-lock.json index 389dd3a..949b8a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,818 +1,7559 @@ { "name": "@coderbyheart/advent-of-code", "version": "0.0.0-development", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "packages": { + "": { + "name": "@coderbyheart/advent-of-code", + "version": "0.0.0-development", + "hasInstallScript": true, + "license": "MIT", + "devDependencies": { + "@commitlint/cli": "15.0.0", + "@commitlint/config-angular": "15.0.0", + "@nordicsemiconductor/asset-tracker-cloud-code-style": "9.2.26", + "@types/jest": "27.0.3", + "@types/node": "16.11.11", + "eslint": "8.3.0", + "husky": "7.0.4", + "jest": "27.4.2", + "lint-staged": "12.1.2", + "prettier": "2.5.0", + "ts-jest": "27.0.7", + "typescript": "4.5.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" + "dependencies": { + "@babel/highlight": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "node_modules/@babel/compat-data": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", + "semver": "^6.3.0", "source-map": "^0.5.0" }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "@babel/generator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", - "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "requires": { - "@babel/types": "^7.12.5", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "bin": { + "semver": "bin/semver.js" } }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "node_modules/@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", "dev": true, - "requires": { - "@babel/types": "^7.10.4" + "dependencies": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "node_modules/@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", "dev": true, - "requires": { - "@babel/types": "^7.12.1" + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", "dev": true, - "requires": { - "@babel/types": "^7.12.5" + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", "dev": true, - "requires": { - "@babel/types": "^7.10.4" + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true + "node_modules/@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", "dev": true, - "requires": { - "@babel/types": "^7.12.1" + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", "dev": true, - "requires": { - "@babel/types": "^7.11.0" + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true + "node_modules/@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/parser": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", - "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "@babel/plugin-syntax-async-generators": { + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", + "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-bigint": { + "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-import-meta": { + "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-json-strings": { + "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-logical-assignment-operators": { + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-numeric-separator": { + "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-object-rest-spread": { + "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-optional-catch-binding": { + "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-optional-chaining": { + "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz", + "integrity": "sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==", "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "node_modules/@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/traverse": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", - "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "node_modules/@babel/traverse": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.5", - "@babel/types": "^7.12.5", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/types": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.5.tgz", - "integrity": "sha512-gyTcvz7JFa4V45C0Zklv//GmFOAal5fL23OWpBLqc4nZ4Yrz67s4kCNwSK1Gu0MXGTU8mRY3zJYtacLdKXlzig==", + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" + "engines": { + "node": ">=4" } }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "node_modules/@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@bifravst/code-style": { - "version": "8.0.134", - "resolved": "https://registry.npmjs.org/@bifravst/code-style/-/code-style-8.0.134.tgz", - "integrity": "sha512-3MqjsPoE/GzFa34rZ/bU7Qq8G+kGESikMdaZopa47wEo9NgvMtfdu4RivgLvNqMPcxqBZdR4eN1un3G4Laj10Q==", - "dev": true + "node_modules/@commitlint/cli": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-15.0.0.tgz", + "integrity": "sha512-Y5xmDCweytqzo4N4lOI2YRiuX35xTjcs8n5hUceBH8eyK0YbwtgWX50BJOH2XbkwEmII9blNhlBog6AdQsqicg==", + "dev": true, + "dependencies": { + "@commitlint/format": "^15.0.0", + "@commitlint/lint": "^15.0.0", + "@commitlint/load": "^15.0.0", + "@commitlint/read": "^15.0.0", + "@commitlint/types": "^15.0.0", + "lodash": "^4.17.19", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/config-angular": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-angular/-/config-angular-15.0.0.tgz", + "integrity": "sha512-1gpyAZkGB+v9hTvw4G8AGU7vzq49/pANifShUsoyuSLAmHzxC3YgE+ZyqlVoB+T6gjE90NXjUQbLmNpi/7ZFYg==", + "dev": true, + "dependencies": { + "@commitlint/config-angular-type-enum": "^15.0.0" + }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/config-angular-type-enum": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-angular-type-enum/-/config-angular-type-enum-15.0.0.tgz", + "integrity": "sha512-KBGoII2yo76KtbKbeCym5PxCt5CZvti7YbCEGOF5GiyZd/9AaJur/UhbzX3pcoLMgXd9u3Ru+qydm79TlRLuJA==", + "dev": true, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/ensure": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-15.0.0.tgz", + "integrity": "sha512-7DV4iNIald3vycwaWBNGk5FbonaNzOlU8nBe5m5AgU2dIeNKuXwLm+zzJzG27j0Ho56rgz//3F6RIvmsoxY9ZA==", + "dev": true, + "dependencies": { + "@commitlint/types": "^15.0.0", + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-15.0.0.tgz", + "integrity": "sha512-pyE4ApxjbWhb1TXz5vRiGwI2ssdMMgZbaaheZq1/7WC0xRnqnIhE1yUC1D2q20qPtvkZPstTYvMiRVtF+DvjUg==", + "dev": true, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/format": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-15.0.0.tgz", + "integrity": "sha512-bPhAfqwRhPk92WiuY0ktEJNpRRHSCd+Eg1MdhGyL9Bl3U25E5zvuInA+dNctnzZiOBSH/37ZaD0eOKCpQE6acg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-15.0.0.tgz", + "integrity": "sha512-edtnkf2QZ/7e/YCJDgn1WDw9wfF1WfOitW5YEoSOb4SxjJEb/oE87kxNPZ2j8mnDMuunspcMfGHeg6fRlwaEWg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^15.0.0", + "semver": "7.3.5" + }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/lint": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-15.0.0.tgz", + "integrity": "sha512-hUi2+Im/2dJ5FBvWnodypTkg+5haCgsDzB0fyMApWLUA1IucYUAqRCQCW5em1Mhk9Crw1pd5YzFNikhIclkqCw==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^15.0.0", + "@commitlint/parse": "^15.0.0", + "@commitlint/rules": "^15.0.0", + "@commitlint/types": "^15.0.0" + }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/load": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-15.0.0.tgz", + "integrity": "sha512-Ak1YPeOhvxmY3ioe0o6m1yLGvUAYb4BdfGgShU8jiTCmU3Mnmms0Xh/kfQz8AybhezCC3AmVTyBLaBZxOHR8kg==", + "dev": true, + "dependencies": { + "@commitlint/execute-rule": "^15.0.0", + "@commitlint/resolve-extends": "^15.0.0", + "@commitlint/types": "^15.0.0", + "@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2", + "chalk": "^4.0.0", + "cosmiconfig": "^7.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "typescript": "^4.4.3" + }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/message": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-15.0.0.tgz", + "integrity": "sha512-L8euabzboKavPuDJsdIYAY2wx97LbiGEYsckMo6NmV8pOun50c8hQx6ouXFSAx4pp+mX9yUGmMiVqfrk2LKDJQ==", + "dev": true, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/parse": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-15.0.0.tgz", + "integrity": "sha512-7fweM67tZfBNS7zw1KTuuT5K2u9nGytUJqFqT/1Ln3Na9cBCsoAqR47mfsNOTlRCgGwakm4xiQ7BpS2gN0OGuw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^15.0.0", + "conventional-changelog-angular": "^5.0.11", + "conventional-commits-parser": "^3.2.2" + }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/read": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-15.0.0.tgz", + "integrity": "sha512-5yI1o2HKZFVe7RTjL7IhuhHMKar/MDNY34vEHqqz9gMI7BK/rdP8uVb4Di1efl2V0UPnwID0nPKWESjQ8Ti0gw==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^15.0.0", + "@commitlint/types": "^15.0.0", + "fs-extra": "^10.0.0", + "git-raw-commits": "^2.0.0" + }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-15.0.0.tgz", + "integrity": "sha512-7apfRJjgJsKja7lHsPfEFixKjA/fk/UeD3owkOw1174yYu4u8xBDLSeU3IinGPdMuF9m245eX8wo7vLUy+EBSg==", + "dev": true, + "dependencies": { + "import-fresh": "^3.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/rules": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-15.0.0.tgz", + "integrity": "sha512-SqXfp6QUlwBS+0IZm4FEA/NmmAwcFQIkG3B05BtemOVWXQdZ8j1vV6hDwvA9oMPCmUSrrGpHOtZK7HaHhng2yA==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^15.0.0", + "@commitlint/message": "^15.0.0", + "@commitlint/to-lines": "^15.0.0", + "@commitlint/types": "^15.0.0", + "execa": "^5.0.0" + }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-15.0.0.tgz", + "integrity": "sha512-mY3MNA9ujPqVpiJjTYG9MDsYCobue5PJFO0MfcIzS1mCVvngH8ZFTPAh1fT5t+t1h876boS88+9WgqjRvbYItw==", + "dev": true, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/top-level": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-15.0.0.tgz", + "integrity": "sha512-7Gz3t7xcuuUw1d1Nou6YLaztzp2Em+qZ6YdCzrqYc+aquca3Vt0O696nuiBDU/oE+tls4Hx2CNpAbWhTgEwB5A==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/types": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-15.0.0.tgz", + "integrity": "sha512-OMSLX+QJnyNoTwws54ULv9sOvuw9GdVezln76oyUd4YbMMJyaav62aSXDuCdWyL2sm9hTkSzyEi52PNaIj/vqw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@endemolshinegroup/cosmiconfig-typescript-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz", + "integrity": "sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==", + "dev": true, + "dependencies": { + "lodash.get": "^4", + "make-error": "^1", + "ts-node": "^9", + "tslib": "^2" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "cosmiconfig": ">=6" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", + "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.0.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", + "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "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/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.2.tgz", + "integrity": "sha512-xknHThRsPB/To1FUbi6pCe43y58qFC03zfb6R7fDb/FfC7k2R3i1l+izRBJf8DI46KhYGRaF14Eo9A3qbBoixg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.4.2", + "jest-util": "^27.4.2", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.2.tgz", + "integrity": "sha512-0mPM61tDbu8yc9CMKH9bvV+g+17VUpdWQtU1x6P1gk4AKj8iywWi8zBmEIl7pTGjUtYA92CNc/LlBfKCioBOow==", + "dev": true, + "dependencies": { + "@jest/console": "^27.4.2", + "@jest/reporters": "^27.4.2", + "@jest/test-result": "^27.4.2", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^27.4.2", + "jest-config": "^27.4.2", + "jest-haste-map": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.2", + "jest-resolve-dependencies": "^27.4.2", + "jest-runner": "^27.4.2", + "jest-runtime": "^27.4.2", + "jest-snapshot": "^27.4.2", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", + "jest-watcher": "^27.4.2", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.2.tgz", + "integrity": "sha512-uSljKxh/rGlHlmhyeG4ZoVK9hOec+EPBkwTHkHKQ2EqDu5K+MaG9uJZ8o1CbRsSdZqSuhXvJCYhBWsORPPg6qw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "jest-mock": "^27.4.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.2.tgz", + "integrity": "sha512-f/Xpzn5YQk5adtqBgvw1V6bF8Nx3hY0OIRRpCvWcfPl0EAjdqWPdhH3t/3XpiWZqtjIEHDyMKP9ajpva1l4Zmg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.4.2", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.4.2", + "jest-mock": "^27.4.2", + "jest-util": "^27.4.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.2.tgz", + "integrity": "sha512-KkfaHEttlGpXYAQTZHgrESiEPx2q/DKAFLGLFda1uGVrqc17snd3YVPhOxlXOHIzVPs+lQ/SDB2EIvxyGzb3Ew==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.4.2", + "@jest/types": "^27.4.2", + "expect": "^27.4.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.2.tgz", + "integrity": "sha512-sp4aqmdBJtjKetEakzDPcZggPcVIF6w9QLkYBbaWDV6e/SIsHnF1S4KtIH91eEc2fp7ep6V/e1xvdfEoho1d2w==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.4.2", + "@jest/test-result": "^27.4.2", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^27.4.2", + "jest-resolve": "^27.4.2", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.2", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/source-map": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz", + "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.2.tgz", + "integrity": "sha512-kr+bCrra9jfTgxHXHa2UwoQjxvQk3Am6QbpAiJ5x/50LW8llOYrxILkqY0lZRW/hu8FXesnudbql263+EW9iNA==", + "dev": true, + "dependencies": { + "@jest/console": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.2.tgz", + "integrity": "sha512-HmHp5mlh9f9GyNej5yCS1JZIFfUGnP9+jEOH5zoq5EmsuZeYD+dGULqyvGDPtuzzbyAFJ6R4+z4SS0VvnFwwGQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.4.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.4.2", + "jest-runtime": "^27.4.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.2.tgz", + "integrity": "sha512-RTKcPZllfcmLfnlxBya7aypofhdz05+E6QITe55Ex0rxyerkgjmmpMlvVn11V0cP719Ps6WcDYCnDzxnnJUwKg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.4.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-util": "^27.4.2", + "micromatch": "^4.0.4", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/types": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", + "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nordicsemiconductor/asset-tracker-cloud-code-style": { + "version": "9.2.26", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/asset-tracker-cloud-code-style/-/asset-tracker-cloud-code-style-9.2.26.tgz", + "integrity": "sha512-jnuCCIRfKRPvoLeZerunEiT0GLLZWn1S/rVmkbBMUqm/+cttEn448cJrRq1r+s08rkNHoApSX/hjB995qCWYbA==", + "dev": true, + "dependencies": { + "@commitlint/cli": "15.0.0", + "@commitlint/config-angular": "15.0.0", + "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": "8.1.17", + "eslint": "8.3.0", + "husky": "7.0.4", + "lint-staged": "12.1.2", + "pinst": "2.1.6", + "prettier": "2.5.0", + "typescript": "4.5.2" + }, + "engines": { + "node": ">=14", + "npm": ">=7" + } + }, + "node_modules/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": { + "version": "8.1.17", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript/-/eslint-config-asset-tracker-cloud-typescript-8.1.17.tgz", + "integrity": "sha512-Xsie6AYbieLyVyboV0alF5ohBo1R2SP8hfzoenzw9B3SR9Oz7rkB04hB7g3HDWoCcilRY1RYgglUai4FgAhW8Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "5.5.0", + "eslint-config-prettier": "8.3.0" + }, + "engines": { + "node": ">=14", + "npm": ">=7" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", + "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.3.tgz", + "integrity": "sha512-cmmwv9t7gBYt7hNKH5Spu7Kuu/DotGa+Ff+JGRKZ4db5eh8PnKS4LuebJ3YLUoyOyIHraTGyULn23YtEAm0VSg==", + "dev": true, + "dependencies": { + "jest-diff": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, + "node_modules/@types/jsdom": { + "version": "16.2.13", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.13.tgz", + "integrity": "sha512-8JQCjdeAidptSsOcRWk2iTm9wCcwn9l+kRG6k5bzUacrnm1ezV4forq0kWjUih/tumAeoG+OspOvQEbbRucBTw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/parse5": "*", + "@types/tough-cookie": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "16.11.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", + "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz", + "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", + "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.5.0.tgz", + "integrity": "sha512-4bV6fulqbuaO9UMXU0Ia0o6z6if+kmMRW8rMRyfqXj/eGrZZRGedS4n0adeGNnjr8LKAM495hrQ7Tea52UWmQA==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "5.5.0", + "@typescript-eslint/scope-manager": "5.5.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.5.0.tgz", + "integrity": "sha512-kjWeeVU+4lQ1SLYErRKV5yDXbWDPkpbzTUUlfAUifPYvpX0qZlrcCZ96/6oWxt3QxtK5WVhXz+KsnwW9cIW+3A==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.5.0", + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/typescript-estree": "5.5.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.5.0.tgz", + "integrity": "sha512-JsXBU+kgQOAgzUn2jPrLA+Rd0Y1dswOlX3hp8MuRO1hQDs6xgHtbCXEiAu7bz5hyVURxbXcA2draasMbNqrhmg==", + "dev": true, + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.5.0", + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/typescript-estree": "5.5.0", + "debug": "^4.3.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.5.0.tgz", + "integrity": "sha512-0/r656RmRLo7CbN4Mdd+xZyPJ/fPCKhYdU6mnZx+8msAD8nJSP8EyCFkzbd6vNVZzZvWlMYrSNekqGrCBqFQhg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/visitor-keys": "5.5.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.5.0.tgz", + "integrity": "sha512-OaYTqkW3GnuHxqsxxJ6KypIKd5Uw7bFiQJZRyNi1jbMJnK3Hc/DR4KwB6KJj6PBRkJJoaNwzMNv9vtTk87JhOg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.5.0.tgz", + "integrity": "sha512-pVn8btYUiYrjonhMAO0yG8lm7RApzy2L4RC7Td/mC/qFkyf6vRbGyZozoA94+w6D2Y2GRqpMoCWcwx/EUOzyoQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/visitor-keys": "5.5.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.5.0.tgz", + "integrity": "sha512-4GzJ1kRtsWzHhdM40tv0ZKHNSbkDhF0Woi/TDwVJX6UICwJItvP7ZTXbjTkCdrors7ww0sYe0t+cIKDAJwZ7Kw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.5.0", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "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/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "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/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/babel-jest": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.2.tgz", + "integrity": "sha512-MADrjb3KBO2eyZCAc6QaJg6RT5u+6oEdDyHO5HEalnpwQ6LrhTsQF2Kj1Wnz2t6UPXIXPk18dSXXOT0wF5yTxA==", + "dev": true, + "dependencies": { + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^27.4.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz", + "integrity": "sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz", + "integrity": "sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^27.4.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true + }, + "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/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001283", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz", + "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "dev": true + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "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/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "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/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.3.tgz", + "integrity": "sha512-YyRDR7On9H07ICFpRm/igcdjIqebXbvf4Cff+Pf0BrBys1i1EOzx9iFXNlAbdrLAR8jf7bkUYkDAr8pEy0q4Pw==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "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/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": 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/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", + "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.5.tgz", + "integrity": "sha512-YKaB+t8ul5crdh6OeqT2qXdxJGI0fAYb6/X8pDIyye+c3a7ndOCk5gVeKX+ABwivCGNS56vOAif3TN0qJMpEHw==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/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/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", + "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.0.4", + "@humanwhocodes/config-array": "^0.6.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.1.0", + "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.6.0", + "ignore": "^4.0.6", + "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.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "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-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.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.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "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/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/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/espree": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", + "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", + "dev": true, + "dependencies": { + "acorn": "^8.6.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/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/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/esrecurse/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/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "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/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.2.tgz", + "integrity": "sha512-BjAXIDC6ZOW+WBFNg96J22D27Nq5ohn+oGcuP2rtOtcjuxNoV9McpQ60PcQWhdFOSBIQdR72e+4HdnbZTFSTyg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.4.2", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.4.0", + "jest-matcher-utils": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-regex-util": "^27.4.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/expect/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "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/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "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/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "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.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.10.tgz", + "integrity": "sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "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/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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/hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", + "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "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/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", + "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "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/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "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==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "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/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", + "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.2.tgz", + "integrity": "sha512-TAReynFYCfHNcrL+8Z74WPGafLFLF++bGkrpcsk6cO5G9S2VuJGhu2c44YFForMgF0GlYmtbpmeznkvZpNgTxg==", + "dev": true, + "dependencies": { + "@jest/core": "^27.4.2", + "import-local": "^3.0.2", + "jest-cli": "^27.4.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz", + "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==", + "dev": true, + "dependencies": { + "@jest/types": "^27.4.2", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.2.tgz", + "integrity": "sha512-2ePUSru1BGMyzxsMvRfu+tNb+PW60rUyMLJBfw1Nrh5zC8RoTPfF+zbE0JToU31a6ZVe4nnrNKWYRzlghAbL0A==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.4.2", + "@jest/test-result": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.4.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.4.2", + "jest-matcher-utils": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-runtime": "^27.4.2", + "jest-snapshot": "^27.4.2", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.2.tgz", + "integrity": "sha512-Ex2WhCj4s0XFntTKTnyLgV/CZKgQaZBYrKz02XOZ4nUjFD+26Fji/M1SgHm+2IWEIsQqoipNRx9RJH56p8d7MQ==", + "dev": true, + "dependencies": { + "@jest/core": "^27.4.2", + "@jest/test-result": "^27.4.2", + "@jest/types": "^27.4.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.4.2", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-config": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.2.tgz", + "integrity": "sha512-2vKqelsfHPnIzrPTpE9hImqxZLp5l9Vszpci19RdVB2i5OwoM+OkPExZMQb8aGrpEGXoKtlzvdqCL1GObiz8JQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^27.4.2", + "@jest/types": "^27.4.2", + "babel-jest": "^27.4.2", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-circus": "^27.4.2", + "jest-environment-jsdom": "^27.4.2", + "jest-environment-node": "^27.4.2", + "jest-get-type": "^27.4.0", + "jest-jasmine2": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.2", + "jest-runner": "^27.4.2", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", + "micromatch": "^4.0.4", + "pretty-format": "^27.4.2", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.2.tgz", + "integrity": "sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.4.0", + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz", + "integrity": "sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.2.tgz", + "integrity": "sha512-53V2MNyW28CTruB3lXaHNk6PkiIFuzdOC9gR3C6j8YE/ACfrPnz+slB0s17AgU1TtxNzLuHyvNlLJ+8QYw9nBg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.4.2", + "chalk": "^4.0.0", + "jest-get-type": "^27.4.0", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.2.tgz", + "integrity": "sha512-L0dV4oq4+Ll7hZ8QCGvSELn8uOr938/QKOg6o70kMHiZOpWOjAqSf7fMVAtGhG/BVSvk1GTzhGJNOWsxtH5KbQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.4.2", + "@jest/fake-timers": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/jsdom": "^16.2.4", + "@types/node": "*", + "jest-mock": "^27.4.2", + "jest-util": "^27.4.2", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.2.tgz", + "integrity": "sha512-nzTZ5nJ+FabuZPH2YVci7SZIHpvtNRHPt8+vipLkCnAgXGjVzHm7XJWdnNqXbAkExIgiKeVEkVMNZOZE/LeiIg==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.4.2", + "@jest/fake-timers": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "jest-mock": "^27.4.2", + "jest-util": "^27.4.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", + "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.2.tgz", + "integrity": "sha512-foiyAEePORUN2eeJnOtcM1y8qW0ShEd9kTjWVL4sVaMcuCJM6gtHegvYPBRT0mpI/bs4ueThM90+Eoj2ncoNsA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.4.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^27.4.0", + "jest-serializer": "^27.4.0", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.2", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.2.tgz", + "integrity": "sha512-VO/fyAJSH9u0THjbteFiL8qc93ufU+yW+bdieDc8tzTCWwlWzO53UHS5nFK1qmE8izb5Smkn+XHlVt6/l06MKQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^27.4.2", + "@jest/source-map": "^27.4.0", + "@jest/test-result": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.4.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.4.2", + "jest-matcher-utils": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-runtime": "^27.4.2", + "jest-snapshot": "^27.4.2", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.2", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz", + "integrity": "sha512-ml0KvFYZllzPBJWDei3mDzUhyp/M4ubKebX++fPaudpe8OsxUE+m+P6ciVLboQsrzOCWDjE20/eXew9QMx/VGw==", + "dev": true, + "dependencies": { + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz", + "integrity": "sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.4.2", + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.2.tgz", + "integrity": "sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.4.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "pretty-format": "^27.4.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.2.tgz", + "integrity": "sha512-PDDPuyhoukk20JrQKeofK12hqtSka7mWH0QQuxSNgrdiPsrnYYLS6wbzu/HDlxZRzji5ylLRULeuI/vmZZDrYA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.4.2", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz", + "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.2.tgz", + "integrity": "sha512-d/zqPjxCzMqHlOdRTg8cTpO9jY+1/T74KazT8Ws/LwmwxV5sRMWOkiLjmzUCDj/5IqA5XHNK4Hkmlq9Kdpb9Sg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.4.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.4.2", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.2.tgz", + "integrity": "sha512-hb++cTpqvOWfU49MCP/JQkxmnrhKoAVqXWFjgYXswRSVGk8Q6bDTSvhbCeYXDtXaymY0y7WrrSIlKogClcKJuw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-snapshot": "^27.4.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.2.tgz", + "integrity": "sha512-YsgbYKk8V7J5BQPINXhdzNLoqIwUWrJkV9h6/ccsn6fbmC3n3ax1K5cDWzAU9qXyaQhetwFqPpHmAHIACscRKQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.4.2", + "@jest/environment": "^27.4.2", + "@jest/test-result": "^27.4.2", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-docblock": "^27.4.0", + "jest-environment-jsdom": "^27.4.2", + "jest-environment-node": "^27.4.2", + "jest-haste-map": "^27.4.2", + "jest-leak-detector": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-resolve": "^27.4.2", + "jest-runtime": "^27.4.2", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.2", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.2.tgz", + "integrity": "sha512-eqPgcBaUNaw6j8T5M+dnfAEh6MIrh2YmtskCr9sl50QYpD22Sg+QqHw3J3nmaLzVMbBtOMHFFxLF0Qx8MsZVFQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.4.2", + "@jest/environment": "^27.4.2", + "@jest/globals": "^27.4.2", + "@jest/source-map": "^27.4.0", + "@jest/test-result": "^27.4.2", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-mock": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.2", + "jest-snapshot": "^27.4.2", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^16.2.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-serializer": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz", + "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.2.tgz", + "integrity": "sha512-DI7lJlNIu6WSQ+esqhnJzEzU70+dV+cNjoF1c+j5FagWEd3KtOyZvVliAH0RWNQ6KSnAAnKSU0qxJ8UXOOhuUQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.4.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^27.4.2", + "jest-get-type": "^27.4.0", + "jest-haste-map": "^27.4.2", + "jest-matcher-utils": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-resolve": "^27.4.2", + "jest-util": "^27.4.2", + "natural-compare": "^1.4.0", + "pretty-format": "^27.4.2", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz", + "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.4", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.2.tgz", + "integrity": "sha512-hWYsSUej+Fs8ZhOm5vhWzwSLmVaPAxRy+Mr+z5MzeaHm9AxUpXdoVMEW4R86y5gOobVfBsMFLk4Rb+QkiEpx1A==", + "dev": true, + "dependencies": { + "@jest/types": "^27.4.2", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.4.0", + "leven": "^3.1.0", + "pretty-format": "^27.4.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.2.tgz", + "integrity": "sha512-NJvMVyyBeXfDezhWzUOCOYZrUmkSCiatpjpm+nFUid74OZEHk6aMLrZAukIiFDwdbqp6mTM6Ui1w4oc+8EobQg==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.4.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz", + "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "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/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "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/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/lilconfig": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", + "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/lint-staged": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.1.2.tgz", + "integrity": "sha512-bSMcQVqMW98HLLLR2c2tZ+vnDCnx4fd+0QJBQgN/4XkdspGRPc8DGp7UuOEBe1ApCfJ+wXXumYnJmU+wDo7j9A==", + "dev": true, + "dependencies": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.16", + "commander": "^8.3.0", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "execa": "^5.1.1", + "lilconfig": "2.0.4", + "listr2": "^3.13.3", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "object-inspect": "^1.11.0", + "string-argv": "^0.3.1", + "supports-color": "^9.0.2", + "yaml": "^1.10.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/lint-staged/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/string-width": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.0.1.tgz", + "integrity": "sha512-5ohWO/M4//8lErlUUtrFy3b11GtNOuMOU0ysKCDXFcfXuuvUXu95akgj/i8ofmaGdN0hCqyl6uu9i8dS/mQp5g==", + "dev": true, + "dependencies": { + "emoji-regex": "^9.2.2", + "is-fullwidth-code-point": "^4.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/supports-color": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.1.tgz", + "integrity": "sha512-Obv7ycoCTG51N7y175StI9BlAXrmgZrFhZOb0/PyjHBher/NmsdBgbbQ1Inhq+gIhz6+7Gb+jWF2Vqi7Mf1xnQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/listr2": { + "version": "3.13.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.13.5.tgz", + "integrity": "sha512-3n8heFQDSk+NcwBn3CgxEibZGaRzx+pC64n3YjpMD1qguV4nWus3Al+Oo3KooqFKTQEJ1v7MmnbnyyNspgx3NA==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.4.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "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/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "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/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "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/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinst": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/pinst/-/pinst-2.1.6.tgz", + "integrity": "sha512-B4dYmf6nEXg1NpDSB+orYWvKa5Kfmz5KzWC29U59dpVM4S/+xp0ak/JMEsw04UQTNNKps7klu0BUalr343Gt9g==", + "dev": true, + "dependencies": { + "fromentries": "^1.3.2" + }, + "bin": { + "pinst": "bin.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "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/prettier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", + "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/pretty-format": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.2.tgz", + "integrity": "sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.4.2", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "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/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "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/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "dev": true, + "dependencies": { + "tslib": "~2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "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-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "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/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "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/throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-jest": { + "version": "27.0.7", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.7.tgz", + "integrity": "sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@types/jest": "^27.0.0", + "babel-jest": ">=27.0.0 <28", + "jest": "^27.0.0", + "typescript": ">=3.8 <5.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "babel-jest": { + "optional": true + } + } + }, + "node_modules/ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "dependencies": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "typescript": ">=2.7" + } + }, + "node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "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-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "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/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "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/v8-to-istanbul": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz", + "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/compat-data": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "dev": true + }, + "@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helpers": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "dev": true, + "requires": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" + } + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", + "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "@bifravst/eslint-config-typescript": { - "version": "5.0.79", - "resolved": "https://registry.npmjs.org/@bifravst/eslint-config-typescript/-/eslint-config-typescript-5.0.79.tgz", - "integrity": "sha512-IJTuwuaBq90LMhyMzf74cPa8YBklMVorqlJtYGT9M7s7js1yjmTdVK42BuvpnuhW6FShVoZZrObSqfE/EPpyvw==", + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "requires": { - "@typescript-eslint/eslint-plugin": "4.9.0", - "@typescript-eslint/parser": "4.9.0", - "eslint-config-prettier": "6.15.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@commitlint/cli": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-11.0.0.tgz", - "integrity": "sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.11.2", - "@commitlint/format": "^11.0.0", - "@commitlint/lint": "^11.0.0", - "@commitlint/load": "^11.0.0", - "@commitlint/read": "^11.0.0", - "chalk": "4.1.0", - "core-js": "^3.6.1", - "get-stdin": "8.0.0", - "lodash": "^4.17.19", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", - "yargs": "^15.1.0" + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz", + "integrity": "sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true - }, - "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 - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "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" - } } } }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@commitlint/cli": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-15.0.0.tgz", + "integrity": "sha512-Y5xmDCweytqzo4N4lOI2YRiuX35xTjcs8n5hUceBH8eyK0YbwtgWX50BJOH2XbkwEmII9blNhlBog6AdQsqicg==", + "dev": true, + "requires": { + "@commitlint/format": "^15.0.0", + "@commitlint/lint": "^15.0.0", + "@commitlint/load": "^15.0.0", + "@commitlint/read": "^15.0.0", + "@commitlint/types": "^15.0.0", + "lodash": "^4.17.19", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + } + }, "@commitlint/config-angular": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-angular/-/config-angular-11.0.0.tgz", - "integrity": "sha512-H8QSEOmfRsPW0Iehid5fY7NZ2HXmyKC6Q83MLFf9KRnmCcbgJtH+faECtqlvPntayO3CYbA4UenIerOaQ0vOAg==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-angular/-/config-angular-15.0.0.tgz", + "integrity": "sha512-1gpyAZkGB+v9hTvw4G8AGU7vzq49/pANifShUsoyuSLAmHzxC3YgE+ZyqlVoB+T6gjE90NXjUQbLmNpi/7ZFYg==", "dev": true, "requires": { - "@commitlint/config-angular-type-enum": "^11.0.0" + "@commitlint/config-angular-type-enum": "^15.0.0" } }, "@commitlint/config-angular-type-enum": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-angular-type-enum/-/config-angular-type-enum-11.0.0.tgz", - "integrity": "sha512-dSyxdkU36aEgDUWBSiM5lsZ/h2K7uCyKf+A5Sf3+Z5JhcLD9GzTo5W+c8KgwTBdL39dkL7sN+EVgsXNjW99pJg==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-angular-type-enum/-/config-angular-type-enum-15.0.0.tgz", + "integrity": "sha512-KBGoII2yo76KtbKbeCym5PxCt5CZvti7YbCEGOF5GiyZd/9AaJur/UhbzX3pcoLMgXd9u3Ru+qydm79TlRLuJA==", "dev": true }, "@commitlint/ensure": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-11.0.0.tgz", - "integrity": "sha512-/T4tjseSwlirKZdnx4AuICMNNlFvRyPQimbZIOYujp9DSO6XRtOy9NrmvWujwHsq9F5Wb80QWi4WMW6HMaENug==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-15.0.0.tgz", + "integrity": "sha512-7DV4iNIald3vycwaWBNGk5FbonaNzOlU8nBe5m5AgU2dIeNKuXwLm+zzJzG27j0Ho56rgz//3F6RIvmsoxY9ZA==", "dev": true, "requires": { - "@commitlint/types": "^11.0.0", + "@commitlint/types": "^15.0.0", "lodash": "^4.17.19" } }, "@commitlint/execute-rule": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz", - "integrity": "sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-15.0.0.tgz", + "integrity": "sha512-pyE4ApxjbWhb1TXz5vRiGwI2ssdMMgZbaaheZq1/7WC0xRnqnIhE1yUC1D2q20qPtvkZPstTYvMiRVtF+DvjUg==", "dev": true }, "@commitlint/format": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-11.0.0.tgz", - "integrity": "sha512-bpBLWmG0wfZH/svzqD1hsGTpm79TKJWcf6EXZllh2J/LSSYKxGlv967lpw0hNojme0sZd4a/97R3qA2QHWWSLg==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-15.0.0.tgz", + "integrity": "sha512-bPhAfqwRhPk92WiuY0ktEJNpRRHSCd+Eg1MdhGyL9Bl3U25E5zvuInA+dNctnzZiOBSH/37ZaD0eOKCpQE6acg==", "dev": true, "requires": { - "@commitlint/types": "^11.0.0", + "@commitlint/types": "^15.0.0", "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } } }, "@commitlint/is-ignored": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz", - "integrity": "sha512-VLHOUBN+sOlkYC4tGuzE41yNPO2w09sQnOpfS+pSPnBFkNUUHawEuA44PLHtDvQgVuYrMAmSWFQpWabMoP5/Xg==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-15.0.0.tgz", + "integrity": "sha512-edtnkf2QZ/7e/YCJDgn1WDw9wfF1WfOitW5YEoSOb4SxjJEb/oE87kxNPZ2j8mnDMuunspcMfGHeg6fRlwaEWg==", "dev": true, "requires": { - "@commitlint/types": "^11.0.0", - "semver": "7.3.2" + "@commitlint/types": "^15.0.0", + "semver": "7.3.5" } }, "@commitlint/lint": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-11.0.0.tgz", - "integrity": "sha512-Q8IIqGIHfwKr8ecVZyYh6NtXFmKw4YSEWEr2GJTB/fTZXgaOGtGFZDWOesCZllQ63f1s/oWJYtVv5RAEuwN8BQ==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-15.0.0.tgz", + "integrity": "sha512-hUi2+Im/2dJ5FBvWnodypTkg+5haCgsDzB0fyMApWLUA1IucYUAqRCQCW5em1Mhk9Crw1pd5YzFNikhIclkqCw==", "dev": true, "requires": { - "@commitlint/is-ignored": "^11.0.0", - "@commitlint/parse": "^11.0.0", - "@commitlint/rules": "^11.0.0", - "@commitlint/types": "^11.0.0" + "@commitlint/is-ignored": "^15.0.0", + "@commitlint/parse": "^15.0.0", + "@commitlint/rules": "^15.0.0", + "@commitlint/types": "^15.0.0" } }, "@commitlint/load": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-11.0.0.tgz", - "integrity": "sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-15.0.0.tgz", + "integrity": "sha512-Ak1YPeOhvxmY3ioe0o6m1yLGvUAYb4BdfGgShU8jiTCmU3Mnmms0Xh/kfQz8AybhezCC3AmVTyBLaBZxOHR8kg==", "dev": true, "requires": { - "@commitlint/execute-rule": "^11.0.0", - "@commitlint/resolve-extends": "^11.0.0", - "@commitlint/types": "^11.0.0", - "chalk": "4.1.0", + "@commitlint/execute-rule": "^15.0.0", + "@commitlint/resolve-extends": "^15.0.0", + "@commitlint/types": "^15.0.0", + "@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2", + "chalk": "^4.0.0", "cosmiconfig": "^7.0.0", "lodash": "^4.17.19", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "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" - } - } + "resolve-from": "^5.0.0", + "typescript": "^4.4.3" } }, "@commitlint/message": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-11.0.0.tgz", - "integrity": "sha512-01ObK/18JL7PEIE3dBRtoMmU6S3ecPYDTQWWhcO+ErA3Ai0KDYqV5VWWEijdcVafNpdeUNrEMigRkxXHQLbyJA==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-15.0.0.tgz", + "integrity": "sha512-L8euabzboKavPuDJsdIYAY2wx97LbiGEYsckMo6NmV8pOun50c8hQx6ouXFSAx4pp+mX9yUGmMiVqfrk2LKDJQ==", "dev": true }, "@commitlint/parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-11.0.0.tgz", - "integrity": "sha512-DekKQAIYWAXIcyAZ6/PDBJylWJ1BROTfDIzr9PMVxZRxBPc1gW2TG8fLgjZfBP5mc0cuthPkVi91KQQKGri/7A==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-15.0.0.tgz", + "integrity": "sha512-7fweM67tZfBNS7zw1KTuuT5K2u9nGytUJqFqT/1Ln3Na9cBCsoAqR47mfsNOTlRCgGwakm4xiQ7BpS2gN0OGuw==", "dev": true, "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-parser": "^3.0.0" + "@commitlint/types": "^15.0.0", + "conventional-changelog-angular": "^5.0.11", + "conventional-commits-parser": "^3.2.2" } }, "@commitlint/read": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-11.0.0.tgz", - "integrity": "sha512-37V0V91GSv0aDzMzJioKpCoZw6l0shk7+tRG8RkW1GfZzUIytdg3XqJmM+IaIYpaop0m6BbZtfq+idzUwJnw7g==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-15.0.0.tgz", + "integrity": "sha512-5yI1o2HKZFVe7RTjL7IhuhHMKar/MDNY34vEHqqz9gMI7BK/rdP8uVb4Di1efl2V0UPnwID0nPKWESjQ8Ti0gw==", "dev": true, "requires": { - "@commitlint/top-level": "^11.0.0", - "fs-extra": "^9.0.0", + "@commitlint/top-level": "^15.0.0", + "@commitlint/types": "^15.0.0", + "fs-extra": "^10.0.0", "git-raw-commits": "^2.0.0" } }, "@commitlint/resolve-extends": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz", - "integrity": "sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-15.0.0.tgz", + "integrity": "sha512-7apfRJjgJsKja7lHsPfEFixKjA/fk/UeD3owkOw1174yYu4u8xBDLSeU3IinGPdMuF9m245eX8wo7vLUy+EBSg==", "dev": true, "requires": { "import-fresh": "^3.0.0", "lodash": "^4.17.19", "resolve-from": "^5.0.0", "resolve-global": "^1.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } } }, "@commitlint/rules": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-11.0.0.tgz", - "integrity": "sha512-2hD9y9Ep5ZfoNxDDPkQadd2jJeocrwC4vJ98I0g8pNYn/W8hS9+/FuNpolREHN8PhmexXbkjrwyQrWbuC0DVaA==", - "dev": true, - "requires": { - "@commitlint/ensure": "^11.0.0", - "@commitlint/message": "^11.0.0", - "@commitlint/to-lines": "^11.0.0", - "@commitlint/types": "^11.0.0" - } - }, - "@commitlint/to-lines": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-11.0.0.tgz", - "integrity": "sha512-TIDTB0Y23jlCNubDROUVokbJk6860idYB5cZkLWcRS9tlb6YSoeLn1NLafPlrhhkkkZzTYnlKYzCVrBNVes1iw==", - "dev": true - }, - "@commitlint/top-level": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-11.0.0.tgz", - "integrity": "sha512-O0nFU8o+Ws+py5pfMQIuyxOtfR/kwtr5ybqTvR+C2lUPer2x6lnQU+OnfD7hPM+A+COIUZWx10mYQvkR3MmtAA==", - "dev": true, - "requires": { - "find-up": "^5.0.0" - }, - "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - } + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-15.0.0.tgz", + "integrity": "sha512-SqXfp6QUlwBS+0IZm4FEA/NmmAwcFQIkG3B05BtemOVWXQdZ8j1vV6hDwvA9oMPCmUSrrGpHOtZK7HaHhng2yA==", + "dev": true, + "requires": { + "@commitlint/ensure": "^15.0.0", + "@commitlint/message": "^15.0.0", + "@commitlint/to-lines": "^15.0.0", + "@commitlint/types": "^15.0.0", + "execa": "^5.0.0" } }, - "@commitlint/types": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz", - "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==", + "@commitlint/to-lines": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-15.0.0.tgz", + "integrity": "sha512-mY3MNA9ujPqVpiJjTYG9MDsYCobue5PJFO0MfcIzS1mCVvngH8ZFTPAh1fT5t+t1h876boS88+9WgqjRvbYItw==", "dev": true }, + "@commitlint/top-level": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-15.0.0.tgz", + "integrity": "sha512-7Gz3t7xcuuUw1d1Nou6YLaztzp2Em+qZ6YdCzrqYc+aquca3Vt0O696nuiBDU/oE+tls4Hx2CNpAbWhTgEwB5A==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + } + }, + "@commitlint/types": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-15.0.0.tgz", + "integrity": "sha512-OMSLX+QJnyNoTwws54ULv9sOvuw9GdVezln76oyUd4YbMMJyaav62aSXDuCdWyL2sm9hTkSzyEi52PNaIj/vqw==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "@endemolshinegroup/cosmiconfig-typescript-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz", + "integrity": "sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==", + "dev": true, + "requires": { + "lodash.get": "^4", + "make-error": "^1", + "ts-node": "^9", + "tslib": "^2" + } + }, "@eslint/eslintrc": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", - "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", + "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", "dev": true, "requires": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", + "debug": "^4.3.2", + "espree": "^9.0.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.19", + "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true } } }, + "@humanwhocodes/config-array": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", + "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "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 + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -826,220 +7567,169 @@ "resolve-from": "^5.0.0" }, "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true - }, - "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "sprintf-js": "~1.0.2" } }, - "chalk": { + "find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.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==", + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { - "color-name": "~1.1.4" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "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 + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } }, - "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 + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "p-limit": "^2.2.0" } } } }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.2.tgz", + "integrity": "sha512-xknHThRsPB/To1FUbi6pCe43y58qFC03zfb6R7fDb/FfC7k2R3i1l+izRBJf8DI46KhYGRaF14Eo9A3qbBoixg==", + "dev": true, + "requires": { + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.4.2", + "jest-util": "^27.4.2", + "slash": "^3.0.0" + } + }, "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.2.tgz", + "integrity": "sha512-0mPM61tDbu8yc9CMKH9bvV+g+17VUpdWQtU1x6P1gk4AKj8iywWi8zBmEIl7pTGjUtYA92CNc/LlBfKCioBOow==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.4.2", + "@jest/reporters": "^27.4.2", + "@jest/test-result": "^27.4.2", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", + "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", + "jest-changed-files": "^27.4.2", + "jest-config": "^27.4.2", + "jest-haste-map": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.2", + "jest-resolve-dependencies": "^27.4.2", + "jest-runner": "^27.4.2", + "jest-runtime": "^27.4.2", + "jest-snapshot": "^27.4.2", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", + "jest-watcher": "^27.4.2", + "micromatch": "^4.0.4", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } } }, "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.2.tgz", + "integrity": "sha512-uSljKxh/rGlHlmhyeG4ZoVK9hOec+EPBkwTHkHKQ2EqDu5K+MaG9uJZ8o1CbRsSdZqSuhXvJCYhBWsORPPg6qw==", "dev": true, "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/fake-timers": "^27.4.2", + "@jest/types": "^27.4.2", "@types/node": "*", - "jest-mock": "^26.6.2" + "jest-mock": "^27.4.2" } }, "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.2.tgz", + "integrity": "sha512-f/Xpzn5YQk5adtqBgvw1V6bF8Nx3hY0OIRRpCvWcfPl0EAjdqWPdhH3t/3XpiWZqtjIEHDyMKP9ajpva1l4Zmg==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", + "@jest/types": "^27.4.2", + "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-message-util": "^27.4.2", + "jest-mock": "^27.4.2", + "jest-util": "^27.4.2" } }, "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.2.tgz", + "integrity": "sha512-KkfaHEttlGpXYAQTZHgrESiEPx2q/DKAFLGLFda1uGVrqc17snd3YVPhOxlXOHIzVPs+lQ/SDB2EIvxyGzb3Ew==", "dev": true, "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" + "@jest/environment": "^27.4.2", + "@jest/types": "^27.4.2", + "expect": "^27.4.2" } }, "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.2.tgz", + "integrity": "sha512-sp4aqmdBJtjKetEakzDPcZggPcVIF6w9QLkYBbaWDV6e/SIsHnF1S4KtIH91eEc2fp7ep6V/e1xvdfEoho1d2w==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.4.2", + "@jest/test-result": "^27.4.2", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -1050,73 +7740,21 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", + "jest-haste-map": "^27.4.2", + "jest-resolve": "^27.4.2", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.2", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } + "v8-to-istanbul": "^8.1.0" } }, "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz", + "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -1125,216 +7763,146 @@ } }, "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.2.tgz", + "integrity": "sha512-kr+bCrra9jfTgxHXHa2UwoQjxvQk3Am6QbpAiJ5x/50LW8llOYrxILkqY0lZRW/hu8FXesnudbql263+EW9iNA==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.4.2", + "@jest/types": "^27.4.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.2.tgz", + "integrity": "sha512-HmHp5mlh9f9GyNej5yCS1JZIFfUGnP9+jEOH5zoq5EmsuZeYD+dGULqyvGDPtuzzbyAFJ6R4+z4SS0VvnFwwGQ==", "dev": true, "requires": { - "@jest/test-result": "^26.6.2", + "@jest/test-result": "^27.4.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" + "jest-haste-map": "^27.4.2", + "jest-runtime": "^27.4.2" } }, "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.2.tgz", + "integrity": "sha512-RTKcPZllfcmLfnlxBya7aypofhdz05+E6QITe55Ex0rxyerkgjmmpMlvVn11V0cP719Ps6WcDYCnDzxnnJUwKg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", + "jest-haste-map": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-util": "^27.4.2", + "micromatch": "^4.0.4", "pirates": "^4.0.1", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } } }, "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", + "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^15.0.0", + "@types/yargs": "^16.0.0", "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } } }, "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.3", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.3", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, + "@nordicsemiconductor/asset-tracker-cloud-code-style": { + "version": "9.2.26", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/asset-tracker-cloud-code-style/-/asset-tracker-cloud-code-style-9.2.26.tgz", + "integrity": "sha512-jnuCCIRfKRPvoLeZerunEiT0GLLZWn1S/rVmkbBMUqm/+cttEn448cJrRq1r+s08rkNHoApSX/hjB995qCWYbA==", + "dev": true, + "requires": { + "@commitlint/cli": "15.0.0", + "@commitlint/config-angular": "15.0.0", + "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": "8.1.17", + "eslint": "8.3.0", + "husky": "7.0.4", + "lint-staged": "12.1.2", + "pinst": "2.1.6", + "prettier": "2.5.0", + "typescript": "4.5.2" + } + }, + "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": { + "version": "8.1.17", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript/-/eslint-config-asset-tracker-cloud-typescript-8.1.17.tgz", + "integrity": "sha512-Xsie6AYbieLyVyboV0alF5ohBo1R2SP8hfzoenzw9B3SR9Oz7rkB04hB7g3HDWoCcilRY1RYgglUai4FgAhW8Q==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "5.5.0", + "eslint-config-prettier": "8.3.0" + } + }, "@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, "@types/babel__core": { - "version": "7.1.12", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", - "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", + "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1345,18 +7913,18 @@ } }, "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", - "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1364,24 +7932,18 @@ } }, "@types/babel__traverse": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", - "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", "dev": true, "requires": { "@babel/types": "^7.3.0" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, "@types/graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "dev": true, "requires": { "@types/node": "*" @@ -1403,46 +7965,57 @@ } }, "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" } }, "@types/jest": { - "version": "26.0.16", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.16.tgz", - "integrity": "sha512-Gp12+7tmKCgv9JjtltxUXokohCAEZfpJaEW5tn871SGRp8I+bRWBonQO7vW5NHwnAHe5dd50+Q4zyKuN35i09g==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.3.tgz", + "integrity": "sha512-cmmwv9t7gBYt7hNKH5Spu7Kuu/DotGa+Ff+JGRKZ4db5eh8PnKS4LuebJ3YLUoyOyIHraTGyULn23YtEAm0VSg==", + "dev": true, + "requires": { + "jest-diff": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, + "@types/jsdom": { + "version": "16.2.13", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.13.tgz", + "integrity": "sha512-8JQCjdeAidptSsOcRWk2iTm9wCcwn9l+kRG6k5bzUacrnm1ezV4forq0kWjUih/tumAeoG+OspOvQEbbRucBTw==", "dev": true, "requires": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" + "@types/node": "*", + "@types/parse5": "*", + "@types/tough-cookie": "*" } }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "@types/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, "@types/node": { - "version": "14.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz", - "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==", + "version": "16.11.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", + "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==", "dev": true }, "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, "@types/parse-json": { @@ -1451,124 +8024,127 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "dev": true + }, "@types/prettier": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", - "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz", + "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==", "dev": true }, "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/tough-cookie": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", + "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==", "dev": true }, "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.9.0.tgz", - "integrity": "sha512-WrVzGMzzCrgrpnQMQm4Tnf+dk+wdl/YbgIgd5hKGa2P+lnJ2MON+nQnbwgbxtN9QDLi8HO+JAq0/krMnjQK6Cw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.5.0.tgz", + "integrity": "sha512-4bV6fulqbuaO9UMXU0Ia0o6z6if+kmMRW8rMRyfqXj/eGrZZRGedS4n0adeGNnjr8LKAM495hrQ7Tea52UWmQA==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.9.0", - "@typescript-eslint/scope-manager": "4.9.0", - "debug": "^4.1.1", + "@typescript-eslint/experimental-utils": "5.5.0", + "@typescript-eslint/scope-manager": "5.5.0", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" } }, "@typescript-eslint/experimental-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.9.0.tgz", - "integrity": "sha512-0p8GnDWB3R2oGhmRXlEnCvYOtaBCijtA5uBfH5GxQKsukdSQyI4opC4NGTUb88CagsoNQ4rb/hId2JuMbzWKFQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.5.0.tgz", + "integrity": "sha512-kjWeeVU+4lQ1SLYErRKV5yDXbWDPkpbzTUUlfAUifPYvpX0qZlrcCZ96/6oWxt3QxtK5WVhXz+KsnwW9cIW+3A==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.9.0", - "@typescript-eslint/types": "4.9.0", - "@typescript-eslint/typescript-estree": "4.9.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.5.0", + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/typescript-estree": "5.5.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.9.0.tgz", - "integrity": "sha512-QRSDAV8tGZoQye/ogp28ypb8qpsZPV6FOLD+tbN4ohKUWHD2n/u0Q2tIBnCsGwQCiD94RdtLkcqpdK4vKcLCCw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.5.0.tgz", + "integrity": "sha512-JsXBU+kgQOAgzUn2jPrLA+Rd0Y1dswOlX3hp8MuRO1hQDs6xgHtbCXEiAu7bz5hyVURxbXcA2draasMbNqrhmg==", "dev": true, + "peer": true, "requires": { - "@typescript-eslint/scope-manager": "4.9.0", - "@typescript-eslint/types": "4.9.0", - "@typescript-eslint/typescript-estree": "4.9.0", - "debug": "^4.1.1" + "@typescript-eslint/scope-manager": "5.5.0", + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/typescript-estree": "5.5.0", + "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.9.0.tgz", - "integrity": "sha512-q/81jtmcDtMRE+nfFt5pWqO0R41k46gpVLnuefqVOXl4QV1GdQoBWfk5REcipoJNQH9+F5l+dwa9Li5fbALjzg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.5.0.tgz", + "integrity": "sha512-0/r656RmRLo7CbN4Mdd+xZyPJ/fPCKhYdU6mnZx+8msAD8nJSP8EyCFkzbd6vNVZzZvWlMYrSNekqGrCBqFQhg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.9.0", - "@typescript-eslint/visitor-keys": "4.9.0" + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/visitor-keys": "5.5.0" } }, "@typescript-eslint/types": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.9.0.tgz", - "integrity": "sha512-luzLKmowfiM/IoJL/rus1K9iZpSJK6GlOS/1ezKplb7MkORt2dDcfi8g9B0bsF6JoRGhqn0D3Va55b+vredFHA==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.5.0.tgz", + "integrity": "sha512-OaYTqkW3GnuHxqsxxJ6KypIKd5Uw7bFiQJZRyNi1jbMJnK3Hc/DR4KwB6KJj6PBRkJJoaNwzMNv9vtTk87JhOg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.9.0.tgz", - "integrity": "sha512-rmDR++PGrIyQzAtt3pPcmKWLr7MA+u/Cmq9b/rON3//t5WofNR4m/Ybft2vOLj0WtUzjn018ekHjTsnIyBsQug==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.5.0.tgz", + "integrity": "sha512-pVn8btYUiYrjonhMAO0yG8lm7RApzy2L4RC7Td/mC/qFkyf6vRbGyZozoA94+w6D2Y2GRqpMoCWcwx/EUOzyoQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.9.0", - "@typescript-eslint/visitor-keys": "4.9.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/visitor-keys": "5.5.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" } }, "@typescript-eslint/visitor-keys": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.9.0.tgz", - "integrity": "sha512-sV45zfdRqQo1A97pOSx3fsjR+3blmwtdCt8LDrXgCX36v4Vmz4KHrhpV6Fo2cRdXmyumxx11AHw0pNJqCNpDyg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.9.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.5.0.tgz", + "integrity": "sha512-4GzJ1kRtsWzHhdM40tv0ZKHNSbkDhF0Woi/TDwVJX6UICwJItvP7ZTXbjTkCdrors7ww0sYe0t+cIKDAJwZ7Kw==", "dev": true, "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "@typescript-eslint/types": "5.5.0", + "eslint-visitor-keys": "^3.0.0" } }, "abab": { @@ -1578,9 +8154,9 @@ "dev": true }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", "dev": true }, "acorn-globals": { @@ -1591,13 +8167,22 @@ "requires": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } } }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} }, "acorn-walk": { "version": "7.2.0", @@ -1605,6 +8190,15 @@ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -1634,72 +8228,57 @@ "dev": true }, "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" }, "dependencies": { "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true } } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "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": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "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": "^1.9.0" + "color-convert": "^2.0.1" } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "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 }, "array-ify": { @@ -1714,39 +8293,12 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -1759,114 +8311,60 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.2.tgz", + "integrity": "sha512-MADrjb3KBO2eyZCAc6QaJg6RT5u+6oEdDyHO5HEalnpwQ6LrhTsQF2Kj1Wnz2t6UPXIXPk18dSXXOT0wF5yTxA==", "dev": true, "requires": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", + "babel-preset-jest": "^27.4.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } } }, "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz", + "integrity": "sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -1876,9 +8374,9 @@ } }, "babel-preset-current-node-syntax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz", - "integrity": "sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -1896,55 +8394,20 @@ } }, "babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz", + "integrity": "sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^26.6.2", + "babel-plugin-jest-hoist": "^27.4.0", "babel-preset-current-node-syntax": "^1.0.0" } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "bcrypt-pbkdf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "brace-expansion": { "version": "1.1.11", @@ -1971,6 +8434,19 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, + "browserslist": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, "bs-logger": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", @@ -1990,28 +8466,11 @@ } }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2033,40 +8492,22 @@ "camelcase": "^5.3.1", "map-obj": "^4.0.0", "quick-lru": "^4.0.1" - }, - "dependencies": { - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - } } }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "caniuse-lite": { + "version": "1.0.30001283", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz", + "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==", "dev": true }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "char-regex": { @@ -2076,97 +8517,17 @@ "dev": true }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", "dev": true }, "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -2193,14 +8554,14 @@ } }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" } }, "co": { @@ -2215,29 +8576,25 @@ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "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.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, "combined-stream": { @@ -2250,32 +8607,20 @@ } }, "commander": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", - "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true }, "compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } }, "concat-map": { "version": "0.0.1", @@ -2284,9 +8629,9 @@ "dev": true }, "conventional-changelog-angular": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.11.tgz", - "integrity": "sha512-nSLypht/1yEflhuTogC03i7DX7sOrXGsRn14g131Potqi6cbGbGEE9PSDEHKldabB6N76HiSyw9Ph+kLmC04Qw==", + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", "dev": true, "requires": { "compare-func": "^2.0.0", @@ -2294,63 +8639,32 @@ } }, "conventional-commits-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz", - "integrity": "sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.3.tgz", + "integrity": "sha512-YyRDR7On9H07ICFpRm/igcdjIqebXbvf4Cff+Pf0BrBys1i1EOzx9iFXNlAbdrLAR8jf7bkUYkDAr8pEy0q4Pw==", "dev": true, "requires": { - "JSONStream": "^1.0.4", "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", "lodash": "^4.17.15", - "meow": "^7.0.0", - "split2": "^2.0.0", - "through2": "^3.0.0", - "trim-off-newlines": "^1.0.0" - }, - "dependencies": { - "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - } + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" } }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "dev": true, "requires": { "@types/parse-json": "^4.0.0", @@ -2360,6 +8674,12 @@ "yaml": "^1.10.0" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2400,15 +8720,6 @@ "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -2421,9 +8732,9 @@ } }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -2454,15 +8765,9 @@ } }, "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", "dev": true }, "dedent": { @@ -2472,9 +8777,9 @@ "dev": true }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "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 }, "deepmerge": { @@ -2483,16 +8788,6 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2505,10 +8800,16 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", + "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==", "dev": true }, "dir-glob": { @@ -2547,28 +8848,24 @@ } }, "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "requires": { "is-obj": "^2.0.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } + "electron-to-chromium": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.5.tgz", + "integrity": "sha512-YKaB+t8ul5crdh6OeqT2qXdxJGI0fAYb6/X8pDIyye+c3a7ndOCk5gVeKX+ABwivCGNS56vOAif3TN0qJMpEHw==", + "dev": true }, "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", "dev": true }, "emoji-regex": { @@ -2577,15 +8874,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -2604,177 +8892,154 @@ "is-arrayish": "^0.2.1" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "requires": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } } }, "eslint": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.14.0.tgz", - "integrity": "sha512-5YubdnPXrlrYAFCKybPuHIAH++PINe1pmKNc5wQRB9HSbqIK1ywAnntE3Wwua4giKu0bjligf1gLF6qxMGOYRA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", + "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.2.1", + "@eslint/eslintrc": "^1.0.4", + "@humanwhocodes/config-array": "^0.6.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.0", - "esquery": "^1.2.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.1.0", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^3.1.0", + "regexpp": "^3.2.0", "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^5.2.3", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "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" - } - }, - "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" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "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" - } - }, - "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" - } } } }, "eslint-config-prettier": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", - "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", "dev": true, - "requires": { - "get-stdin": "^6.0.0" - } + "requires": {} }, "eslint-scope": { "version": "5.1.1", @@ -2787,45 +9052,37 @@ } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "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": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "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": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", "dev": true }, "espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", + "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", "dev": true, "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "acorn": "^8.6.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" } }, "esprima": { @@ -2835,18 +9092,18 @@ "dev": true }, "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "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" }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -2861,9 +9118,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -2880,26 +9137,20 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", - "dev": true - }, "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, @@ -2909,223 +9160,28 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.2.tgz", + "integrity": "sha512-BjAXIDC6ZOW+WBFNg96J22D27Nq5ohn+oGcuP2rtOtcjuxNoV9McpQ60PcQWhdFOSBIQdR72e+4HdnbZTFSTyg==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" + "@jest/types": "^27.4.2", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.4.0", + "jest-matcher-utils": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-regex-util": "^27.4.0" }, "dependencies": { "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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 - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3133,17 +9189,27 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } } }, "fast-json-stable-stringify": { @@ -3159,9 +9225,9 @@ "dev": true }, "fastq": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", - "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -3176,22 +9242,13 @@ "bser": "2.1.1" } }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "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": "^2.0.1" + "flat-cache": "^3.0.4" } }, "fill-range": { @@ -3204,94 +9261,57 @@ } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, - "find-versions": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", - "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", - "dev": true, - "requires": { - "semver-regex": "^2.0.0" - } - }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true }, "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "dev": true, "requires": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, "fs.realpath": { @@ -3301,9 +9321,9 @@ "dev": true }, "fsevents": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.0.tgz", - "integrity": "sha512-pKnaUh2TNvk+/egJdBw1h46LwyLx8BzEq+MGCf/RMCVfEHHsGOCWG00dqk91kUPPArIIwMBg9T/virxwzP03cA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -3331,77 +9351,35 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "git-raw-commits": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.7.tgz", - "integrity": "sha512-SkwrTqrDxw8y0G1uGJ9Zw13F7qu3LF8V4BifyDeiJCxSnjRGZD9SaoMiMqUvvXMXh6S3sOQ1DsBN7L2fMUZW/g==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.10.tgz", + "integrity": "sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==", "dev": true, "requires": { "dargs": "^7.0.0", - "lodash.template": "^4.0.2", - "meow": "^7.0.0", - "split2": "^2.0.0", - "through2": "^3.0.0" - }, - "dependencies": { - "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - } + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -3413,24 +9391,36 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "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.1" + "is-glob": "^4.0.3" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" } }, "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } }, "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "dev": true, "requires": { "array-union": "^2.1.0", @@ -3439,45 +9429,14 @@ "ignore": "^5.1.4", "merge2": "^1.3.0", "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } } }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -3494,61 +9453,18 @@ } }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "lru-cache": "^6.0.0" } }, "html-encoding-sniffer": { @@ -3566,91 +9482,38 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "agent-base": "6", + "debug": "4" } }, "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "husky": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", - "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.6.0", - "cosmiconfig": "^7.0.0", - "find-versions": "^3.2.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } - } + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", + "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", + "dev": true }, "iconv-lite": { "version": "0.4.24", @@ -3662,25 +9525,33 @@ } }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "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" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } } }, "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", + "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==", "dev": true, "requires": { "pkg-dir": "^4.2.0", @@ -3721,87 +9592,21 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, "is-core-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", - "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", "dev": true, "requires": { "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true, - "optional": true - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3821,9 +9626,9 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "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" @@ -3847,31 +9652,16 @@ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", - "dev": true - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-text-path": { @@ -3889,50 +9679,16 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-instrument": { @@ -3964,29 +9720,12 @@ "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" - }, - "dependencies": { - "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 - }, - "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" - } - } } }, "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", @@ -3995,9 +9734,9 @@ } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", + "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -4005,594 +9744,284 @@ } }, "jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.2.tgz", + "integrity": "sha512-TAReynFYCfHNcrL+8Z74WPGafLFLF++bGkrpcsk6cO5G9S2VuJGhu2c44YFForMgF0GlYmtbpmeznkvZpNgTxg==", "dev": true, "requires": { - "@jest/core": "^26.6.3", + "@jest/core": "^27.4.2", "import-local": "^3.0.2", - "jest-cli": "^26.6.3" + "jest-cli": "^27.4.2" } }, "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz", + "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==", + "dev": true, + "requires": { + "@jest/types": "^27.4.2", + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "jest-circus": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.2.tgz", + "integrity": "sha512-2ePUSru1BGMyzxsMvRfu+tNb+PW60rUyMLJBfw1Nrh5zC8RoTPfF+zbE0JToU31a6ZVe4nnrNKWYRzlghAbL0A==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" + "@jest/environment": "^27.4.2", + "@jest/test-result": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.4.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.4.2", + "jest-matcher-utils": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-runtime": "^27.4.2", + "jest-snapshot": "^27.4.2", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" } }, "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.2.tgz", + "integrity": "sha512-Ex2WhCj4s0XFntTKTnyLgV/CZKgQaZBYrKz02XOZ4nUjFD+26Fji/M1SgHm+2IWEIsQqoipNRx9RJH56p8d7MQ==", "dev": true, "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/core": "^27.4.2", + "@jest/test-result": "^27.4.2", + "@jest/types": "^27.4.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", + "jest-config": "^27.4.2", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", "prompts": "^2.0.1", - "yargs": "^15.4.1" + "yargs": "^16.2.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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==", + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } } } }, "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.2.tgz", + "integrity": "sha512-2vKqelsfHPnIzrPTpE9hImqxZLp5l9Vszpci19RdVB2i5OwoM+OkPExZMQb8aGrpEGXoKtlzvdqCL1GObiz8JQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", + "@jest/test-sequencer": "^27.4.2", + "@jest/types": "^27.4.2", + "babel-jest": "^27.4.2", "chalk": "^4.0.0", + "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "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" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } + "jest-circus": "^27.4.2", + "jest-environment-jsdom": "^27.4.2", + "jest-environment-node": "^27.4.2", + "jest-get-type": "^27.4.0", + "jest-jasmine2": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.2", + "jest-runner": "^27.4.2", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", + "micromatch": "^4.0.4", + "pretty-format": "^27.4.2", + "slash": "^3.0.0" } }, "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.2.tgz", + "integrity": "sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "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" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } + "diff-sequences": "^27.4.0", + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.2" } }, "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz", + "integrity": "sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.2.tgz", + "integrity": "sha512-53V2MNyW28CTruB3lXaHNk6PkiIFuzdOC9gR3C6j8YE/ACfrPnz+slB0s17AgU1TtxNzLuHyvNlLJ+8QYw9nBg==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "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" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } + "jest-get-type": "^27.4.0", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.2" } }, "jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.2.tgz", + "integrity": "sha512-L0dV4oq4+Ll7hZ8QCGvSELn8uOr938/QKOg6o70kMHiZOpWOjAqSf7fMVAtGhG/BVSvk1GTzhGJNOWsxtH5KbQ==", "dev": true, "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.4.2", + "@jest/fake-timers": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/jsdom": "^16.2.4", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" + "jest-mock": "^27.4.2", + "jest-util": "^27.4.2", + "jsdom": "^16.6.0" } }, "jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.2.tgz", + "integrity": "sha512-nzTZ5nJ+FabuZPH2YVci7SZIHpvtNRHPt8+vipLkCnAgXGjVzHm7XJWdnNqXbAkExIgiKeVEkVMNZOZE/LeiIg==", "dev": true, "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.4.2", + "@jest/fake-timers": "^27.4.2", + "@jest/types": "^27.4.2", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-mock": "^27.4.2", + "jest-util": "^27.4.2" } }, "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", + "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==", "dev": true }, "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.2.tgz", + "integrity": "sha512-foiyAEePORUN2eeJnOtcM1y8qW0ShEd9kTjWVL4sVaMcuCJM6gtHegvYPBRT0mpI/bs4ueThM90+Eoj2ncoNsA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", + "fsevents": "^2.3.2", "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", + "jest-regex-util": "^27.4.0", + "jest-serializer": "^27.4.0", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.2", + "micromatch": "^4.0.4", "walker": "^1.0.7" } - }, - "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } - } - }, - "jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", - "dev": true, - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "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" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } - } - }, - "jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - }, - "dependencies": { - "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" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } + }, + "jest-jasmine2": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.2.tgz", + "integrity": "sha512-VO/fyAJSH9u0THjbteFiL8qc93ufU+yW+bdieDc8tzTCWwlWzO53UHS5nFK1qmE8izb5Smkn+XHlVt6/l06MKQ==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^27.4.2", + "@jest/source-map": "^27.4.0", + "@jest/test-result": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.4.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.4.2", + "jest-matcher-utils": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-runtime": "^27.4.2", + "jest-snapshot": "^27.4.2", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.2", + "throat": "^6.0.1" + } + }, + "jest-leak-detector": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz", + "integrity": "sha512-ml0KvFYZllzPBJWDei3mDzUhyp/M4ubKebX++fPaudpe8OsxUE+m+P6ciVLboQsrzOCWDjE20/eXew9QMx/VGw==", + "dev": true, + "requires": { + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.2" + } + }, + "jest-matcher-utils": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz", + "integrity": "sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.4.2", + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.2" + } + }, + "jest-message-util": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.2.tgz", + "integrity": "sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.4.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "pretty-format": "^27.4.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" } }, "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.2.tgz", + "integrity": "sha512-PDDPuyhoukk20JrQKeofK12hqtSka7mWH0QQuxSNgrdiPsrnYYLS6wbzu/HDlxZRzji5ylLRULeuI/vmZZDrYA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "@types/node": "*" } }, @@ -4600,261 +10029,129 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true + "dev": true, + "requires": {} }, "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz", + "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==", "dev": true }, "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.2.tgz", + "integrity": "sha512-d/zqPjxCzMqHlOdRTg8cTpO9jY+1/T74KazT8Ws/LwmwxV5sRMWOkiLjmzUCDj/5IqA5XHNK4Hkmlq9Kdpb9Sg==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.4.2", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } } }, "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.2.tgz", + "integrity": "sha512-hb++cTpqvOWfU49MCP/JQkxmnrhKoAVqXWFjgYXswRSVGk8Q6bDTSvhbCeYXDtXaymY0y7WrrSIlKogClcKJuw==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" + "@jest/types": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-snapshot": "^27.4.2" } }, "jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.2.tgz", + "integrity": "sha512-YsgbYKk8V7J5BQPINXhdzNLoqIwUWrJkV9h6/ccsn6fbmC3n3ax1K5cDWzAU9qXyaQhetwFqPpHmAHIACscRKQ==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.4.2", + "@jest/environment": "^27.4.2", + "@jest/test-result": "^27.4.2", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.7.1", + "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", + "jest-docblock": "^27.4.0", + "jest-environment-jsdom": "^27.4.2", + "jest-environment-node": "^27.4.2", + "jest-haste-map": "^27.4.2", + "jest-leak-detector": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-resolve": "^27.4.2", + "jest-runtime": "^27.4.2", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.2", "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } + "throat": "^6.0.1" } }, "jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.2.tgz", + "integrity": "sha512-eqPgcBaUNaw6j8T5M+dnfAEh6MIrh2YmtskCr9sl50QYpD22Sg+QqHw3J3nmaLzVMbBtOMHFFxLF0Qx8MsZVFQ==", + "dev": true, + "requires": { + "@jest/console": "^27.4.2", + "@jest/environment": "^27.4.2", + "@jest/globals": "^27.4.2", + "@jest/source-map": "^27.4.0", + "@jest/test-result": "^27.4.2", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/yargs": "^16.0.0", "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", + "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", + "jest-haste-map": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-mock": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.2", + "jest-snapshot": "^27.4.2", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", "slash": "^3.0.0", "strip-bom": "^4.0.0", - "yargs": "^15.4.1" + "yargs": "^16.2.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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==", + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } } } }, "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz", + "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==", "dev": true, "requires": { "@types/node": "*", @@ -4862,303 +10159,103 @@ } }, "jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.2.tgz", + "integrity": "sha512-DI7lJlNIu6WSQ+esqhnJzEzU70+dV+cNjoF1c+j5FagWEd3KtOyZvVliAH0RWNQ6KSnAAnKSU0qxJ8UXOOhuUQ==", "dev": true, "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^26.6.2", + "expect": "^27.4.2", "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", + "jest-diff": "^27.4.2", + "jest-get-type": "^27.4.0", + "jest-haste-map": "^27.4.2", + "jest-matcher-utils": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-resolve": "^27.4.2", + "jest-util": "^27.4.2", "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", + "pretty-format": "^27.4.2", "semver": "^7.3.2" - }, - "dependencies": { - "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" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } } }, "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz", + "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", + "ci-info": "^3.2.0", "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - }, - "dependencies": { - "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" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } + "picomatch": "^2.2.3" } }, "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "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" - } - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } - } - }, - "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.2.tgz", + "integrity": "sha512-hWYsSUej+Fs8ZhOm5vhWzwSLmVaPAxRy+Mr+z5MzeaHm9AxUpXdoVMEW4R86y5gOobVfBsMFLk4Rb+QkiEpx1A==", "dev": true, "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", + "@jest/types": "^27.4.2", + "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } + "jest-get-type": "^27.4.0", + "leven": "^3.1.0", + "pretty-format": "^27.4.2" + }, + "dependencies": { + "camelcase": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", + "dev": true } } }, + "jest-watcher": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.2.tgz", + "integrity": "sha512-NJvMVyyBeXfDezhWzUOCOYZrUmkSCiatpjpm+nFUid74OZEHk6aMLrZAukIiFDwdbqp6mTM6Ui1w4oc+8EobQg==", + "dev": true, + "requires": { + "@jest/test-result": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.4.2", + "string-length": "^4.0.1" + } + }, "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz", + "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==", "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "dependencies": { - "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 - }, "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==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -5173,52 +10270,46 @@ "dev": true }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "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": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dev": true, "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", + "abab": "^2.0.5", + "acorn": "^8.2.4", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", - "cssstyle": "^2.2.0", + "cssstyle": "^2.3.0", "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", + "decimal.js": "^10.2.1", "domexception": "^2.0.1", - "escodegen": "^1.14.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", + "tough-cookie": "^4.0.0", "w3c-hr-time": "^1.0.2", "w3c-xmlserializer": "^2.0.0", "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", "xml-name-validator": "^3.0.0" } }, @@ -5228,16 +10319,10 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "json-schema-traverse": { @@ -5252,29 +10337,23 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { "minimist": "^1.2.5" } }, "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, "jsonparse": { @@ -5283,16 +10362,14 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" } }, "kind-of": { @@ -5314,181 +10391,156 @@ "dev": true }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "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.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, + "lilconfig": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", + "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "dev": true + }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "lint-staged": { - "version": "10.5.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.2.tgz", - "integrity": "sha512-e8AYR1TDlzwB8VVd38Xu2lXDZf6BcshVqKVuBQThDJRaJLobqKnpbm4dkwJ2puypQNbLr9KF/9mfA649mAGvjA==", + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.1.2.tgz", + "integrity": "sha512-bSMcQVqMW98HLLLR2c2tZ+vnDCnx4fd+0QJBQgN/4XkdspGRPc8DGp7UuOEBe1ApCfJ+wXXumYnJmU+wDo7j9A==", "dev": true, "requires": { - "chalk": "^4.1.0", - "cli-truncate": "^2.1.0", - "commander": "^6.2.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.2.0", - "dedent": "^0.7.0", + "cli-truncate": "^3.1.0", + "colorette": "^2.0.16", + "commander": "^8.3.0", + "debug": "^4.3.2", "enquirer": "^2.3.6", - "execa": "^4.1.0", - "listr2": "^3.2.2", - "log-symbols": "^4.0.0", - "micromatch": "^4.0.2", + "execa": "^5.1.1", + "lilconfig": "2.0.4", + "listr2": "^3.13.3", + "micromatch": "^4.0.4", "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "string-argv": "0.3.1", - "stringify-object": "^3.3.0" + "object-inspect": "^1.11.0", + "string-argv": "^0.3.1", + "supports-color": "^9.0.2", + "yaml": "^1.10.2" }, "dependencies": { - "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" - } + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "dev": true }, - "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==", + "cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "requires": { - "color-name": "~1.1.4" + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" } }, - "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==", + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "has-flag": { + "is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "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" - } - } - } - }, - "listr2": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.3.tgz", - "integrity": "sha512-vUb80S2dSUi8YxXahO8/I/s29GqnOL8ozgHVLjfWQXa03BNEeS1TpBLjh2ruaqq5ufx46BRGvfymdBSuoXET5w==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "cli-truncate": "^2.1.0", - "figures": "^3.2.0", - "indent-string": "^4.0.0", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rxjs": "^6.6.3", - "through": "^2.3.8" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "string-width": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.0.1.tgz", + "integrity": "sha512-5ohWO/M4//8lErlUUtrFy3b11GtNOuMOU0ysKCDXFcfXuuvUXu95akgj/i8ofmaGdN0hCqyl6uu9i8dS/mQp5g==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "emoji-regex": "^9.2.2", + "is-fullwidth-code-point": "^4.0.0", + "strip-ansi": "^7.0.1" } }, - "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==", + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "requires": { - "color-name": "~1.1.4" + "ansi-regex": "^6.0.1" } }, - "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 - }, - "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 - }, "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" - } + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.1.tgz", + "integrity": "sha512-Obv7ycoCTG51N7y175StI9BlAXrmgZrFhZOb0/PyjHBher/NmsdBgbbQ1Inhq+gIhz6+7Gb+jWF2Vqi7Mf1xnQ==", + "dev": true } } }, + "listr2": { + "version": "3.13.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.13.5.tgz", + "integrity": "sha512-3n8heFQDSk+NcwBn3CgxEibZGaRzx+pC64n3YjpMD1qguV4nWus3Al+Oo3KooqFKTQEJ1v7MmnbnyyNspgx3NA==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.4.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + } + }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, "lodash.memoize": { @@ -5497,91 +10549,12 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "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 }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "dev": true, - "requires": { - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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 - }, - "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 - }, - "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" - } - } - } - }, "log-update": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", @@ -5594,30 +10567,6 @@ "wrap-ansi": "^6.2.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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 - }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -5628,9 +10577,29 @@ "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } } } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -5655,39 +10624,24 @@ "dev": true }, "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "requires": { - "tmpl": "1.0.x" + "tmpl": "1.0.5" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, "map-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", - "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, "requires": { "@types/minimist": "^1.2.0", @@ -5695,18 +10649,18 @@ "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", "minimist-options": "4.1.0", - "normalize-package-data": "^2.5.0", + "normalize-package-data": "^3.0.0", "read-pkg-up": "^7.0.1", "redent": "^3.0.0", "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "dependencies": { "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true } } @@ -5724,28 +10678,28 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", "dev": true }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "dev": true, "requires": { - "mime-db": "1.44.0" + "mime-db": "1.51.0" } }, "mimic-fn": { @@ -5786,59 +10740,18 @@ "kind-of": "^6.0.3" } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, "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 }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, "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 }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -5851,54 +10764,22 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", "dev": true }, - "node-notifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", - "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - }, - "dependencies": { - "uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", - "dev": true, - "optional": true - } - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -5922,98 +10803,12 @@ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -6032,54 +10827,36 @@ "mimic-fn": "^2.1.0" } }, - "opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", - "dev": true - }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "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.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "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" } }, - "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } }, "p-map": { @@ -6107,27 +10884,21 @@ } }, "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, "path-exists": { @@ -6149,9 +10920,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-type": { @@ -6160,18 +10931,27 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, + "pinst": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/pinst/-/pinst-2.1.6.tgz", + "integrity": "sha512-B4dYmf6nEXg1NpDSB+orYWvKa5Kfmz5KzWC29U59dpVM4S/+xp0ak/JMEsw04UQTNNKps7klu0BUalr343Gt9g==", + "dev": true, + "requires": { + "fromentries": "^1.3.2" + } + }, "pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", @@ -6226,92 +11006,41 @@ "requires": { "p-limit": "^2.2.0" } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true } } }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", - "dev": true, - "requires": { - "semver-compare": "^1.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", + "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", "dev": true }, "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.2.tgz", + "integrity": "sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", + "@jest/types": "^27.4.2", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, "dependencies": { "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true } } }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -6319,9 +11048,9 @@ "dev": true }, "prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "requires": { "kleur": "^3.0.3", @@ -6334,15 +11063,11 @@ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "q": { "version": "1.5.1", @@ -6350,16 +11075,22 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true }, "react-is": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", - "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "read-pkg": { @@ -6374,6 +11105,30 @@ "type-fest": "^0.6.0" }, "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", @@ -6391,34 +11146,64 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" }, "dependencies": { - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true } } }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -6429,149 +11214,25 @@ "strip-indent": "^3.0.0" } }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", - "dev": true - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "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 - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "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 - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { - "is-core-module": "^2.0.0", + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, @@ -6582,20 +11243,12 @@ "dev": true, "requires": { "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "resolve-global": { @@ -6604,24 +11257,13 @@ "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "requires": { - "global-dirs": "^0.1.1" - }, - "dependencies": { - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - } + "global-dirs": "^0.1.1" } }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", "dev": true }, "restore-cursor": { @@ -6634,18 +11276,18 @@ "signal-exit": "^3.0.2" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -6655,25 +11297,22 @@ "glob": "^7.1.3" } }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, "run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } }, "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", "dev": true, "requires": { - "tslib": "^1.9.0" + "tslib": "~2.1.0" } }, "safe-buffer": { @@ -6682,256 +11321,12 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -6942,56 +11337,12 @@ } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true - }, - "semver-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } + "lru-cache": "^6.0.0" } }, "shebang-command": { @@ -7009,17 +11360,10 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "dev": true }, "sisteransi": { @@ -7043,194 +11387,6 @@ "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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 - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "source-map": { @@ -7239,35 +11395,16 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -7295,27 +11432,18 @@ } }, "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", "dev": true }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, "requires": { - "through2": "^2.0.2" + "readable-stream": "^3.0.0" } }, "sprintf-js": { @@ -7324,123 +11452,39 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true } } }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } }, "string-argv": { "version": "0.3.1", @@ -7449,9 +11493,9 @@ "dev": true }, "string-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", - "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "requires": { "char-regex": "^1.0.2", @@ -7459,42 +11503,23 @@ } }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - } + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "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.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -7503,12 +11528,6 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -7531,39 +11550,22 @@ "dev": true }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "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": "^3.0.0" + "has-flag": "^4.0.0" } }, "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", "dev": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" - }, - "dependencies": { - "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 - }, - "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" - } - } } }, "symbol-tree": { @@ -7572,75 +11574,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -7675,9 +11608,9 @@ "dev": true }, "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", "dev": true }, "through": { @@ -7687,19 +11620,18 @@ "dev": true }, "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "readable-stream": "3" } }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-fast-properties": { @@ -7708,38 +11640,6 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -7750,117 +11650,99 @@ } }, "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" }, "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true } } }, "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, "requires": { "punycode": "^2.1.1" - }, - "dependencies": { - "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 - } } }, "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", - "dev": true - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, "ts-jest": { - "version": "26.4.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.4.4.tgz", - "integrity": "sha512-3lFWKbLxJm34QxyVNNCgXX1u4o/RV0myvA2y2Bxm46iGIjKlaY0own9gIckbjZJPn+WaJEnfPPJ20HHGpoq4yg==", + "version": "27.0.7", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.7.tgz", + "integrity": "sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q==", "dev": true, "requires": { - "@types/jest": "26.x", "bs-logger": "0.x", - "buffer-from": "1.x", "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", + "jest-util": "^27.0.0", "json5": "2.x", "lodash.memoize": "4.x", "make-error": "1.x", - "mkdirp": "1.x", "semver": "7.x", "yargs-parser": "20.x" - }, - "dependencies": { - "yargs-parser": { - "version": "20.2.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.3.tgz", - "integrity": "sha512-emOFRT9WVHw03QSvN5qor9QQT9+sw5vwxfYweivSMHTcAXPefwVae2FjO7JJjj8hCE4CzPOPeFM83VwT29HCww==", - "dev": true - } + } + }, + "ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" } }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", "dev": true }, "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "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.1.2" + "prelude-ls": "^1.2.1" } }, "type-detect": { @@ -7870,9 +11752,9 @@ "dev": true }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "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 }, "typedarray-to-buffer": { @@ -7885,128 +11767,42 @@ } }, "typescript": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", - "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", "dev": true }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "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" - }, - "dependencies": { - "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 - } } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, "v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "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 }, "v8-to-istanbul": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz", - "integrity": "sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz", + "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -8032,17 +11828,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -8062,12 +11847,12 @@ } }, "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "requires": { - "makeerror": "1.0.x" + "makeerror": "1.0.12" } }, "webidl-conversions": { @@ -8092,13 +11877,13 @@ "dev": true }, "whatwg-url": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", + "lodash": "^4.7.0", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" } }, @@ -8111,18 +11896,6 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "dev": true - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -8130,40 +11903,14 @@ "dev": true }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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 - } } }, "wrappy": { @@ -8172,26 +11919,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", @@ -8205,10 +11932,11 @@ } }, "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", - "dev": true + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "dev": true, + "requires": {} }, "xml-name-validator": { "version": "3.0.0", @@ -8222,52 +11950,56 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, - "y18n": { + "yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index a60e6fb..5813f85 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,11 @@ { "name": "@coderbyheart/advent-of-code", "version": "0.0.0-development", - "description": "Advent of Code 2020 solutions in TypeScript", + "description": "Advent of Code 2021 solutions in TypeScript", + "type": "module", "scripts": { - "test": "jest" + "test": "jest", + "postinstall": "husky install" }, "repository": { "type": "git", @@ -16,30 +18,23 @@ "keywords": [ "Advent of Code", "TypeScript", - "aoc2020" + "aoc2021" ], "author": "Markus Tacker | https://coderbyheart.com", "license": "MIT", "devDependencies": { - "@bifravst/code-style": "8.0.134", - "@bifravst/eslint-config-typescript": "5.0.79", - "@commitlint/cli": "11.0.0", - "@commitlint/config-angular": "11.0.0", - "@types/jest": "26.0.16", - "@types/node": "14.14.10", - "eslint": "^7.14.0", - "husky": "^4.3.0", - "jest": "26.6.3", - "lint-staged": "^10.5.2", - "prettier": "2.2.1", - "ts-jest": "26.4.4", - "typescript": "4.1.2" - }, - "husky": { - "hooks": { - "commit-msg": "commitlint -E HUSKY_GIT_PARAMS", - "pre-commit": "lint-staged && npx jest --onlyChanged" - } + "@commitlint/cli": "15.0.0", + "@commitlint/config-angular": "15.0.0", + "@nordicsemiconductor/asset-tracker-cloud-code-style": "9.2.26", + "@types/jest": "27.0.3", + "@types/node": "16.11.11", + "eslint": "8.3.0", + "husky": "7.0.4", + "jest": "27.4.2", + "lint-staged": "12.1.2", + "prettier": "2.5.0", + "ts-jest": "27.0.7", + "typescript": "4.5.2" }, "lint-staged": { "*.ts": [ @@ -51,25 +46,12 @@ ] }, "engines": { - "node": ">=14.0.0", - "npm": ">=6.0.0" + "node": ">=16.0.0", + "npm": ">=8.0.0" }, "jest": { - "testURL": "http://localhost", - "moduleFileExtensions": [ - "ts", - "tsx", - "js", - "json" - ], - "transform": { - "^.+\\.tsx?$": "ts-jest" - }, - "testRegex": ".+\\.spec\\.ts$", - "globals": { - "ts-jest": { - "diagnostics": true - } - } - } + "preset": "ts-jest", + "testRegex": ".+\\.spec\\.ts$" + }, + "prettier": "@nordicsemiconductor/asset-tracker-cloud-code-style/.prettierrc" } diff --git a/tsconfig.json b/tsconfig.json index 5e2a8bc..cc4d480 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,10 @@ { - "extends": "@bifravst/code-style/tsconfig.json", + "extends": "@nordicsemiconductor/asset-tracker-cloud-code-style/tsconfig.json", "include": ["**/*.ts"], "compilerOptions": { - "outDir": "dist/" + "outDir": "dist/", + "moduleResolution": "node", + "module": "ES2020", + "allowSyntheticDefaultImports": true } } From acce0aa14d7ef4e9913cb40c53decf327a329de2 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 1 Dec 2021 09:10:36 +0100 Subject: [PATCH 062/110] feat(day01): part 1 --- day01/depthChanges.ts | 6 + day01/part1.txt | 2000 ++++++++++++++++++++++++++++++++++++++++ day01/solution.spec.ts | 15 + 3 files changed, 2021 insertions(+) create mode 100644 day01/depthChanges.ts create mode 100644 day01/part1.txt create mode 100644 day01/solution.spec.ts diff --git a/day01/depthChanges.ts b/day01/depthChanges.ts new file mode 100644 index 0000000..5cccdb1 --- /dev/null +++ b/day01/depthChanges.ts @@ -0,0 +1,6 @@ +export const depthChanges = (depths: number[]): number => + depths.reduce((dives, depth, k, depths) => { + const previousDepth = depths[k - 1] ?? Number.MAX_VALUE + if (depth > previousDepth) return dives + 1 + return dives + }, 0) diff --git a/day01/part1.txt b/day01/part1.txt new file mode 100644 index 0000000..1d364e8 --- /dev/null +++ b/day01/part1.txt @@ -0,0 +1,2000 @@ +191 +192 +201 +205 +206 +203 +188 +189 +199 +206 +224 +230 +233 +232 +260 +257 +258 +259 +251 +233 +236 +237 +238 +241 +242 +243 +250 +259 +251 +255 +263 +265 +266 +259 +265 +260 +267 +270 +271 +284 +286 +301 +302 +304 +309 +333 +335 +342 +350 +349 +342 +343 +345 +346 +331 +332 +317 +324 +328 +327 +332 +320 +340 +341 +344 +353 +361 +372 +376 +387 +397 +433 +431 +432 +436 +435 +449 +460 +474 +476 +483 +490 +487 +488 +495 +500 +511 +531 +537 +525 +503 +506 +515 +517 +518 +517 +514 +516 +521 +515 +516 +517 +526 +514 +490 +487 +484 +482 +474 +476 +480 +479 +474 +482 +480 +481 +483 +484 +482 +481 +477 +478 +482 +483 +494 +517 +520 +517 +510 +497 +481 +519 +522 +524 +528 +530 +543 +542 +543 +531 +529 +528 +526 +499 +521 +526 +518 +533 +535 +538 +542 +572 +573 +574 +548 +550 +559 +567 +569 +570 +571 +570 +587 +592 +600 +620 +630 +627 +652 +659 +656 +663 +661 +666 +681 +687 +702 +714 +715 +711 +714 +722 +719 +723 +721 +720 +731 +724 +726 +732 +735 +736 +739 +745 +739 +747 +745 +758 +755 +754 +755 +756 +757 +758 +759 +760 +763 +799 +800 +810 +825 +826 +829 +841 +848 +852 +855 +858 +856 +874 +894 +897 +892 +925 +932 +935 +931 +953 +971 +967 +953 +957 +941 +950 +952 +923 +922 +933 +938 +943 +944 +964 +952 +935 +913 +901 +902 +903 +904 +901 +909 +910 +909 +929 +930 +929 +924 +916 +904 +897 +905 +908 +899 +898 +903 +907 +924 +915 +919 +911 +915 +916 +926 +931 +933 +965 +967 +968 +979 +981 +997 +1009 +1012 +1010 +1011 +1036 +1035 +1049 +1050 +1048 +1053 +1054 +1055 +1053 +1046 +1055 +1069 +1067 +1062 +1081 +1079 +1091 +1093 +1095 +1093 +1100 +1091 +1093 +1107 +1109 +1105 +1111 +1121 +1140 +1141 +1148 +1149 +1162 +1166 +1165 +1163 +1164 +1165 +1169 +1182 +1188 +1186 +1185 +1165 +1169 +1176 +1177 +1179 +1183 +1182 +1188 +1191 +1181 +1183 +1204 +1203 +1204 +1206 +1201 +1215 +1232 +1234 +1239 +1243 +1235 +1239 +1242 +1238 +1240 +1241 +1263 +1259 +1267 +1257 +1261 +1265 +1264 +1261 +1260 +1262 +1265 +1263 +1266 +1262 +1263 +1268 +1271 +1282 +1286 +1287 +1284 +1280 +1279 +1280 +1288 +1289 +1292 +1287 +1293 +1301 +1329 +1343 +1350 +1347 +1348 +1354 +1356 +1359 +1360 +1363 +1369 +1366 +1369 +1370 +1368 +1373 +1376 +1385 +1391 +1400 +1411 +1415 +1396 +1398 +1428 +1433 +1442 +1444 +1436 +1467 +1469 +1470 +1484 +1485 +1489 +1498 +1468 +1469 +1468 +1465 +1459 +1460 +1458 +1459 +1460 +1462 +1467 +1479 +1499 +1501 +1512 +1515 +1516 +1519 +1524 +1538 +1547 +1558 +1563 +1573 +1584 +1592 +1606 +1632 +1630 +1637 +1640 +1633 +1662 +1677 +1681 +1679 +1681 +1683 +1684 +1704 +1709 +1705 +1702 +1701 +1700 +1707 +1708 +1717 +1709 +1718 +1721 +1738 +1740 +1746 +1748 +1750 +1751 +1757 +1758 +1765 +1767 +1749 +1730 +1732 +1745 +1751 +1752 +1750 +1747 +1746 +1751 +1756 +1766 +1767 +1769 +1767 +1775 +1806 +1812 +1808 +1809 +1845 +1846 +1848 +1860 +1864 +1866 +1868 +1874 +1853 +1852 +1848 +1835 +1851 +1850 +1843 +1842 +1835 +1862 +1865 +1859 +1886 +1887 +1888 +1900 +1926 +1942 +1944 +1945 +1946 +1945 +1939 +1946 +1951 +1946 +1951 +1957 +1971 +1985 +1986 +1987 +1990 +1991 +1992 +1991 +1986 +1989 +1991 +1998 +1996 +2002 +2003 +2007 +2009 +2010 +1989 +1991 +1990 +1991 +2001 +2016 +2017 +2026 +2028 +2039 +2038 +2053 +2047 +2052 +2049 +2050 +2052 +2057 +2055 +2053 +2051 +2042 +2027 +2036 +2026 +2040 +2042 +2046 +2045 +2050 +2051 +2072 +2073 +2075 +2072 +2078 +2077 +2082 +2087 +2074 +2079 +2074 +2070 +2071 +2070 +2074 +2076 +2077 +2084 +2086 +2089 +2102 +2100 +2102 +2104 +2110 +2112 +2093 +2104 +2107 +2104 +2130 +2101 +2103 +2102 +2103 +2111 +2116 +2117 +2122 +2119 +2126 +2127 +2128 +2148 +2159 +2160 +2157 +2165 +2173 +2169 +2170 +2175 +2161 +2151 +2163 +2172 +2209 +2211 +2209 +2223 +2222 +2221 +2220 +2226 +2228 +2229 +2226 +2234 +2214 +2212 +2216 +2215 +2220 +2223 +2228 +2234 +2233 +2235 +2233 +2235 +2264 +2263 +2262 +2285 +2287 +2303 +2286 +2287 +2279 +2280 +2285 +2279 +2281 +2291 +2295 +2322 +2323 +2332 +2337 +2340 +2343 +2344 +2370 +2371 +2370 +2377 +2385 +2390 +2389 +2396 +2401 +2407 +2410 +2411 +2412 +2413 +2415 +2422 +2419 +2431 +2439 +2444 +2447 +2457 +2443 +2455 +2466 +2483 +2471 +2472 +2481 +2486 +2490 +2470 +2471 +2483 +2481 +2480 +2490 +2529 +2541 +2546 +2547 +2570 +2574 +2560 +2558 +2562 +2561 +2566 +2565 +2563 +2569 +2571 +2582 +2596 +2594 +2593 +2594 +2585 +2566 +2567 +2550 +2559 +2551 +2561 +2542 +2544 +2553 +2557 +2561 +2574 +2577 +2593 +2601 +2613 +2621 +2623 +2628 +2627 +2648 +2640 +2639 +2664 +2649 +2659 +2663 +2662 +2664 +2659 +2660 +2659 +2675 +2654 +2655 +2657 +2656 +2662 +2669 +2663 +2652 +2645 +2656 +2664 +2660 +2680 +2684 +2673 +2678 +2675 +2662 +2663 +2666 +2668 +2681 +2676 +2687 +2688 +2689 +2688 +2689 +2692 +2693 +2704 +2703 +2702 +2701 +2707 +2710 +2711 +2713 +2712 +2687 +2697 +2698 +2699 +2733 +2731 +2738 +2739 +2740 +2746 +2741 +2744 +2741 +2746 +2744 +2731 +2733 +2740 +2741 +2745 +2747 +2748 +2765 +2774 +2787 +2789 +2790 +2794 +2797 +2778 +2788 +2790 +2789 +2784 +2788 +2789 +2807 +2826 +2842 +2835 +2834 +2837 +2846 +2847 +2849 +2866 +2868 +2880 +2881 +2885 +2892 +2893 +2895 +2896 +2905 +2907 +2914 +2917 +2915 +2910 +2914 +2916 +2917 +2926 +2927 +2946 +2961 +2962 +2952 +2954 +2960 +2972 +2976 +2978 +2999 +3007 +3009 +2998 +3001 +3021 +3017 +3011 +3013 +3010 +3007 +3019 +3020 +3037 +3038 +3037 +3041 +3046 +3060 +3064 +3066 +3056 +3059 +3058 +3049 +3056 +3063 +3065 +3055 +3056 +3055 +3054 +3067 +3066 +3071 +3075 +3057 +3056 +3057 +3070 +3082 +3107 +3109 +3107 +3102 +3101 +3103 +3098 +3096 +3097 +3093 +3095 +3097 +3106 +3124 +3125 +3128 +3137 +3145 +3143 +3146 +3120 +3122 +3135 +3129 +3158 +3159 +3176 +3212 +3216 +3220 +3222 +3225 +3229 +3235 +3252 +3247 +3252 +3256 +3259 +3270 +3277 +3286 +3296 +3311 +3322 +3324 +3331 +3363 +3364 +3376 +3372 +3373 +3384 +3392 +3397 +3393 +3395 +3407 +3408 +3409 +3404 +3409 +3414 +3422 +3427 +3426 +3428 +3410 +3418 +3416 +3408 +3406 +3411 +3412 +3418 +3427 +3425 +3413 +3400 +3399 +3400 +3393 +3394 +3395 +3394 +3393 +3392 +3389 +3390 +3394 +3395 +3402 +3394 +3395 +3415 +3405 +3407 +3432 +3439 +3437 +3439 +3458 +3461 +3469 +3464 +3463 +3464 +3453 +3458 +3452 +3455 +3456 +3459 +3464 +3468 +3471 +3474 +3476 +3475 +3477 +3479 +3481 +3482 +3492 +3501 +3506 +3501 +3497 +3498 +3501 +3502 +3496 +3510 +3513 +3515 +3533 +3534 +3545 +3552 +3561 +3554 +3561 +3562 +3563 +3564 +3553 +3554 +3558 +3546 +3547 +3561 +3563 +3547 +3570 +3572 +3579 +3590 +3604 +3634 +3627 +3630 +3629 +3632 +3598 +3599 +3619 +3617 +3630 +3624 +3625 +3627 +3636 +3632 +3633 +3638 +3642 +3640 +3621 +3623 +3620 +3627 +3625 +3624 +3616 +3648 +3630 +3625 +3628 +3634 +3629 +3649 +3651 +3652 +3653 +3660 +3672 +3674 +3684 +3706 +3707 +3713 +3708 +3707 +3697 +3674 +3670 +3671 +3670 +3674 +3676 +3677 +3674 +3693 +3691 +3693 +3694 +3698 +3662 +3671 +3664 +3665 +3666 +3667 +3665 +3666 +3667 +3666 +3667 +3663 +3662 +3665 +3659 +3651 +3657 +3656 +3663 +3659 +3669 +3666 +3652 +3643 +3635 +3665 +3673 +3682 +3681 +3674 +3673 +3677 +3674 +3672 +3674 +3677 +3685 +3697 +3696 +3708 +3704 +3702 +3705 +3709 +3740 +3741 +3740 +3734 +3738 +3741 +3743 +3741 +3723 +3693 +3703 +3702 +3712 +3713 +3705 +3706 +3703 +3718 +3749 +3761 +3760 +3763 +3765 +3757 +3733 +3740 +3736 +3762 +3761 +3771 +3764 +3761 +3763 +3762 +3756 +3771 +3753 +3759 +3789 +3791 +3792 +3780 +3787 +3788 +3786 +3792 +3793 +3790 +3794 +3795 +3794 +3791 +3801 +3802 +3811 +3813 +3815 +3818 +3824 +3835 +3837 +3836 +3838 +3840 +3841 +3842 +3840 +3841 +3843 +3872 +3879 +3884 +3871 +3878 +3896 +3897 +3896 +3895 +3893 +3887 +3882 +3885 +3887 +3875 +3876 +3856 +3859 +3853 +3831 +3832 +3831 +3830 +3814 +3815 +3799 +3814 +3811 +3834 +3845 +3842 +3847 +3853 +3854 +3853 +3851 +3870 +3869 +3870 +3868 +3876 +3874 +3875 +3872 +3866 +3874 +3873 +3857 +3858 +3857 +3865 +3874 +3865 +3876 +3878 +3881 +3883 +3884 +3885 +3887 +3863 +3862 +3864 +3867 +3872 +3875 +3876 +3884 +3880 +3891 +3897 +3898 +3894 +3891 +3895 +3893 +3912 +3913 +3910 +3916 +3912 +3917 +3925 +3937 +3942 +3941 +3947 +3952 +3955 +3952 +3944 +3945 +3946 +3960 +3985 +4012 +4013 +4014 +4012 +4032 +4045 +4029 +4030 +4048 +4055 +4054 +4072 +4073 +4083 +4085 +4086 +4091 +4094 +4097 +4112 +4090 +4102 +4108 +4134 +4147 +4148 +4149 +4172 +4175 +4182 +4176 +4154 +4170 +4180 +4179 +4186 +4187 +4182 +4170 +4172 +4178 +4181 +4193 +4188 +4193 +4192 +4202 +4205 +4207 +4185 +4183 +4187 +4189 +4204 +4207 +4202 +4204 +4201 +4214 +4219 +4216 +4211 +4199 +4196 +4195 +4199 +4200 +4201 +4192 +4191 +4195 +4217 +4205 +4210 +4218 +4204 +4207 +4213 +4214 +4215 +4233 +4240 +4253 +4251 +4253 +4262 +4266 +4257 +4261 +4262 +4271 +4263 +4262 +4284 +4288 +4267 +4276 +4283 +4284 +4283 +4284 +4281 +4278 +4266 +4261 +4260 +4276 +4281 +4283 +4272 +4297 +4302 +4301 +4312 +4311 +4329 +4346 +4336 +4347 +4365 +4364 +4366 +4370 +4372 +4365 +4364 +4367 +4365 +4366 +4368 +4369 +4372 +4379 +4373 +4391 +4390 +4393 +4389 +4370 +4372 +4375 +4376 +4378 +4387 +4388 +4408 +4419 +4421 +4414 +4415 +4413 +4415 +4419 +4420 +4405 +4422 +4421 +4423 +4435 +4434 +4439 +4441 +4443 +4450 +4446 +4450 +4452 +4453 +4454 +4458 +4462 +4475 +4492 +4489 +4494 +4498 +4497 +4498 +4499 +4511 +4515 +4516 +4529 +4534 +4538 +4540 +4537 +4544 +4561 +4562 +4563 +4565 +4569 +4564 +4569 +4576 +4580 +4619 +4618 +4620 +4633 +4634 +4613 +4611 +4614 +4632 +4618 +4629 +4631 +4643 +4640 +4644 +4628 +4630 +4632 +4631 +4648 +4652 +4651 +4640 +4637 +4638 +4641 +4649 +4654 +4650 +4648 +4651 +4650 +4630 +4631 +4632 +4628 +4634 +4633 +4635 +4641 +4633 +4632 +4634 +4646 +4658 +4654 +4639 +4658 +4659 +4664 +4673 +4679 +4681 +4687 +4685 +4719 +4720 +4721 +4731 +4741 +4744 +4727 +4729 +4735 +4738 +4748 +4749 +4750 +4746 +4753 +4754 +4762 +4773 +4774 +4777 +4783 +4782 +4793 +4799 +4805 +4810 +4813 +4812 +4824 +4817 +4815 +4817 +4816 +4804 +4809 +4827 +4820 +4819 +4849 +4850 +4851 +4850 +4862 +4861 +4873 +4875 +4878 +4879 +4882 +4883 +4878 +4880 +4893 +4890 +4891 +4886 +4889 +4890 +4904 +4902 +4925 +4927 +4923 +4920 +4915 +4924 +4896 +4898 +4891 +4894 +4898 +4900 +4901 +4902 +4912 +4913 +4911 +4908 +4917 +4905 +4908 +4931 +4934 +4969 +4973 +4972 +4982 +4983 +5001 +5000 +5004 +5009 +5007 +5002 +5000 +4999 +5000 +5002 +4991 +4993 +4997 +4998 +5000 +5003 +4998 +4999 +4996 +5005 +5004 +4993 +4994 +4995 +4996 +5000 +5004 +5011 +5013 +5012 +5002 +4999 +4979 +4989 +4992 +5002 +5004 +5005 +5004 +5027 +5026 +5027 +5031 +5035 +5037 +5044 +5050 +5057 +5062 +5065 +5062 +5056 +5058 +5065 +5073 +5093 +5092 +5109 +5110 +5130 +5137 +5159 +5172 +5164 +5194 +5196 +5197 +5234 +5233 +5222 +5225 +5227 +5231 +5248 +5249 +5261 +5254 +5255 +5256 +5257 +5254 +5252 +5253 +5261 +5279 +5266 +5267 +5259 +5283 +5309 +5332 +5335 +5336 +5337 +5336 +5344 +5349 +5356 +5386 +5396 +5403 +5409 +5410 +5413 +5415 +5417 +5431 +5433 +5436 +5434 +5436 +5440 +5450 +5449 +5461 +5480 +5482 +5479 +5481 +5482 +5494 +5495 +5494 +5495 +5498 +5497 +5510 +5512 +5508 +5499 +5509 +5520 +5540 +5553 +5554 +5555 +5568 +5550 +5540 +5535 +5564 +5567 +5575 +5574 +5586 +5579 +5580 +5579 +5577 +5588 +5592 +5562 +5568 +5589 +5595 +5606 +5607 +5596 +5608 +5627 +5635 +5632 +5631 +5630 +5629 +5628 +5626 +5625 +5629 +5630 +5629 +5630 +5633 +5634 +5639 +5640 +5660 +5666 +5660 +5663 +5662 +5672 +5671 +5652 +5650 +5667 +5666 +5642 +5643 +5642 +5640 +5642 +5644 +5649 +5650 +5647 +5648 +5647 +5651 +5650 +5651 +5653 +5646 +5627 +5636 +5635 +5623 +5624 +5625 +5624 +5633 +5630 +5622 +5619 +5616 +5634 +5635 +5630 +5664 +5671 +5673 +5671 +5683 +5693 +5699 +5700 +5701 +5697 +5693 +5664 +5665 +5677 +5670 +5684 +5653 +5648 +5646 +5648 +5645 +5651 +5650 +5651 +5652 +5653 +5654 +5639 +5648 +5640 +5657 +5667 +5685 +5706 +5697 +5698 +5702 +5709 +5705 +5720 +5723 +5716 +5712 +5708 +5707 +5668 +5665 +5666 +5667 +5666 +5670 +5669 +5670 +5671 +5675 +5676 +5682 +5683 +5673 +5675 +5666 +5675 +5677 +5686 +5693 +5694 +5676 +5677 +5678 +5680 +5689 +5712 +5714 +5730 +5729 +5740 +5743 +5776 +5777 +5788 +5787 +5783 +5791 \ No newline at end of file diff --git a/day01/solution.spec.ts b/day01/solution.spec.ts new file mode 100644 index 0000000..d7590f7 --- /dev/null +++ b/day01/solution.spec.ts @@ -0,0 +1,15 @@ +import { loader } from '../lib/loader' +import { depthChanges } from './depthChanges' + +describe('Day 1: Sonar Sweep', () => { + describe('Part 1', () => { + it('should solve the example', () => + expect( + depthChanges([199, 200, 208, 210, 200, 207, 240, 269, 260, 263]), + ).toEqual(7)) + it('should solve the puzzle', () => + expect( + depthChanges(loader(1)('part1').map((s) => parseInt(s, 10))), + ).toEqual(1374)) + }) +}) From 60a75756807eeba01ff68a58a4fce3fc0f10feb5 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 1 Dec 2021 09:11:00 +0100 Subject: [PATCH 063/110] fix: update eslint config --- .eslintrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslintrc b/.eslintrc index 5a80290..9358383 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,3 +1,3 @@ { - "extends": "@bifravst/eslint-config-typescript" + "extends": "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript" } From 60caf995ef423c1d9ce17a16f8496e824f143e44 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 1 Dec 2021 09:12:09 +0100 Subject: [PATCH 064/110] docs: only run changed tests --- .husky/pre-commit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index a764fb0..95bbcbd 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" -npx lint-staged && npm test && npx tsc \ No newline at end of file +npx lint-staged && npm exec -- jest --onlyChanged && npx tsc \ No newline at end of file From e1217c059c4be717258d58ba7369e15340971f16 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 1 Dec 2021 09:45:43 +0100 Subject: [PATCH 065/110] feat(day01): part 2 --- day01/depthChanges.ts | 16 +++++++++++++++- day01/{part1.txt => input.txt} | 0 day01/slidingWindowDepth.spec.ts | 14 ++++++++++++++ day01/slidingWindowDepth.ts | 12 ++++++++++++ day01/solution.spec.ts | 16 +++++++++++++--- 5 files changed, 54 insertions(+), 4 deletions(-) rename day01/{part1.txt => input.txt} (100%) create mode 100644 day01/slidingWindowDepth.spec.ts create mode 100644 day01/slidingWindowDepth.ts diff --git a/day01/depthChanges.ts b/day01/depthChanges.ts index 5cccdb1..992d6c0 100644 --- a/day01/depthChanges.ts +++ b/day01/depthChanges.ts @@ -1,6 +1,20 @@ +import { slidingWindowDepth } from './slidingWindowDepth' + +export const slidingDepthChanges = + (windowSize: number) => + (depths: number[]): number => { + const depthsWindow = slidingWindowDepth(depths, windowSize) + return depths.reduce((dives, _, k) => { + const currentWindowDepth = depthsWindow(k) + const previousWindowDepth = depthsWindow(k - 1) + if (currentWindowDepth > previousWindowDepth) return dives + 1 + return dives + }, 0) + } + export const depthChanges = (depths: number[]): number => depths.reduce((dives, depth, k, depths) => { - const previousDepth = depths[k - 1] ?? Number.MAX_VALUE + const previousDepth = depths[k - 1] ?? Number.MAX_SAFE_INTEGER if (depth > previousDepth) return dives + 1 return dives }, 0) diff --git a/day01/part1.txt b/day01/input.txt similarity index 100% rename from day01/part1.txt rename to day01/input.txt diff --git a/day01/slidingWindowDepth.spec.ts b/day01/slidingWindowDepth.spec.ts new file mode 100644 index 0000000..addc1e0 --- /dev/null +++ b/day01/slidingWindowDepth.spec.ts @@ -0,0 +1,14 @@ +import { slidingWindowDepth } from './slidingWindowDepth' + +const sample = [199, 200, 208, 210, 200, 207, 240, 269, 260, 263] + +describe('slidingWindowDepth()', () => { + it.each([ + [0, Number.MAX_SAFE_INTEGER], + [1, Number.MAX_SAFE_INTEGER], + [2, 607], + [3, 618], + ])('should calculate the sliding window depth', (k, depth) => + expect(slidingWindowDepth(sample, 3)(k)).toEqual(depth), + ) +}) diff --git a/day01/slidingWindowDepth.ts b/day01/slidingWindowDepth.ts new file mode 100644 index 0000000..c12bfca --- /dev/null +++ b/day01/slidingWindowDepth.ts @@ -0,0 +1,12 @@ +export const slidingWindowDepth = + (depths: number[], windowSize: number) => + (index: number): number => { + let currentWindowDepth = depths[index] + if (currentWindowDepth === undefined) return Number.MAX_SAFE_INTEGER + for (let j = 1; j < windowSize; j++) { + const prev = depths[index - j] + if (prev === undefined) return Number.MAX_SAFE_INTEGER + currentWindowDepth += prev + } + return currentWindowDepth + } diff --git a/day01/solution.spec.ts b/day01/solution.spec.ts index d7590f7..9cd00df 100644 --- a/day01/solution.spec.ts +++ b/day01/solution.spec.ts @@ -1,5 +1,7 @@ import { loader } from '../lib/loader' -import { depthChanges } from './depthChanges' +import { depthChanges, slidingDepthChanges } from './depthChanges' + +const input = loader(1)('input').map((s) => parseInt(s, 10)) describe('Day 1: Sonar Sweep', () => { describe('Part 1', () => { @@ -8,8 +10,16 @@ describe('Day 1: Sonar Sweep', () => { depthChanges([199, 200, 208, 210, 200, 207, 240, 269, 260, 263]), ).toEqual(7)) it('should solve the puzzle', () => + expect(depthChanges(input)).toEqual(1374)) + }) + describe('Part 2', () => { + it('should solve the example', () => expect( - depthChanges(loader(1)('part1').map((s) => parseInt(s, 10))), - ).toEqual(1374)) + slidingDepthChanges(3)([ + 199, 200, 208, 210, 200, 207, 240, 269, 260, 263, + ]), + ).toEqual(5)) + it('should solve the puzzle', () => + expect(slidingDepthChanges(3)(input)).toEqual(1418)) }) }) From ffcd0f58cf0f5fe9eed8321bd2c689590ff5d432 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 1 Dec 2021 09:46:36 +0100 Subject: [PATCH 066/110] feat(day01): part 2 --- day01/depthChanges.ts | 14 -------------- day01/slidingDepthChanges.ts | 13 +++++++++++++ day01/solution.spec.ts | 3 ++- 3 files changed, 15 insertions(+), 15 deletions(-) create mode 100644 day01/slidingDepthChanges.ts diff --git a/day01/depthChanges.ts b/day01/depthChanges.ts index 992d6c0..d6b8792 100644 --- a/day01/depthChanges.ts +++ b/day01/depthChanges.ts @@ -1,17 +1,3 @@ -import { slidingWindowDepth } from './slidingWindowDepth' - -export const slidingDepthChanges = - (windowSize: number) => - (depths: number[]): number => { - const depthsWindow = slidingWindowDepth(depths, windowSize) - return depths.reduce((dives, _, k) => { - const currentWindowDepth = depthsWindow(k) - const previousWindowDepth = depthsWindow(k - 1) - if (currentWindowDepth > previousWindowDepth) return dives + 1 - return dives - }, 0) - } - export const depthChanges = (depths: number[]): number => depths.reduce((dives, depth, k, depths) => { const previousDepth = depths[k - 1] ?? Number.MAX_SAFE_INTEGER diff --git a/day01/slidingDepthChanges.ts b/day01/slidingDepthChanges.ts new file mode 100644 index 0000000..f884d2f --- /dev/null +++ b/day01/slidingDepthChanges.ts @@ -0,0 +1,13 @@ +import { slidingWindowDepth } from './slidingWindowDepth' + +export const slidingDepthChanges = + (windowSize: number) => + (depths: number[]): number => { + const depthsWindow = slidingWindowDepth(depths, windowSize) + return depths.reduce((dives, _, k) => { + const currentWindowDepth = depthsWindow(k) + const previousWindowDepth = depthsWindow(k - 1) + if (currentWindowDepth > previousWindowDepth) return dives + 1 + return dives + }, 0) + } diff --git a/day01/solution.spec.ts b/day01/solution.spec.ts index 9cd00df..60068f7 100644 --- a/day01/solution.spec.ts +++ b/day01/solution.spec.ts @@ -1,5 +1,6 @@ import { loader } from '../lib/loader' -import { depthChanges, slidingDepthChanges } from './depthChanges' +import { depthChanges } from './depthChanges' +import { slidingDepthChanges } from './slidingDepthChanges' const input = loader(1)('input').map((s) => parseInt(s, 10)) From 0d3d36cd74bfc767507fd6b57af8f0b1e87223c6 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 1 Dec 2021 09:55:48 +0100 Subject: [PATCH 067/110] ci: update mergify/snyk config --- .mergify.yml | 6 +----- .snyk | 4 ---- README.md | 1 - 3 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 .snyk diff --git a/.mergify.yml b/.mergify.yml index 3cd0df4..d6ed48f 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -1,16 +1,12 @@ pull_request_rules: - name: Automatic merge security PRs when all status checks pass conditions: - - author~=^(snyk-bot|dependabot\[bot\])$ - - status-success=security/snyk (coderbyheart) + - author~=^(dependabot\[bot\]|renovate\[bot\])$ - status-success=tests actions: merge: method: rebase rebase_fallback: squash - bot_account: coderbyheart label: add: - mergify - rebase: - bot_account: coderbyheart diff --git a/.snyk b/.snyk deleted file mode 100644 index 8cb541f..0000000 --- a/.snyk +++ /dev/null @@ -1,4 +0,0 @@ -# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. -version: v1.14.1 -ignore: {} -patch: {} diff --git a/README.md b/README.md index 0f6e3b4..b2eadd2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # Advent of Code 2021 solutions in TypeScript [![GitHub Actions](https://github.com/coderbyheart/adventofcode/workflows/Test/badge.svg)](https://github.com/coderbyheart/adventofcode/actions) -[![Known Vulnerabilities](https://snyk.io/test/github/coderbyheart/adventofcode/badge.svg)](https://snyk.io/test/github/coderbyheart/adventofcode) [![Renovate](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com) [![Mergify Status](https://img.shields.io/endpoint.svg?url=https://dashboard.mergify.io/badges/coderbyheart/adventofcode&style=flat)](https://mergify.io) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) From 7d95e12d6c8cab82e24fa02b1b6b566727e806aa Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Thu, 2 Dec 2021 08:20:30 +0100 Subject: [PATCH 068/110] feat(day02): part 1 --- day02/course.txt | 1000 ++++++++++++++++++++++++++++++++++++ day02/dive.ts | 28 + day02/parseCommand.spec.ts | 14 + day02/parseCommand.ts | 9 + day02/solution.spec.ts | 25 + 5 files changed, 1076 insertions(+) create mode 100644 day02/course.txt create mode 100644 day02/dive.ts create mode 100644 day02/parseCommand.spec.ts create mode 100644 day02/parseCommand.ts create mode 100644 day02/solution.spec.ts diff --git a/day02/course.txt b/day02/course.txt new file mode 100644 index 0000000..afbc5fe --- /dev/null +++ b/day02/course.txt @@ -0,0 +1,1000 @@ +forward 8 +down 9 +forward 2 +down 1 +forward 9 +forward 7 +forward 5 +up 3 +up 3 +down 5 +forward 2 +down 8 +down 3 +forward 6 +down 2 +down 4 +down 7 +down 7 +forward 2 +down 6 +down 8 +down 2 +down 8 +up 9 +down 8 +forward 8 +down 5 +up 4 +forward 4 +forward 4 +forward 3 +down 9 +forward 8 +up 3 +forward 2 +forward 3 +forward 6 +down 7 +down 2 +forward 4 +forward 7 +forward 6 +up 5 +up 1 +forward 4 +down 9 +up 6 +forward 6 +up 9 +forward 1 +down 9 +forward 4 +down 3 +forward 7 +forward 5 +down 1 +up 9 +down 9 +forward 6 +forward 1 +down 5 +down 6 +forward 6 +forward 3 +up 4 +up 9 +down 3 +forward 6 +up 4 +up 6 +forward 4 +down 1 +down 2 +up 9 +forward 8 +down 2 +down 3 +down 4 +up 3 +forward 3 +forward 4 +down 4 +forward 7 +forward 9 +down 7 +forward 6 +forward 2 +up 6 +forward 7 +forward 9 +down 5 +forward 6 +up 9 +forward 6 +forward 2 +forward 6 +up 3 +down 1 +forward 5 +down 3 +forward 7 +down 4 +forward 1 +forward 7 +down 1 +up 2 +down 7 +down 6 +forward 8 +forward 2 +forward 1 +forward 9 +down 3 +forward 3 +down 6 +up 8 +up 3 +forward 1 +forward 3 +forward 7 +down 9 +forward 7 +forward 3 +up 6 +forward 4 +down 9 +forward 2 +down 4 +up 2 +down 1 +up 1 +down 6 +forward 1 +up 6 +up 7 +forward 3 +forward 3 +forward 2 +forward 1 +down 7 +forward 9 +down 5 +down 9 +up 9 +forward 3 +forward 8 +down 3 +forward 9 +forward 4 +down 3 +up 4 +up 8 +up 4 +down 8 +down 6 +down 5 +forward 2 +up 6 +up 1 +up 9 +down 4 +up 8 +forward 6 +down 1 +forward 7 +up 2 +forward 6 +up 2 +down 6 +down 5 +forward 2 +down 2 +down 1 +forward 8 +forward 1 +up 9 +forward 3 +down 6 +forward 2 +forward 8 +down 3 +forward 3 +forward 4 +forward 7 +forward 2 +up 4 +forward 8 +forward 1 +forward 9 +down 3 +down 1 +forward 8 +down 5 +down 3 +forward 5 +down 7 +down 1 +forward 8 +forward 2 +forward 4 +forward 8 +forward 6 +down 1 +forward 5 +forward 9 +forward 9 +up 9 +forward 9 +forward 4 +down 5 +down 2 +down 3 +forward 8 +forward 9 +up 8 +up 1 +up 6 +forward 7 +up 9 +forward 2 +forward 6 +up 6 +forward 3 +up 4 +forward 1 +down 4 +up 6 +down 5 +forward 7 +forward 6 +down 3 +down 4 +forward 3 +down 6 +down 1 +forward 5 +forward 7 +up 8 +forward 4 +up 7 +down 4 +forward 3 +down 7 +forward 7 +forward 4 +forward 1 +forward 8 +up 5 +up 6 +forward 5 +forward 3 +down 6 +forward 8 +forward 2 +forward 7 +down 7 +down 8 +down 3 +up 3 +down 1 +down 1 +forward 6 +forward 9 +forward 4 +forward 9 +forward 6 +down 1 +forward 9 +down 6 +down 8 +up 5 +down 8 +forward 4 +forward 2 +up 6 +down 9 +forward 6 +down 9 +down 6 +down 6 +forward 2 +up 8 +down 7 +down 2 +forward 2 +forward 2 +down 1 +up 8 +down 5 +forward 9 +forward 5 +forward 8 +forward 8 +forward 1 +down 2 +down 7 +up 5 +forward 9 +forward 4 +forward 4 +forward 6 +down 7 +up 5 +forward 5 +up 9 +down 7 +down 4 +down 9 +forward 7 +up 4 +down 1 +down 6 +up 2 +up 6 +down 2 +forward 9 +down 3 +forward 3 +forward 4 +forward 1 +up 2 +forward 6 +down 3 +forward 2 +down 9 +forward 8 +forward 3 +forward 2 +up 5 +forward 3 +forward 1 +down 8 +up 2 +up 4 +up 5 +down 3 +down 6 +down 1 +forward 4 +up 3 +down 1 +down 4 +up 6 +forward 8 +down 5 +down 7 +down 7 +forward 9 +forward 9 +down 2 +up 2 +down 5 +forward 5 +forward 4 +down 7 +forward 4 +down 2 +forward 2 +forward 4 +up 8 +down 8 +up 4 +forward 2 +forward 2 +up 8 +forward 2 +down 3 +down 7 +down 9 +up 6 +up 3 +forward 2 +forward 3 +up 8 +forward 6 +up 8 +up 1 +down 6 +down 8 +up 9 +down 1 +up 8 +forward 9 +forward 4 +forward 9 +forward 8 +forward 1 +down 6 +down 7 +up 5 +down 1 +forward 9 +down 9 +forward 7 +down 5 +forward 7 +down 1 +down 4 +down 4 +forward 6 +forward 1 +up 4 +up 2 +forward 7 +down 6 +down 2 +down 3 +up 7 +up 1 +down 6 +down 6 +down 8 +down 8 +forward 5 +forward 1 +forward 5 +up 8 +forward 8 +up 8 +forward 1 +down 9 +forward 1 +up 7 +up 3 +down 1 +down 9 +up 2 +down 3 +down 2 +forward 9 +up 9 +up 1 +up 5 +forward 8 +down 3 +down 7 +forward 7 +down 8 +down 5 +down 5 +down 4 +down 7 +forward 6 +forward 6 +forward 4 +forward 6 +forward 3 +up 5 +forward 2 +down 7 +forward 1 +down 4 +down 7 +down 7 +forward 4 +down 2 +up 4 +forward 2 +up 2 +up 3 +down 5 +forward 3 +down 2 +forward 5 +down 2 +down 1 +up 4 +up 5 +up 9 +forward 1 +forward 9 +down 9 +up 8 +forward 9 +forward 7 +down 9 +down 2 +down 9 +forward 9 +forward 7 +up 7 +forward 6 +up 6 +forward 5 +forward 6 +down 4 +forward 8 +forward 5 +forward 2 +up 4 +down 4 +forward 1 +down 2 +up 9 +up 7 +up 2 +up 3 +down 9 +forward 4 +up 6 +forward 5 +forward 5 +forward 9 +forward 1 +down 6 +forward 8 +down 5 +up 3 +up 1 +down 2 +up 4 +down 1 +down 9 +forward 8 +down 2 +forward 7 +down 7 +up 5 +down 7 +down 3 +forward 2 +forward 2 +forward 4 +down 9 +down 6 +down 9 +forward 6 +down 6 +down 9 +forward 1 +down 1 +forward 8 +down 4 +up 6 +down 2 +forward 9 +down 3 +up 3 +down 2 +up 2 +up 5 +down 8 +forward 1 +forward 3 +down 8 +up 3 +up 3 +up 3 +forward 2 +up 3 +down 4 +down 1 +down 7 +forward 3 +down 3 +down 8 +down 9 +forward 9 +forward 3 +up 4 +forward 8 +forward 8 +up 7 +up 3 +forward 6 +down 9 +up 1 +forward 2 +down 6 +up 6 +forward 2 +down 6 +down 3 +up 7 +forward 6 +down 6 +down 1 +down 5 +forward 6 +up 2 +down 2 +down 3 +down 1 +up 9 +forward 6 +up 2 +forward 2 +down 6 +up 3 +up 4 +forward 8 +up 8 +up 4 +down 7 +down 4 +up 9 +forward 9 +up 6 +forward 5 +forward 7 +forward 2 +forward 8 +down 7 +down 5 +down 4 +up 3 +forward 7 +down 2 +forward 5 +forward 9 +forward 4 +forward 7 +forward 8 +up 6 +down 1 +forward 3 +forward 9 +forward 1 +down 8 +down 1 +down 3 +down 1 +down 1 +up 3 +down 5 +up 1 +down 8 +down 2 +down 8 +down 3 +forward 2 +forward 8 +forward 4 +down 8 +down 6 +forward 8 +down 7 +forward 8 +forward 2 +forward 6 +forward 6 +forward 4 +up 2 +forward 3 +up 8 +forward 7 +forward 4 +down 8 +down 3 +down 4 +up 8 +forward 5 +forward 3 +up 4 +up 2 +down 6 +forward 4 +up 8 +up 3 +up 8 +down 3 +up 1 +forward 2 +down 4 +down 4 +down 9 +down 5 +forward 9 +up 6 +up 5 +down 8 +down 6 +down 7 +forward 8 +forward 4 +up 4 +forward 1 +down 4 +up 4 +down 9 +up 6 +down 9 +up 3 +forward 4 +down 1 +down 5 +down 5 +up 1 +down 8 +down 9 +down 1 +forward 4 +down 8 +down 6 +down 1 +forward 2 +down 5 +up 1 +up 1 +down 1 +down 3 +down 3 +down 8 +down 6 +down 5 +down 3 +up 3 +forward 5 +down 7 +down 7 +forward 2 +forward 6 +forward 1 +down 8 +forward 2 +up 2 +forward 2 +down 2 +forward 7 +down 7 +down 9 +up 2 +up 2 +down 3 +forward 1 +down 1 +forward 5 +forward 4 +down 4 +forward 6 +forward 2 +forward 7 +forward 2 +forward 8 +down 4 +up 3 +down 3 +up 9 +down 7 +up 8 +down 1 +down 8 +up 9 +down 6 +up 5 +up 8 +down 2 +down 3 +forward 1 +down 5 +down 5 +forward 8 +down 9 +forward 7 +forward 8 +down 1 +down 2 +up 8 +down 2 +up 5 +down 3 +forward 5 +forward 6 +up 4 +up 3 +forward 5 +forward 1 +down 2 +forward 2 +down 9 +up 7 +down 2 +up 8 +forward 2 +forward 2 +up 4 +forward 5 +down 4 +up 6 +up 8 +forward 9 +up 1 +forward 9 +forward 7 +forward 3 +forward 1 +down 1 +forward 5 +forward 2 +forward 6 +forward 6 +forward 3 +forward 7 +up 7 +down 6 +down 2 +up 5 +down 5 +up 2 +forward 7 +forward 2 +down 9 +up 4 +down 5 +down 3 +forward 7 +down 2 +forward 9 +forward 6 +down 3 +down 3 +forward 6 +down 9 +forward 7 +up 5 +up 6 +down 3 +up 4 +forward 4 +up 3 +down 8 +down 9 +down 9 +down 4 +up 1 +up 2 +down 3 +forward 4 +forward 5 +down 1 +up 3 +down 8 +down 7 +forward 2 +up 4 +down 8 +forward 1 +forward 6 +up 8 +down 2 +down 6 +forward 5 +up 8 +forward 7 +down 9 +forward 9 +down 3 +forward 9 +forward 1 +forward 6 +up 7 +forward 1 +down 5 +down 8 +down 3 +forward 5 +forward 6 +down 7 +forward 4 +down 6 +forward 4 +up 4 +down 4 +forward 4 +down 9 +forward 3 +down 6 +forward 3 +down 3 +up 3 +forward 3 +down 4 +down 4 +down 4 +down 5 +forward 5 +down 9 +down 7 +down 1 +forward 5 +forward 3 +forward 8 +down 5 +forward 4 +forward 3 +down 8 +forward 1 +forward 1 +down 6 +forward 4 +down 5 +forward 8 +down 7 +forward 6 +down 7 +up 2 +forward 6 +down 7 +down 3 +down 6 +up 2 +forward 8 +forward 5 +down 6 +forward 5 +up 7 +forward 8 +down 1 +forward 2 +up 7 +down 4 +up 5 +forward 5 +forward 4 +forward 3 +down 1 +forward 8 +up 9 +down 2 +up 4 +forward 7 +up 6 +forward 3 +down 8 +forward 4 +down 2 +down 9 +forward 8 +down 5 +forward 3 +down 9 +up 1 +forward 6 +up 9 +down 7 +forward 5 +forward 3 +down 8 +down 6 +up 3 +down 5 +forward 7 +up 2 +forward 4 +up 1 +down 8 +down 7 +forward 3 +forward 1 +down 3 +down 8 +forward 7 +up 2 +down 7 +up 6 +down 7 +down 1 +down 3 +up 6 +forward 2 +down 5 +forward 1 +forward 7 +forward 2 +down 8 +down 8 +down 7 +forward 7 +forward 5 +forward 1 +forward 7 +forward 3 +down 2 +up 8 +up 4 +up 6 +down 2 +down 1 +down 5 +down 3 +forward 2 +up 1 +forward 8 +up 8 +forward 7 +up 1 +down 7 +forward 7 +forward 5 +forward 3 +up 4 +down 5 +down 5 +forward 3 +forward 9 +down 9 +up 6 +up 7 +down 7 +forward 7 \ No newline at end of file diff --git a/day02/dive.ts b/day02/dive.ts new file mode 100644 index 0000000..43a7447 --- /dev/null +++ b/day02/dive.ts @@ -0,0 +1,28 @@ +export type Command = { + heading: 'forward' | 'down' | 'up' + amount: number +} + +type Position = { + horizontal: number + depth: number +} + +export const dive = (course: Command[]): Position => + course.reduce( + ({ horizontal, depth }, { heading, amount }) => { + switch (heading) { + case 'down': + return { horizontal, depth: depth + amount } + case 'up': + return { horizontal, depth: depth - amount } + case 'forward': + return { horizontal: horizontal + amount, depth } + } + return { horizontal, depth } as Position + }, + { + horizontal: 0, + depth: 0, + } as Position, + ) diff --git a/day02/parseCommand.spec.ts b/day02/parseCommand.spec.ts new file mode 100644 index 0000000..383697f --- /dev/null +++ b/day02/parseCommand.spec.ts @@ -0,0 +1,14 @@ +import { parseCommand } from './parseCommand' + +describe('parseCommand()', () => { + it.each([ + ['forward 5', { heading: 'forward', amount: 5 }], + ['down 5', { heading: 'down', amount: 5 }], + ['forward 8', { heading: 'forward', amount: 8 }], + ['up 3', { heading: 'up', amount: 3 }], + ['down 8', { heading: 'down', amount: 8 }], + ['forward 2', { heading: 'forward', amount: 2 }], + ])('should parse the command %s into %j', (command, heading) => + expect(parseCommand(command)).toEqual(heading), + ) +}) diff --git a/day02/parseCommand.ts b/day02/parseCommand.ts new file mode 100644 index 0000000..7dc445e --- /dev/null +++ b/day02/parseCommand.ts @@ -0,0 +1,9 @@ +import { Command } from './dive' + +export const parseCommand = (command: string): Command => { + const [heading, amount] = command.split(' ') + return { + heading: heading as Command['heading'], + amount: parseInt(amount, 10), + } +} diff --git a/day02/solution.spec.ts b/day02/solution.spec.ts new file mode 100644 index 0000000..cdf2c22 --- /dev/null +++ b/day02/solution.spec.ts @@ -0,0 +1,25 @@ +import { loader } from '../lib/loader' +import { dive } from './dive' +import { parseCommand } from './parseCommand' + +describe('Day 2: Dive!', () => { + describe('Part 1', () => { + it('should solve the example', () => { + const course = [ + 'forward 5', + 'down 5', + 'forward 8', + 'up 3', + 'down 8', + 'forward 2', + ].map(parseCommand) + const pos = dive(course) + expect(pos.horizontal * pos.depth).toEqual(150) + }) + it('should solve the puzzle', () => { + const course = loader(2)('course').map(parseCommand) + const pos = dive(course) + expect(pos.horizontal * pos.depth).toEqual(1580000) + }) + }) +}) From 90640383e64289a225a98ba1fd4c6e9bc65510cd Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Thu, 2 Dec 2021 08:50:59 +0100 Subject: [PATCH 069/110] feat(day02): part 2 --- day02/dive.ts | 2 +- day02/diveAim.ts | 26 ++++++++++++++++++++++++++ day02/solution.spec.ts | 36 +++++++++++++++++++++++++++++++++++- 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 day02/diveAim.ts diff --git a/day02/dive.ts b/day02/dive.ts index 43a7447..139f92d 100644 --- a/day02/dive.ts +++ b/day02/dive.ts @@ -3,7 +3,7 @@ export type Command = { amount: number } -type Position = { +export type Position = { horizontal: number depth: number } diff --git a/day02/diveAim.ts b/day02/diveAim.ts new file mode 100644 index 0000000..47f24ce --- /dev/null +++ b/day02/diveAim.ts @@ -0,0 +1,26 @@ +import { Command, Position } from './dive' + +export type AimedPosition = Position & { aim: number } + +export const diveAim = ( + { heading, amount }: Command, + { horizontal, depth, aim }: AimedPosition = { + horizontal: 0, + depth: 0, + aim: 0, + }, +): AimedPosition => { + switch (heading) { + case 'down': + return { horizontal, depth, aim: aim + amount } + case 'up': + return { horizontal, depth, aim: aim - amount } + case 'forward': + return { + horizontal: horizontal + amount, + depth: depth + aim * amount, + aim, + } + } + return { horizontal, depth, aim } as AimedPosition +} diff --git a/day02/solution.spec.ts b/day02/solution.spec.ts index cdf2c22..b8eadde 100644 --- a/day02/solution.spec.ts +++ b/day02/solution.spec.ts @@ -1,7 +1,11 @@ import { loader } from '../lib/loader' import { dive } from './dive' +import { AimedPosition } from './diveAim' +import { diveAim } from './diveAim' import { parseCommand } from './parseCommand' +const course = loader(2)('course').map(parseCommand) + describe('Day 2: Dive!', () => { describe('Part 1', () => { it('should solve the example', () => { @@ -17,9 +21,39 @@ describe('Day 2: Dive!', () => { expect(pos.horizontal * pos.depth).toEqual(150) }) it('should solve the puzzle', () => { - const course = loader(2)('course').map(parseCommand) const pos = dive(course) expect(pos.horizontal * pos.depth).toEqual(1580000) }) }) + describe('Part 2', () => { + describe('it should solve the example', () => { + let pos: AimedPosition + it.each([ + // forward 5 adds 5 to your horizontal position, a total of 5. Because your aim is 0, your depth does not change. + ['forward 5', { horizontal: 5, depth: 0, aim: 0 }], + // down 5 adds 5 to your aim, resulting in a value of 5. + ['down 5', { horizontal: 5, depth: 0, aim: 5 }], + // forward 8 adds 8 to your horizontal position, a total of 13. Because your aim is 5, your depth increases by 8*5=40. + ['forward 8', { horizontal: 13, depth: 40, aim: 5 }], + // up 3 decreases your aim by 3, resulting in a value of 2. + ['up 3', { horizontal: 13, depth: 40, aim: 2 }], + // down 8 adds 8 to your aim, resulting in a value of 10. + ['down 8', { horizontal: 13, depth: 40, aim: 10 }], + // forward 2 adds 2 to your horizontal position, a total of 15. Because your aim is 10, your depth increases by 2*10=20 to a total of 60. + ['forward 2', { horizontal: 15, depth: 60, aim: 10 }], + ])('%s => %j', (command, expectedPosition) => { + pos = diveAim(parseCommand(command), pos) + expect(pos).toEqual(expectedPosition) + }) + it('should calculate the solution', () => + expect(pos.horizontal * pos.depth).toEqual(900)) + }) + it('it should solve the puzzle', () => { + const pos = course.reduce( + (position, command) => diveAim(command, position), + { horizontal: 0, depth: 0, aim: 0 } as AimedPosition, + ) + expect(pos.horizontal * pos.depth).toEqual(1251263225) + }) + }) }) From 1e2c71745e49800e8aec754da310b2b146a9ab00 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 3 Dec 2021 14:11:53 +0100 Subject: [PATCH 070/110] feat: day03 --- day03/common.ts | 37 ++ day03/report.txt | 1000 ++++++++++++++++++++++++++++++++++++++++ day03/solution.spec.ts | 59 +++ 3 files changed, 1096 insertions(+) create mode 100644 day03/common.ts create mode 100644 day03/report.txt create mode 100644 day03/solution.spec.ts diff --git a/day03/common.ts b/day03/common.ts new file mode 100644 index 0000000..5c57261 --- /dev/null +++ b/day03/common.ts @@ -0,0 +1,37 @@ +export const mostCommon = (report: string[]): string => { + const width = report[0].length + const result = [] + for (let col = 0; col < width; col++) { + const onbits = report.map((r) => r[col]).filter((b) => b === '1') + if (onbits.length >= report.length - onbits.length) { + result[col] = '1' + } else { + result[col] = '0' + } + } + return result.join('') +} + +export const leastCommon = (report: string[]): string => + mostCommon(report) + .split('') + .map((b) => (b === '1' ? '0' : '1')) // Invert + .join('') + +const findWithBitCriteria = + (getCheckBits: (report: string[]) => string) => + (report: string[], index = 0): string => { + if (report.length === 1) return report[0] + const width = report[0].length + if (index >= width) { + throw new Error('End reached.') + } + const checkBit = getCheckBits(report)[index] + return findWithBitCriteria(getCheckBits)( + report.filter((r) => r[index] === checkBit), + ++index, + ) + } + +export const mostCommonBitCriteria = findWithBitCriteria(mostCommon) +export const leastCommonBitCriteria = findWithBitCriteria(leastCommon) diff --git a/day03/report.txt b/day03/report.txt new file mode 100644 index 0000000..954f8c6 --- /dev/null +++ b/day03/report.txt @@ -0,0 +1,1000 @@ +010111111011 +010010101110 +011001001100 +001000001010 +111100101000 +111010101100 +000111101111 +010011010011 +100010111011 +101011000111 +100111101010 +101101101101 +110010110110 +100110011100 +001110011000 +011000101010 +001100111101 +100011101111 +100111011001 +011100101101 +111101000111 +111000101011 +001001000101 +010110011000 +110100100001 +010010010011 +100100100100 +011011001000 +111101011101 +101011110011 +110011101101 +001001000100 +100111101110 +101101101010 +111110101000 +111011011001 +111110101101 +110101010100 +011100110000 +000010111110 +111011111111 +010111111110 +101001110101 +001111010100 +001111110001 +000010000000 +010001101000 +100001001111 +101111000010 +000011110001 +110111101110 +000000100111 +010100000111 +011111100001 +100011110001 +101000001111 +101010111001 +001101100100 +001100111001 +001000011010 +001001111100 +011001011001 +101011001010 +100101101101 +000101011110 +101100110111 +011000010110 +110101000110 +011010100101 +110011100110 +111101000010 +111110101011 +110101100101 +101110101010 +100110001011 +000110101100 +010100001001 +010011001110 +101010010101 +101010000101 +100100001011 +010010100101 +011000111111 +001010000001 +000001100111 +010101101111 +101110000110 +100101001001 +010000101001 +001101011001 +011101111110 +011110011100 +110100110111 +000101011010 +100000010011 +011100111000 +001110101000 +001001001000 +110101011101 +000011001111 +101000011010 +100011110010 +100100010111 +110001010100 +111010100110 +101001010100 +110100111101 +111000010111 +010001111000 +000101010110 +010100000100 +001000110010 +100111001100 +111001000100 +011100001011 +100110001010 +000010100111 +001010111110 +101100110001 +010100100001 +011001110010 +010011100101 +011111010110 +111000010010 +011110110101 +110101101100 +101010110110 +000111000001 +001111111101 +110011101010 +011000110010 +101110101011 +110100001100 +001000011000 +110110110010 +101111000111 +000111111001 +111100110100 +010010011010 +010010111010 +000001101000 +000101010101 +110111110101 +111001110110 +110011001100 +011110011001 +000010110101 +011011000111 +010101010110 +001011010100 +100001111001 +011000111010 +011100010000 +110001011010 +110010110111 +001101010101 +000110011000 +000010011110 +101100111001 +100011001110 +100010000000 +001111010001 +011100010011 +010001000010 +110010010111 +011011111101 +010011010100 +100001101001 +101100110110 +000000101011 +111000110111 +111101010110 +111110000000 +101010000111 +011010110110 +100110100111 +001011001011 +110011111000 +010111100110 +001100101010 +110001001000 +000100000111 +000001011100 +000100000000 +100010100000 +110001011011 +110110111101 +100110010001 +001101001110 +011111011000 +110010000100 +100011010110 +011001100000 +010101001110 +111100000001 +110100010111 +000001000011 +101100010011 +000100011111 +111000001001 +101100011100 +010110010001 +000110000010 +110000101111 +011010011100 +111000011110 +100110110001 +100000011100 +101010001011 +010111001100 +100111110111 +111100001011 +010100100100 +100111100101 +111100000111 +101001001101 +111001111000 +001110010100 +111010011001 +010100111111 +110111010011 +100100000001 +001101111111 +111101001100 +000111101010 +000100101001 +111011011101 +010001110111 +111010100001 +001101010100 +101010011100 +000011100100 +100101101010 +011111100000 +011011001110 +000101000111 +010010111111 +001100111011 +000001101001 +001110110001 +010011011110 +001011011000 +100000111010 +001000100101 +010001100011 +011001000111 +010110101010 +101000001001 +110101011000 +001100000101 +100110011001 +000011001001 +100110111001 +111101101001 +011011001001 +010001100111 +001100011100 +011111101111 +100100111010 +101111110011 +110111001110 +000111100000 +011110000101 +111110100010 +001011001101 +110100101011 +011100001101 +111001111100 +111110100110 +000010010100 +010111110010 +001110001101 +011111010011 +110110111010 +101001110000 +011110110011 +000111011000 +010111000110 +001011100010 +001110000010 +010111000011 +010011111110 +011000010000 +101111011110 +101010000110 +011100011101 +011101101100 +100110101001 +000000011001 +100101010010 +110011010101 +010100100111 +011101011100 +011001111001 +000001001000 +001000101011 +010110111101 +100110010010 +010010010110 +000000111001 +011111110101 +011111001000 +100100011111 +000001111000 +111101010010 +101010100100 +011010111101 +000001011011 +101111100001 +100011000000 +110011001010 +000100010111 +100000010000 +101111010110 +010010010001 +101011100001 +101001011100 +001111000011 +111000100010 +001101110110 +001110111011 +100001110010 +000001110001 +111100001000 +100010011101 +000011000110 +111100100110 +000111110111 +000100111001 +011001110001 +111101010001 +110110101100 +010001011001 +001101111110 +000101111010 +110100100110 +111011001110 +110011010100 +010000100011 +011000111001 +110001110001 +101000000001 +101011000101 +011010000110 +000010111000 +010011100011 +111101101110 +001111010010 +100011011100 +111110111010 +000010110010 +101000011100 +010011101011 +110001011000 +000000010011 +001101010010 +110111111011 +111101011100 +111001010011 +110111100101 +111000111001 +001110010010 +001011101101 +110100100111 +101011100000 +011000100101 +110101010010 +000110000111 +111111001000 +000011100110 +101101110011 +001110011111 +110000101110 +110011100101 +101110100101 +001000111000 +101111000011 +100111111011 +011010101111 +101101001000 +000101101110 +111101000011 +000011000010 +000101010010 +101001011101 +110011010011 +111010010001 +110100010001 +010100001010 +110111101010 +100111000101 +101001100010 +011010011011 +101011101101 +011001100001 +001000110111 +000100101000 +010000000111 +111111110000 +001011110110 +100010010001 +100110101111 +110110010000 +100110011011 +001100110101 +100011101100 +000011011001 +010110100001 +011110101111 +101011011000 +101110111001 +111000010000 +011100000010 +100110100101 +010101011111 +100000111001 +011000111100 +101100100111 +101011111000 +111101111101 +101000100011 +101000010101 +111001010010 +101110000111 +101010000001 +000100100111 +100001011101 +110010101010 +000000100100 +011101000101 +110010001101 +111011101110 +111111111110 +011100000111 +101111110010 +000101100110 +000110001011 +100100011000 +010001101111 +011110010000 +100011011111 +010101101010 +000011100000 +000101001110 +001001110001 +111110011001 +101110000000 +010001010010 +110001000110 +101011001110 +010001101001 +000000011011 +101001010011 +011010000100 +001100001100 +100010001001 +100000111111 +001000000000 +100110110100 +100111110000 +101001110001 +000110101101 +000111001010 +101100011011 +110001101000 +000111101110 +110110010011 +100010001000 +001010001100 +001011111110 +001110000111 +110010100000 +100001110101 +000110111101 +110010011000 +111110111011 +101000000011 +011010011110 +110000001111 +011000110100 +111111001101 +000010110100 +101100001100 +110000101011 +010000001110 +101001101000 +011000000100 +101101011000 +100111111100 +110001001010 +001010101100 +111010001110 +101110100110 +011110010001 +111011111010 +000001100110 +010001100101 +100101001111 +111001001011 +111101101010 +011011000001 +010111010101 +110001111110 +110100101110 +111101011011 +011000101011 +010100111100 +011000000111 +101000101001 +111000110001 +101000110001 +001111010011 +100000010100 +001001101101 +010101110001 +100110000101 +011000101101 +001110110010 +100111000001 +011001000001 +000101101000 +101000101110 +000100001110 +111110101111 +011110110001 +101001110010 +000000111010 +101111010010 +011110011010 +101000011111 +000100001100 +110001111001 +110000110101 +111010011100 +001000111011 +111110001111 +011011011000 +000110110001 +101001010010 +111010100011 +000001111100 +110010000001 +110101111011 +100011001001 +010011100001 +101101011111 +100000001010 +001011001000 +000011100010 +011110111000 +000110111011 +010111001011 +011100011000 +101010011011 +001001011110 +000110001010 +111011010101 +010101110010 +011100101001 +100000110010 +111100111001 +001011011101 +110101101001 +001000111110 +101011000011 +001110111111 +100101010110 +111011011110 +010111111001 +011001010001 +110101111111 +110100100101 +111111110001 +010011000101 +011101101010 +101111000100 +011101000100 +001110110110 +010011011000 +000011011010 +110000000110 +001100001101 +111001111001 +100001100101 +100100010011 +111011111000 +001001111110 +101101000000 +000001100001 +001100001011 +110011011111 +010101111110 +001110011100 +111111000100 +010011000010 +101100010000 +000010110111 +110100000101 +110100010010 +111001100101 +010000010001 +101100100110 +001111101100 +011100110110 +000000111101 +001000000100 +010101101101 +100101101000 +001001010101 +000000001111 +110111110100 +000010110110 +001000000010 +011000101000 +100101001101 +010110101110 +100010110001 +010111010000 +001111011001 +000011110100 +100100111000 +011011100110 +100100010110 +000001111101 +010111011011 +110001000101 +111100010001 +101001000111 +110100010000 +001010000111 +101001110111 +010010010010 +100010111100 +001101000011 +011001110011 +000100101111 +010110011101 +001001011010 +111011101001 +111111000000 +111110000111 +110000001011 +010000110010 +011100011001 +011001100011 +001101000110 +011001011111 +100111100000 +110111010100 +101101000001 +110011101000 +001010110101 +100101010001 +101000101100 +010110001000 +111011111011 +000010010001 +010111011010 +011101101011 +001000101110 +101010100111 +001011000111 +011011010110 +110111101111 +100001110001 +100100101111 +110000010011 +011110111011 +000110000100 +110000111111 +100110101100 +001101110101 +011100000100 +001100011110 +010111010010 +001110101101 +100110001110 +100100010000 +001000001101 +011101110011 +011001100110 +110101000011 +100101001010 +111111101111 +010011000100 +100111000111 +101100101100 +010110000100 +111100000100 +000000101001 +000011110010 +011011110111 +011101110001 +111110000001 +011000011001 +100001101111 +110000011010 +110110101010 +110100110000 +111111000011 +100011100010 +100100010010 +110100011000 +000110000110 +001101001000 +101011110111 +000011110111 +001001100100 +100010110011 +100111111000 +000001111010 +110001111101 +100011111111 +111001001101 +011111101011 +101111110111 +100111000011 +010010001010 +010101101011 +011011110000 +110111000000 +010011101111 +010001010101 +111110101010 +001010101010 +001100101101 +111011000111 +101001000001 +000101000100 +010011110010 +001110100010 +110111001000 +111011001101 +111110001010 +110000100001 +000000010101 +000010011001 +011100100111 +001101111010 +000001100100 +011111101100 +110100011111 +010110000000 +001010101001 +000010010011 +111100000110 +110101000101 +010110001011 +111001001000 +010110101111 +001000000001 +111100001101 +001000110110 +110001101001 +001110001011 +111101101011 +011101111100 +100011001011 +001000001001 +000001001100 +100100110111 +111111101101 +001110100000 +001001001001 +001111001100 +101100101111 +101100110010 +101000100001 +101000010110 +100000010101 +011010011000 +101101101110 +011101001100 +101011111100 +101110101000 +110010100100 +011111011110 +110010011101 +110100100011 +111111100100 +011011011101 +011100100001 +101011110000 +001100100011 +000111111000 +110010001010 +100001001001 +110010001000 +111010001001 +010110111111 +101011001101 +101010011110 +011011110001 +101010100011 +100000110111 +100011101001 +101110010011 +101011011011 +110010010000 +011110100011 +010010110110 +100110010111 +110100000110 +101011101011 +001100010100 +101101010000 +110110001001 +010010001101 +111011010110 +111100001110 +000101111001 +100001000001 +101111101001 +100101101110 +000011001101 +000001000110 +111110001011 +000010101111 +011101101101 +000000000110 +111111101010 +101001110110 +111011000100 +001011101111 +110010111010 +110011110001 +111100011111 +110110010001 +100101110000 +010001001011 +101100010100 +110100001010 +001011101001 +110110000001 +001101001001 +100000111100 +001101101010 +010000110011 +011111101110 +110001110011 +011110011000 +000010001010 +001110000100 +000110101111 +100011111000 +100101100010 +111111110010 +101100011001 +011100100000 +100001100011 +001010011110 +111100011010 +010110100010 +101110010010 +001011110010 +100010111000 +001100110010 +001001101001 +011111101101 +101100111100 +011010011101 +101011100100 +111000001000 +010111011100 +001010000000 +011110000110 +110101101110 +000111000101 +101001011010 +110010100010 +100101110010 +000101100100 +010100110010 +011001000010 +110010011010 +010100001011 +011001111110 +011000101001 +011101011011 +010010000111 +000001110111 +100010101001 +111100011101 +100010001011 +111100101100 +011111010101 +111100101110 +111101001110 +111000010110 +000000110110 +011110000001 +000111011110 +111010111010 +101010001101 +111110101100 +000111110010 +110000111101 +111101110101 +101010101100 +101110110010 +110110011010 +111110110001 +011101111011 +101011111011 +100111101101 +000110011001 +100101101011 +110101101101 +010111110100 +001111110010 +101010101000 +011001100100 +101011111111 +001001000001 +010100100110 +111100011100 +011100011010 +000011011110 +001011101010 +010010001110 +101101101111 +000101000010 +010111100010 +010010010000 +111000000101 +010001100010 +101100001111 +011110111100 +100011000010 +010100001111 +011100101110 +011000111110 +111101010000 +110100111000 +001010001111 +111100011011 +101000111110 +100000011011 +010110000001 +001111100111 +001111101111 +011001011100 +111001000011 +110011101111 +001101100011 +101100111111 +011111101010 +010000011110 +001111111111 +010001001001 +111010101000 +110100001001 +111111010111 +000101110100 +101101100000 +001101100001 +001111111000 +100111101001 +000110010001 +100011101011 +000010000101 +101010001100 +000111110011 +001010110001 +111110001110 +010011100010 +100011010000 +100001010010 +100011000101 +110011000100 +010000010000 +110100110011 +100011000111 +010111101010 +101011000010 +110000101100 +111100001111 +000110100001 +010010110001 +111000100110 +000110111110 +100101000000 +011101001010 +101111011011 +111011101111 +000000010100 +110011101110 +111001110111 +011111000111 +111111011100 +110010011111 +111111110111 +001110110011 +000010010010 +100100100001 +111010000101 +001001110011 +101001101111 +101110101110 +101000101111 \ No newline at end of file diff --git a/day03/solution.spec.ts b/day03/solution.spec.ts new file mode 100644 index 0000000..e83c2e8 --- /dev/null +++ b/day03/solution.spec.ts @@ -0,0 +1,59 @@ +import { loader } from '../lib/loader' +import { + leastCommon, + leastCommonBitCriteria, + mostCommon, + mostCommonBitCriteria, +} from './common' + +const example = [ + '00100', + '11110', + '10110', + '10111', + '10101', + '01111', + '00111', + '11100', + '10000', + '11001', + '00010', + '01010', +] + +const report = loader(3)('report') + +describe('Day 3: Binary Diagnostic', () => { + describe('Part 1', () => { + it('should solve the example', () => { + const gamma = mostCommon(example) + const epsilon = leastCommon(example) + expect(gamma).toEqual('10110') + expect(epsilon).toEqual('01001') + expect(parseInt(gamma, 2) * parseInt(epsilon, 2)).toEqual(198) + }) + it('should solve the puzzle', () => { + const gamma = mostCommon(report) + const epsilon = leastCommon(report) + expect(parseInt(gamma, 2) * parseInt(epsilon, 2)).toEqual(3309596) + }) + }) + describe('Part 2', () => { + it('should solve the example', () => { + const oxygenGeneratorRating = mostCommonBitCriteria(example) + expect(oxygenGeneratorRating).toEqual('10111') + const co2ScrubberRating = leastCommonBitCriteria(example) + expect(co2ScrubberRating).toEqual('01010') + expect( + parseInt(oxygenGeneratorRating, 2) * parseInt(co2ScrubberRating, 2), + ).toEqual(230) + }) + it('should solve the puzzle', () => { + const oxygenGeneratorRating = mostCommonBitCriteria(report) + const co2ScrubberRating = leastCommonBitCriteria(report) + expect( + parseInt(oxygenGeneratorRating, 2) * parseInt(co2ScrubberRating, 2), + ).toEqual(2981085) + }) + }) +}) From 6a53d030a5b064d87153ece11e66e6fdca2fd2e1 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 4 Dec 2021 12:26:58 +0100 Subject: [PATCH 071/110] feat(day04): part 1 --- day04/board.spec.ts | 39 +++ day04/board.ts | 56 ++++ day04/input.txt | 601 +++++++++++++++++++++++++++++++++++++++++ day04/solution.spec.ts | 76 ++++++ 4 files changed, 772 insertions(+) create mode 100644 day04/board.spec.ts create mode 100644 day04/board.ts create mode 100644 day04/input.txt create mode 100644 day04/solution.spec.ts diff --git a/day04/board.spec.ts b/day04/board.spec.ts new file mode 100644 index 0000000..760f4a1 --- /dev/null +++ b/day04/board.spec.ts @@ -0,0 +1,39 @@ +import { isWinning } from './board' + +describe('Board', () => { + it.each([ + [[[0]], [1], false], + [[[0]], [1, 0], true], + [ + [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + ], + [1, 0, 3], + false, + ], + // Winning row + [ + [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + ], + [0, 1, 2], + true, + ], + // Winning col + [ + [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + ], + [8, 6, 5, 3, 2], + true, + ], + ])('board %j should win with numbers %j: %b', (board, numbers, winning) => + expect(isWinning(board, numbers)).toEqual(winning), + ) +}) diff --git a/day04/board.ts b/day04/board.ts new file mode 100644 index 0000000..c1cd0a7 --- /dev/null +++ b/day04/board.ts @@ -0,0 +1,56 @@ +export type Board = number[][] + +export const isWinning = (board: Board, numbers: number[]): boolean => { + // Check winning rows + for (const row of board) { + const rowIsWinning = row.reduce((rowIsWinning, number) => { + if (!rowIsWinning) return false + return numbers.includes(number) + }, true) + if (rowIsWinning) return true + } + // Check winning cols + for (let colIndex = 0; colIndex < board[0].length; colIndex++) { + const col = board.map((row) => row[colIndex]) + const colIsWinning = col.reduce((colIsWinning, number) => { + if (!colIsWinning) return false + return numbers.includes(number) + }, true) + if (colIsWinning) return true + } + return false +} + +export const findUnmarkedNumbers = ( + board: Board, + calledNumbers: number[], +): number[] => { + const unmarkedNumbers: number[] = [] + for (const row of board) { + for (const num of row) { + if (!calledNumbers.includes(num)) unmarkedNumbers.push(num) + } + } + return unmarkedNumbers +} + +export const sum = (sum: number, add: number): number => sum + add + +export const findWinningBoard = ( + boards: Board[], + numbers: number[], +): { winningBoard?: Board; drawnNumbers: number[] } => + numbers.reduce( + ({ winningBoard, drawnNumbers }, number) => { + if (winningBoard !== undefined) return { winningBoard, drawnNumbers } + drawnNumbers.push(number) + return { + winningBoard: boards.find((b) => isWinning(b, drawnNumbers)), + drawnNumbers, + } + }, + { drawnNumbers: [] } as { + winningBoard?: Board + drawnNumbers: number[] + }, + ) diff --git a/day04/input.txt b/day04/input.txt new file mode 100644 index 0000000..59d8e58 --- /dev/null +++ b/day04/input.txt @@ -0,0 +1,601 @@ +4,75,74,31,76,79,27,19,69,46,98,59,83,23,90,52,87,6,11,92,80,51,43,5,94,17,15,67,25,30,48,47,62,71,85,58,60,1,72,99,3,35,42,10,96,49,37,36,8,44,70,40,45,39,0,63,2,78,68,53,50,77,20,55,38,86,54,93,26,88,12,91,95,34,9,14,33,66,41,13,28,57,29,73,56,22,89,21,64,61,32,65,97,84,18,82,81,7,16,24 + +30 46 94 20 2 +53 67 69 75 65 +27 24 85 28 60 +57 58 42 36 78 +35 98 87 91 93 + +72 71 91 73 19 + 2 13 14 8 74 +42 34 31 56 9 +82 59 44 67 79 +49 6 98 10 30 + +95 24 25 11 34 +57 65 41 92 8 +91 26 1 62 38 +47 93 4 37 0 +15 44 33 20 97 + +24 69 55 7 25 +45 64 56 71 18 +94 10 62 19 36 +53 74 49 61 80 +50 68 60 76 84 + +86 78 29 1 71 + 2 9 24 34 96 +47 75 61 13 26 +10 66 28 83 14 +91 63 45 76 50 + +61 60 22 11 95 +25 81 13 15 53 +59 89 65 18 39 +58 50 1 47 52 +48 16 29 75 56 + +62 0 93 41 53 +69 47 29 50 46 +81 8 20 38 23 + 4 64 5 37 27 +32 75 48 33 15 + +97 75 15 55 36 +98 77 76 3 69 +11 39 88 18 93 +94 99 59 50 63 +33 26 35 58 14 + +58 91 7 36 81 +44 90 46 57 93 +16 35 28 61 34 +60 3 96 65 14 +24 49 94 11 77 + + 5 91 53 85 36 + 6 64 41 7 50 +87 94 96 15 49 +18 78 37 52 75 +28 34 16 71 48 + +75 14 2 52 49 +79 37 13 53 12 +91 73 94 72 36 +48 54 3 93 5 +40 85 42 9 50 + +26 53 24 58 95 +15 54 65 80 30 +90 72 27 40 47 +81 22 57 1 17 +82 46 20 94 49 + +60 25 86 18 92 + 2 85 89 5 55 +12 71 74 46 68 +33 52 82 84 29 +76 43 40 11 31 + +21 23 93 46 60 +99 20 75 55 4 +73 9 74 92 16 +25 35 0 70 90 +27 86 42 94 15 + +69 73 42 46 53 + 5 71 50 6 74 +14 44 99 62 87 +54 84 86 94 21 +29 51 38 67 8 + +43 28 24 46 22 +61 15 4 52 17 +62 77 18 56 85 +93 60 33 71 41 +63 2 6 68 92 + +60 92 52 36 38 +66 34 26 19 25 +24 65 90 39 74 +17 97 96 7 48 +50 55 57 73 64 + +19 77 60 66 16 +41 54 5 49 6 +69 61 94 86 98 +67 37 87 71 72 +44 96 90 40 74 + +90 49 68 74 32 +31 85 42 65 53 +76 43 41 36 20 +16 75 46 47 86 +54 44 95 13 23 + +56 0 88 99 76 +10 42 96 30 14 +67 73 16 21 35 +80 41 64 40 78 +13 19 4 24 20 + +79 98 28 58 41 +24 97 85 22 89 +12 81 68 50 47 + 2 34 16 6 95 +64 51 11 43 26 + + 6 39 79 95 3 +82 9 61 80 33 +94 87 13 70 11 + 0 8 37 35 19 +62 75 84 55 93 + +44 51 54 27 94 +77 32 81 71 62 +98 91 68 41 89 + 6 39 40 56 53 +73 88 5 49 80 + +97 29 15 61 83 +46 69 51 71 17 +40 94 49 14 66 +52 20 57 62 80 +19 72 75 84 36 + +27 26 95 78 92 +98 18 31 51 45 +39 43 94 33 13 +50 16 71 30 22 +70 81 36 38 64 + +90 7 71 11 63 +25 39 61 17 46 +51 86 56 81 84 +14 33 37 23 60 +52 64 8 65 29 + +41 92 40 71 33 +90 2 24 37 25 + 0 94 74 53 69 +81 61 1 70 88 +44 34 99 29 75 + +63 39 44 3 82 +68 95 67 28 49 +22 53 76 81 47 +15 75 0 54 6 +86 37 65 52 77 + +11 64 39 47 72 +97 59 83 19 58 +12 65 92 89 28 + 9 78 40 79 99 +17 50 71 18 68 + +31 78 27 32 18 +97 20 60 68 88 +12 5 99 49 82 +35 6 87 2 61 +70 53 63 36 93 + +89 4 50 54 80 +85 36 17 5 71 +44 95 57 73 60 +46 92 25 8 59 +98 82 21 93 99 + +27 12 82 95 47 + 8 21 69 83 64 +11 7 88 26 30 +70 96 18 75 53 +28 22 56 52 29 + +56 1 30 13 53 +37 86 98 19 9 + 3 67 16 71 85 +83 79 48 54 14 +47 62 44 95 65 + +51 18 87 35 55 +52 85 79 56 82 +83 26 24 29 43 +80 76 4 45 13 +11 12 99 94 47 + +14 1 52 95 63 +54 27 67 92 98 +34 61 26 32 33 +76 77 49 83 2 +97 59 12 71 80 + +78 16 59 44 5 +73 21 53 37 50 +25 86 88 61 74 +80 30 69 56 57 +98 39 26 58 51 + +71 48 28 14 81 +69 67 6 77 47 +94 83 8 40 20 +30 58 9 99 76 +51 24 91 21 52 + +84 76 33 14 72 +37 36 25 12 34 +39 54 89 81 30 + 2 15 46 10 22 +41 75 27 66 69 + + 8 20 53 16 86 +38 99 4 11 60 +55 14 47 1 48 +51 50 69 52 37 + 3 56 32 79 68 + +69 40 17 70 98 +12 86 41 35 50 +60 44 8 20 81 +14 82 25 55 4 +87 67 85 3 5 + +72 90 14 78 94 + 2 85 91 97 42 +84 9 27 70 95 +55 56 74 73 1 +11 59 13 67 18 + + 5 84 21 73 13 +11 46 35 79 99 +57 25 48 52 2 +51 70 56 54 94 +37 62 47 43 41 + +99 30 74 11 51 +48 90 1 27 76 +71 63 28 86 10 +52 5 83 16 69 +70 93 92 73 43 + +52 70 58 95 82 +74 18 90 99 39 +12 51 71 48 47 +92 11 91 16 61 +41 62 97 68 0 + +20 32 76 50 55 + 4 70 14 36 82 +74 10 97 26 87 +61 83 56 98 71 +64 38 8 65 92 + +63 68 84 36 41 +71 44 12 77 50 +18 92 54 58 23 +89 98 72 69 25 +62 38 42 5 52 + +59 65 60 84 49 +51 69 12 15 38 +70 1 79 22 35 +66 88 85 83 32 + 3 33 78 48 16 + +79 91 35 90 77 +22 59 58 96 97 +99 84 34 2 74 +10 92 5 4 45 +53 21 42 71 56 + +43 23 45 81 34 + 1 52 7 24 51 +42 22 17 20 77 +31 21 29 19 79 +58 87 30 60 49 + +81 64 86 76 70 +44 14 43 90 2 +96 16 42 22 7 + 5 57 19 84 21 +95 74 80 28 72 + + 3 57 12 95 35 +61 72 98 39 17 +62 87 30 66 4 +26 58 16 20 47 +37 46 13 42 85 + +55 24 36 49 85 +19 39 88 73 61 + 1 60 45 72 29 +47 12 53 76 44 +28 98 70 54 0 + +77 29 17 36 96 +35 64 93 37 83 +12 10 57 82 7 +90 69 0 86 32 +74 66 72 63 97 + +53 18 82 30 4 + 6 47 28 80 71 +39 36 22 20 51 + 7 57 26 34 79 +72 10 56 89 1 + +92 20 76 27 51 +72 82 39 95 38 +19 33 70 62 26 +79 99 40 30 8 +94 80 10 91 4 + +56 21 15 54 60 +69 64 55 0 59 +39 95 98 34 99 +24 76 3 6 30 +65 45 96 82 26 + +59 55 44 79 12 +87 73 37 76 91 +68 92 51 49 36 +99 54 3 71 64 +25 60 94 45 81 + +23 67 96 86 98 +14 47 45 66 62 +73 76 74 54 50 +64 60 35 10 58 +99 81 34 9 13 + +71 44 19 13 2 +18 80 24 11 85 +36 1 99 26 52 +48 76 84 88 63 +61 30 49 86 35 + +20 85 55 47 99 +18 49 38 65 61 +37 48 32 6 15 +80 94 66 89 91 + 1 44 36 92 21 + +72 65 4 76 16 +80 97 15 56 33 +14 40 50 11 57 +34 37 68 88 44 + 6 38 21 49 7 + +39 80 87 32 21 +41 97 66 15 83 +68 69 28 88 62 +18 2 48 58 77 +63 64 17 13 95 + +44 3 41 55 85 +83 75 13 0 81 +95 9 23 8 26 +71 94 37 70 45 +77 82 62 87 19 + +65 16 30 91 52 +78 67 24 58 11 +75 47 90 0 8 +83 88 73 60 2 +46 59 77 32 19 + +82 80 0 24 85 +92 99 50 94 38 +19 98 10 51 32 +36 73 67 43 57 +46 21 13 69 37 + +89 94 78 1 9 +16 34 18 15 38 +69 82 35 92 27 +66 64 68 63 26 +62 21 65 36 71 + +15 4 25 50 41 +69 98 12 74 21 + 2 13 66 55 83 +93 90 23 27 33 +82 52 68 61 60 + +57 21 28 29 5 +67 35 19 62 68 +91 83 3 33 99 +20 30 79 50 85 +60 89 4 7 36 + +43 4 81 19 77 +89 92 46 52 35 + 1 21 2 75 88 + 8 97 26 62 71 + 9 93 30 50 66 + +42 46 38 85 82 +18 80 91 1 40 +72 81 89 51 31 +37 20 24 67 92 +32 43 95 70 84 + +90 48 63 15 45 +67 52 2 26 31 +30 13 36 77 49 +60 8 86 70 99 +94 27 85 78 34 + +76 65 22 60 55 +81 88 54 4 26 +72 39 86 12 8 +68 46 98 28 99 +45 69 21 7 35 + +47 22 34 19 95 +30 15 39 51 10 +11 37 48 44 71 + 2 89 92 78 35 +21 73 33 20 69 + + 6 70 84 25 3 +21 12 55 78 49 +80 60 98 58 83 +17 96 69 9 66 +76 59 39 86 51 + +97 60 93 22 99 + 2 4 25 45 78 +43 53 63 41 6 +64 74 16 56 28 +77 12 20 35 49 + +82 10 91 16 77 +17 85 48 24 1 +61 96 38 68 99 +41 42 25 66 56 +97 18 63 93 29 + +95 37 83 61 17 +11 15 43 6 24 + 0 28 51 87 9 +76 52 2 64 32 +85 41 99 29 7 + +11 86 3 39 80 +35 78 26 34 65 +46 79 44 64 66 +29 74 63 20 0 +92 28 41 69 50 + +99 58 15 51 28 + 1 36 45 38 34 +46 94 35 44 88 +39 20 8 59 61 + 3 4 37 14 63 + +31 91 85 61 29 +66 54 9 49 2 +81 62 70 98 38 +68 1 16 95 78 +59 52 53 21 36 + +69 59 50 48 56 +17 61 16 92 47 +63 60 62 5 3 +37 97 38 83 58 +73 18 71 19 94 + +55 9 34 57 85 +31 37 30 16 64 +44 91 94 6 7 +90 87 77 59 50 +12 79 43 17 89 + +90 53 57 28 58 +56 49 29 8 12 +77 27 62 30 82 +71 98 63 37 83 + 9 15 84 36 74 + +80 56 52 44 71 +40 5 26 28 46 +11 70 57 95 93 +85 29 21 84 35 +20 15 81 54 91 + +60 86 80 79 11 +90 82 84 48 43 +92 81 39 57 47 +64 36 4 71 9 +78 62 53 51 66 + +84 51 19 73 55 +42 18 75 96 9 +47 46 12 98 93 +62 57 24 6 74 +50 53 30 70 80 + +57 60 1 49 20 +93 0 39 6 74 +86 9 56 41 25 +53 99 83 38 80 +37 79 18 23 45 + +33 95 37 86 45 +62 65 16 3 77 + 4 14 82 61 13 +18 71 11 8 23 +50 67 35 75 76 + +43 30 48 38 86 +62 46 72 21 97 + 0 18 91 17 42 + 6 99 56 22 64 +15 25 79 13 55 + +54 34 98 43 86 +39 47 56 52 95 +62 92 6 70 29 +65 78 57 99 35 +72 55 20 88 77 + +87 97 67 99 20 +58 50 30 78 31 + 4 6 96 85 70 +80 59 77 88 93 + 9 0 90 86 3 + +18 17 81 50 8 +12 62 73 32 72 +41 90 42 11 79 + 1 7 94 13 0 +77 33 23 83 74 + +71 84 22 14 54 +98 34 56 81 33 +58 39 6 46 96 +15 7 11 13 37 +70 5 2 9 68 + +28 58 11 63 26 + 6 14 44 70 93 +32 52 60 96 3 +76 0 75 66 71 +50 54 34 30 98 + +91 26 2 53 92 +45 67 68 32 50 +80 30 15 78 73 +10 14 28 27 0 +21 38 88 22 5 + +42 11 23 88 41 +54 58 8 74 40 + 6 13 80 89 82 +81 3 5 53 76 +47 39 9 25 46 + +82 14 52 43 95 +15 37 12 58 80 +64 97 45 61 49 +71 65 29 25 9 +21 11 51 1 87 + +20 80 50 27 90 +21 35 9 40 81 +89 16 26 74 84 +29 97 88 19 32 +85 63 10 46 52 + +16 66 0 53 40 +94 42 80 86 25 +11 15 68 35 5 +60 89 41 92 79 +51 77 88 36 67 + +51 65 33 97 81 +78 96 86 64 22 +10 28 93 2 14 +71 29 92 6 62 +98 38 35 0 70 \ No newline at end of file diff --git a/day04/solution.spec.ts b/day04/solution.spec.ts new file mode 100644 index 0000000..c94664e --- /dev/null +++ b/day04/solution.spec.ts @@ -0,0 +1,76 @@ +import { loader } from '../lib/loader' +import { Board, findUnmarkedNumbers, sum, findWinningBoard } from './board' + +const input = loader(4)('input') + +describe('Day 4: Giant Squid', () => { + describe('Part 1', () => { + it('should solve the example', () => { + const boards: Board[] = [ + [ + [22, 13, 17, 11, 0], + [8, 2, 23, 4, 24], + [21, 9, 14, 16, 7], + [6, 10, 3, 18, 5], + [1, 12, 20, 15, 19], + ], + [ + [3, 15, 0, 2, 22], + [9, 18, 13, 17, 5], + [19, 8, 7, 25, 23], + [20, 11, 10, 24, 4], + [14, 21, 16, 12, 6], + ], + [ + [14, 21, 17, 24, 4], + [10, 16, 15, 9, 19], + [18, 8, 23, 26, 20], + [22, 11, 13, 6, 5], + [2, 0, 12, 3, 7], + ], + ] + + const numbers = [ + 7, 4, 9, 5, 11, 17, 23, 2, 0, 14, 21, 24, 10, 16, 13, 6, 15, 25, 12, 22, + 18, 20, 8, 19, 3, 26, 1, + ] + + const { winningBoard, drawnNumbers } = findWinningBoard(boards, numbers) + + expect(winningBoard).toEqual(boards[2]) + const winningNumber = drawnNumbers[drawnNumbers.length - 1] + expect(winningNumber).toEqual(24) + expect( + findUnmarkedNumbers(winningBoard as Board, drawnNumbers).reduce(sum), + ).toEqual(188) + expect(24 * 188).toEqual(4512) + }) + it('should solve the puzzle', () => { + // Parse input + const numbers = input[0].split(',').map((s) => parseInt(s, 10)) + const boards: Board[] = [[]] + + let boardId = 0 + for (let i = 2; i < input.length; i++) { + const row = input[i] + .replace(/ +/g, ',') + .split(',') + .map((s) => parseInt(s, 10)) + if (isNaN(row[0])) { + boards[++boardId] = [] + } else { + boards[boardId].push(row) + } + } + + // Solve + const { winningBoard, drawnNumbers } = findWinningBoard(boards, numbers) + const winningNumber = drawnNumbers[drawnNumbers.length - 1] + const unmarked = findUnmarkedNumbers( + winningBoard as Board, + drawnNumbers, + ).reduce(sum) + expect(winningNumber * unmarked).toEqual(38913) + }) + }) +}) From 95aaf79fd47687fe5e1bf2a7c3e30953529b5bea Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 4 Dec 2021 16:03:00 +0100 Subject: [PATCH 072/110] feat(day04): part 2 --- day04/board.ts | 19 ------- day04/findWinningBoard.ts | 20 +++++++ day04/solution.spec.ts | 117 ++++++++++++++++++++++---------------- day04/winsPerBoard.ts | 26 +++++++++ 4 files changed, 113 insertions(+), 69 deletions(-) create mode 100644 day04/findWinningBoard.ts create mode 100644 day04/winsPerBoard.ts diff --git a/day04/board.ts b/day04/board.ts index c1cd0a7..d9edef9 100644 --- a/day04/board.ts +++ b/day04/board.ts @@ -35,22 +35,3 @@ export const findUnmarkedNumbers = ( } export const sum = (sum: number, add: number): number => sum + add - -export const findWinningBoard = ( - boards: Board[], - numbers: number[], -): { winningBoard?: Board; drawnNumbers: number[] } => - numbers.reduce( - ({ winningBoard, drawnNumbers }, number) => { - if (winningBoard !== undefined) return { winningBoard, drawnNumbers } - drawnNumbers.push(number) - return { - winningBoard: boards.find((b) => isWinning(b, drawnNumbers)), - drawnNumbers, - } - }, - { drawnNumbers: [] } as { - winningBoard?: Board - drawnNumbers: number[] - }, - ) diff --git a/day04/findWinningBoard.ts b/day04/findWinningBoard.ts new file mode 100644 index 0000000..3cdd44b --- /dev/null +++ b/day04/findWinningBoard.ts @@ -0,0 +1,20 @@ +import { Board, isWinning } from './board' + +export const findWinningBoard = ( + boards: Board[], + numbers: number[], +): { winningBoard?: Board; drawnNumbers: number[] } => + numbers.reduce( + ({ winningBoard, drawnNumbers }, number) => { + if (winningBoard !== undefined) return { winningBoard, drawnNumbers } + drawnNumbers.push(number) + return { + winningBoard: boards.find((b) => isWinning(b, drawnNumbers)), + drawnNumbers, + } + }, + { drawnNumbers: [] } as { + winningBoard?: Board + drawnNumbers: number[] + }, + ) diff --git a/day04/solution.spec.ts b/day04/solution.spec.ts index c94664e..269e119 100644 --- a/day04/solution.spec.ts +++ b/day04/solution.spec.ts @@ -1,43 +1,63 @@ import { loader } from '../lib/loader' -import { Board, findUnmarkedNumbers, sum, findWinningBoard } from './board' +import { Board, findUnmarkedNumbers, sum } from './board' +import { findWinningBoard } from './findWinningBoard' +import { lastWinner } from './winsPerBoard' +// Example input +const exampleBoards: Board[] = [ + [ + [22, 13, 17, 11, 0], + [8, 2, 23, 4, 24], + [21, 9, 14, 16, 7], + [6, 10, 3, 18, 5], + [1, 12, 20, 15, 19], + ], + [ + [3, 15, 0, 2, 22], + [9, 18, 13, 17, 5], + [19, 8, 7, 25, 23], + [20, 11, 10, 24, 4], + [14, 21, 16, 12, 6], + ], + [ + [14, 21, 17, 24, 4], + [10, 16, 15, 9, 19], + [18, 8, 23, 26, 20], + [22, 11, 13, 6, 5], + [2, 0, 12, 3, 7], + ], +] +const exampleNumbers = [ + 7, 4, 9, 5, 11, 17, 23, 2, 0, 14, 21, 24, 10, 16, 13, 6, 15, 25, 12, 22, 18, + 20, 8, 19, 3, 26, 1, +] + +// Puzzle input const input = loader(4)('input') +const numbers = input[0].split(',').map((s) => parseInt(s, 10)) +const boards: Board[] = [[]] +let boardId = 0 +for (let i = 2; i < input.length; i++) { + const row = input[i] + .replace(/ +/g, ',') + .split(',') + .map((s) => parseInt(s, 10)) + if (isNaN(row[0])) { + boards[++boardId] = [] + } else { + boards[boardId].push(row) + } +} describe('Day 4: Giant Squid', () => { describe('Part 1', () => { it('should solve the example', () => { - const boards: Board[] = [ - [ - [22, 13, 17, 11, 0], - [8, 2, 23, 4, 24], - [21, 9, 14, 16, 7], - [6, 10, 3, 18, 5], - [1, 12, 20, 15, 19], - ], - [ - [3, 15, 0, 2, 22], - [9, 18, 13, 17, 5], - [19, 8, 7, 25, 23], - [20, 11, 10, 24, 4], - [14, 21, 16, 12, 6], - ], - [ - [14, 21, 17, 24, 4], - [10, 16, 15, 9, 19], - [18, 8, 23, 26, 20], - [22, 11, 13, 6, 5], - [2, 0, 12, 3, 7], - ], - ] - - const numbers = [ - 7, 4, 9, 5, 11, 17, 23, 2, 0, 14, 21, 24, 10, 16, 13, 6, 15, 25, 12, 22, - 18, 20, 8, 19, 3, 26, 1, - ] - - const { winningBoard, drawnNumbers } = findWinningBoard(boards, numbers) + const { winningBoard, drawnNumbers } = findWinningBoard( + exampleBoards, + exampleNumbers, + ) - expect(winningBoard).toEqual(boards[2]) + expect(winningBoard).toEqual(exampleBoards[2]) const winningNumber = drawnNumbers[drawnNumbers.length - 1] expect(winningNumber).toEqual(24) expect( @@ -46,24 +66,6 @@ describe('Day 4: Giant Squid', () => { expect(24 * 188).toEqual(4512) }) it('should solve the puzzle', () => { - // Parse input - const numbers = input[0].split(',').map((s) => parseInt(s, 10)) - const boards: Board[] = [[]] - - let boardId = 0 - for (let i = 2; i < input.length; i++) { - const row = input[i] - .replace(/ +/g, ',') - .split(',') - .map((s) => parseInt(s, 10)) - if (isNaN(row[0])) { - boards[++boardId] = [] - } else { - boards[boardId].push(row) - } - } - - // Solve const { winningBoard, drawnNumbers } = findWinningBoard(boards, numbers) const winningNumber = drawnNumbers[drawnNumbers.length - 1] const unmarked = findUnmarkedNumbers( @@ -73,4 +75,19 @@ describe('Day 4: Giant Squid', () => { expect(winningNumber * unmarked).toEqual(38913) }) }) + + describe('Part 2', () => { + it('should solve the example', () => { + const { drawnNumbers, board } = lastWinner(exampleBoards, exampleNumbers) + const winningNumber = drawnNumbers[drawnNumbers.length - 1] + const unmarked = findUnmarkedNumbers(board, drawnNumbers).reduce(sum) + expect(winningNumber * unmarked).toEqual(1924) + }) + it('should solve the puzzle', () => { + const { drawnNumbers, board } = lastWinner(boards, numbers) + const winningNumber = drawnNumbers[drawnNumbers.length - 1] + const unmarked = findUnmarkedNumbers(board, drawnNumbers).reduce(sum) + expect(winningNumber * unmarked).toEqual(16836) + }) + }) }) diff --git a/day04/winsPerBoard.ts b/day04/winsPerBoard.ts new file mode 100644 index 0000000..51c783a --- /dev/null +++ b/day04/winsPerBoard.ts @@ -0,0 +1,26 @@ +import { Board, isWinning } from './board' + +export const lastWinner = ( + boards: Board[], + numbers: number[], +): { board: Board; drawnNumbers: number[] } => { + const winsPerBoard = boards.map((board) => ({ + board, + drawnNumbers: winningNumbers(board, numbers), + })) + + return winsPerBoard.sort( + ({ drawnNumbers: a }, { drawnNumbers: b }) => b.length - a.length, + )[0] +} + +export const winningNumbers = (board: Board, numbers: number[]): number[] => { + const drawnNumbers: number[] = [] + do { + drawnNumbers.push(numbers[drawnNumbers.length]) + } while ( + !isWinning(board, drawnNumbers) && + drawnNumbers.length < numbers.length + ) + return drawnNumbers +} From b4ab75feb2d034674a5f69c6c5e6fda7048c6a4d Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sun, 5 Dec 2021 12:36:34 +0100 Subject: [PATCH 073/110] feat(day05): part 1 --- day05/drawDiagram.ts | 18 ++ day05/drawLines.ts | 5 + day05/input.txt | 500 +++++++++++++++++++++++++++++++++++++++++ day05/line.ts | 15 ++ day05/lineTo.spec.ts | 26 +++ day05/lineTo.ts | 32 +++ day05/linesOverlap.ts | 25 +++ day05/render.ts | 4 + day05/solution.spec.ts | 43 ++++ 9 files changed, 668 insertions(+) create mode 100644 day05/drawDiagram.ts create mode 100644 day05/drawLines.ts create mode 100644 day05/input.txt create mode 100644 day05/line.ts create mode 100644 day05/lineTo.spec.ts create mode 100644 day05/lineTo.ts create mode 100644 day05/linesOverlap.ts create mode 100644 day05/render.ts create mode 100644 day05/solution.spec.ts diff --git a/day05/drawDiagram.ts b/day05/drawDiagram.ts new file mode 100644 index 0000000..bd4e7ca --- /dev/null +++ b/day05/drawDiagram.ts @@ -0,0 +1,18 @@ +import { Point } from './lineTo' + +export const drawDiagram = (points: Point[]): number[][] => { + const width = points.reduce((maxX, [x]) => (x > maxX ? x : maxX), 0) + const height = points.reduce((maxY, [, y]) => (y > maxY ? y : maxY), 0) + // Prepare canvas + const canvas = [] as number[][] + for (let y = 0; y <= height; y++) { + canvas[y] = [] + for (let x = 0; x <= width; x++) { + canvas[y][x] = 0 + } + } + for (const [x, y] of points) { + canvas[y][x] += 1 + } + return canvas +} diff --git a/day05/drawLines.ts b/day05/drawLines.ts new file mode 100644 index 0000000..d09c2dd --- /dev/null +++ b/day05/drawLines.ts @@ -0,0 +1,5 @@ +import { Line } from './line' +import { lineTo, Point } from './lineTo' + +export const drawLines = (lines: Line[]): Point[] => + lines.reduce((points, line) => [...points, ...lineTo(...line)], [] as Point[]) diff --git a/day05/input.txt b/day05/input.txt new file mode 100644 index 0000000..1dda409 --- /dev/null +++ b/day05/input.txt @@ -0,0 +1,500 @@ +593,10 -> 593,98 +777,236 -> 964,236 +650,575 -> 476,575 +120,612 -> 715,17 +508,707 -> 508,89 +98,834 -> 751,834 +623,554 -> 623,701 +929,976 -> 62,109 +368,893 -> 330,931 +495,335 -> 40,335 +44,704 -> 423,704 +683,711 -> 683,487 +26,940 -> 833,133 +961,183 -> 454,183 +301,306 -> 301,935 +973,822 -> 398,822 +639,911 -> 515,911 +861,180 -> 184,857 +31,97 -> 857,923 +966,376 -> 966,114 +881,485 -> 881,377 +930,98 -> 110,918 +841,889 -> 841,35 +512,261 -> 880,261 +48,533 -> 48,674 +207,226 -> 52,226 +823,952 -> 177,306 +331,566 -> 423,566 +422,418 -> 422,130 +699,517 -> 699,567 +757,784 -> 241,784 +508,445 -> 560,393 +866,275 -> 435,706 +74,41 -> 74,258 +386,369 -> 334,317 +240,94 -> 240,969 +851,197 -> 577,197 +28,906 -> 741,193 +286,227 -> 286,293 +849,800 -> 849,665 +736,307 -> 336,307 +69,701 -> 494,276 +421,823 -> 96,823 +121,626 -> 121,393 +318,351 -> 194,351 +670,671 -> 439,671 +603,914 -> 603,272 +61,507 -> 61,889 +266,39 -> 157,39 +543,664 -> 869,664 +382,709 -> 884,709 +499,80 -> 548,80 +489,79 -> 878,79 +695,86 -> 644,86 +987,585 -> 987,557 +287,67 -> 551,67 +975,983 -> 35,43 +707,351 -> 232,351 +529,175 -> 852,175 +32,811 -> 604,811 +106,153 -> 815,153 +195,268 -> 509,582 +50,922 -> 312,922 +220,500 -> 872,500 +473,33 -> 569,33 +858,847 -> 162,151 +937,947 -> 26,36 +726,435 -> 402,435 +686,601 -> 474,813 +764,880 -> 84,200 +850,950 -> 850,464 +413,620 -> 413,285 +893,560 -> 229,560 +149,100 -> 149,901 +358,613 -> 243,613 +202,445 -> 202,411 +127,153 -> 513,539 +147,846 -> 53,940 +139,920 -> 679,380 +913,953 -> 913,735 +339,466 -> 339,177 +113,882 -> 647,882 +18,880 -> 134,880 +897,152 -> 897,428 +473,511 -> 636,511 +880,370 -> 358,370 +400,244 -> 721,244 +419,987 -> 120,688 +872,224 -> 481,224 +335,302 -> 730,302 +961,324 -> 961,157 +769,301 -> 959,301 +829,124 -> 144,124 +523,372 -> 985,372 +520,33 -> 520,685 +554,644 -> 808,898 +82,676 -> 870,676 +303,612 -> 303,705 +338,40 -> 338,939 +836,47 -> 72,811 +371,751 -> 575,955 +929,505 -> 929,324 +273,181 -> 275,183 +347,595 -> 347,463 +95,629 -> 95,606 +809,188 -> 126,871 +857,924 -> 145,212 +668,277 -> 668,63 +700,904 -> 700,45 +814,899 -> 22,899 +205,98 -> 714,607 +943,28 -> 40,931 +282,620 -> 773,129 +424,803 -> 285,803 +688,329 -> 299,329 +146,628 -> 34,628 +573,417 -> 164,826 +292,232 -> 412,112 +412,508 -> 145,508 +632,648 -> 632,92 +885,904 -> 885,513 +295,981 -> 132,818 +134,681 -> 41,681 +810,531 -> 959,531 +188,590 -> 188,215 +960,795 -> 189,24 +729,211 -> 729,833 +214,817 -> 845,817 +196,609 -> 584,609 +384,908 -> 384,101 +770,907 -> 770,530 +451,469 -> 451,812 +571,261 -> 834,261 +799,436 -> 799,983 +248,105 -> 248,879 +783,906 -> 783,903 +955,670 -> 790,670 +723,750 -> 723,429 +572,427 -> 546,427 +610,341 -> 527,341 +925,426 -> 816,317 +151,403 -> 151,684 +408,969 -> 408,369 +276,425 -> 276,75 +186,86 -> 186,758 +412,420 -> 412,531 +361,60 -> 976,60 +787,649 -> 667,769 +45,866 -> 91,866 +319,963 -> 51,963 +112,866 -> 112,747 +291,475 -> 504,475 +175,116 -> 357,116 +968,961 -> 968,213 +13,12 -> 987,986 +640,728 -> 767,728 +981,505 -> 246,505 +864,981 -> 128,981 +91,66 -> 931,906 +798,116 -> 91,823 +552,74 -> 88,538 +620,872 -> 232,872 +45,229 -> 658,229 +413,75 -> 413,436 +815,257 -> 815,686 +989,22 -> 36,975 +178,904 -> 233,849 +635,128 -> 635,96 +640,820 -> 640,313 +890,787 -> 167,64 +221,22 -> 826,22 +914,132 -> 60,986 +848,31 -> 392,487 +105,969 -> 858,969 +903,868 -> 143,108 +38,941 -> 621,358 +171,340 -> 14,497 +286,460 -> 81,255 +726,688 -> 857,819 +494,689 -> 510,689 +517,913 -> 598,913 +932,66 -> 932,431 +977,982 -> 18,23 +95,101 -> 95,278 +574,467 -> 349,467 +63,803 -> 63,882 +838,874 -> 255,874 +900,752 -> 181,33 +102,897 -> 989,10 +374,439 -> 374,277 +513,504 -> 513,885 +814,932 -> 814,407 +824,656 -> 959,521 +415,570 -> 616,570 +577,880 -> 577,181 +287,524 -> 986,524 +955,665 -> 323,665 +556,365 -> 263,658 +154,226 -> 886,226 +803,750 -> 866,750 +558,725 -> 558,395 +941,115 -> 941,150 +180,410 -> 180,874 +458,753 -> 112,753 +199,253 -> 363,253 +423,650 -> 22,650 +892,851 -> 279,238 +611,109 -> 611,198 +983,344 -> 339,988 +299,47 -> 299,934 +435,652 -> 700,387 +186,775 -> 677,284 +136,576 -> 136,368 +818,744 -> 305,744 +767,171 -> 767,431 +930,842 -> 259,171 +342,831 -> 342,601 +193,672 -> 46,525 +925,164 -> 528,164 +725,92 -> 617,200 +67,729 -> 67,739 +547,153 -> 547,245 +763,434 -> 763,509 +314,888 -> 357,888 +72,645 -> 491,645 +92,67 -> 240,67 +827,936 -> 788,897 +852,378 -> 77,378 +448,337 -> 668,337 +846,739 -> 499,739 +465,691 -> 315,541 +716,163 -> 18,861 +78,965 -> 983,60 +114,952 -> 820,246 +950,351 -> 419,882 +266,36 -> 266,482 +773,841 -> 773,66 +742,198 -> 742,46 +417,512 -> 304,625 +900,277 -> 900,338 +983,431 -> 473,941 +986,282 -> 734,30 +742,19 -> 769,19 +952,320 -> 948,324 +92,590 -> 548,590 +107,39 -> 107,696 +603,749 -> 603,26 +55,282 -> 888,282 +670,848 -> 985,533 +981,982 -> 92,93 +147,428 -> 649,930 +773,737 -> 821,785 +791,576 -> 791,852 +327,672 -> 530,469 +847,122 -> 381,122 +419,493 -> 498,572 +879,842 -> 879,239 +267,717 -> 267,869 +142,449 -> 174,417 +342,718 -> 342,397 +603,207 -> 314,207 +612,648 -> 735,771 +37,10 -> 971,944 +891,716 -> 891,86 +252,217 -> 662,627 +185,165 -> 941,921 +854,717 -> 676,717 +158,791 -> 336,791 +762,226 -> 98,890 +73,189 -> 92,189 +649,511 -> 253,115 +719,456 -> 514,251 +605,286 -> 325,286 +454,609 -> 454,489 +374,541 -> 783,541 +599,177 -> 94,682 +600,384 -> 32,384 +810,933 -> 39,162 +780,871 -> 409,871 +24,639 -> 24,316 +454,80 -> 454,95 +556,541 -> 907,541 +627,295 -> 750,295 +245,71 -> 214,102 +725,445 -> 614,445 +779,538 -> 779,390 +746,667 -> 351,272 +117,776 -> 117,660 +498,495 -> 88,905 +697,721 -> 697,919 +580,314 -> 580,166 +22,656 -> 641,37 +413,433 -> 44,802 +182,305 -> 805,928 +739,277 -> 739,499 +172,210 -> 172,259 +894,576 -> 894,322 +265,263 -> 265,437 +430,228 -> 780,578 +464,531 -> 798,531 +713,63 -> 668,63 +918,831 -> 256,169 +414,375 -> 467,375 +440,32 -> 391,32 +439,806 -> 955,806 +335,820 -> 335,279 +727,458 -> 422,458 +312,274 -> 619,581 +136,724 -> 538,322 +589,680 -> 589,850 +335,648 -> 232,545 +499,216 -> 405,216 +942,710 -> 942,455 +969,556 -> 721,556 +756,552 -> 756,902 +98,870 -> 445,870 +476,833 -> 476,269 +820,127 -> 407,127 +337,519 -> 714,519 +756,95 -> 11,840 +317,339 -> 317,286 +353,86 -> 43,86 +93,950 -> 938,105 +705,509 -> 705,319 +244,879 -> 721,402 +434,794 -> 711,517 +272,381 -> 431,381 +652,104 -> 652,587 +850,866 -> 34,50 +645,902 -> 79,336 +701,39 -> 701,295 +492,793 -> 95,396 +352,554 -> 395,554 +123,405 -> 322,206 +941,745 -> 716,520 +450,512 -> 569,631 +42,25 -> 817,800 +909,387 -> 909,863 +919,934 -> 919,546 +439,881 -> 569,881 +167,866 -> 167,669 +242,264 -> 242,694 +981,786 -> 228,33 +452,434 -> 452,660 +22,26 -> 22,29 +26,155 -> 677,806 +801,627 -> 313,627 +657,135 -> 657,270 +872,875 -> 440,443 +636,248 -> 636,338 +776,51 -> 93,51 +498,600 -> 894,600 +263,984 -> 263,807 +416,390 -> 899,873 +269,137 -> 976,137 +752,12 -> 752,617 +55,925 -> 548,925 +856,551 -> 771,551 +653,93 -> 653,587 +403,286 -> 403,417 +895,706 -> 221,32 +139,822 -> 139,928 +696,194 -> 696,143 +270,678 -> 710,678 +879,353 -> 879,360 +949,712 -> 752,712 +665,661 -> 817,661 +462,952 -> 980,434 +692,766 -> 692,478 +157,117 -> 144,117 +438,701 -> 408,701 +401,703 -> 401,724 +876,831 -> 108,63 +749,892 -> 832,892 +455,124 -> 455,776 +551,222 -> 551,372 +533,80 -> 726,80 +342,740 -> 56,740 +793,370 -> 34,370 +949,614 -> 949,623 +610,287 -> 610,760 +978,834 -> 85,834 +644,894 -> 644,341 +35,887 -> 176,887 +168,958 -> 964,162 +341,886 -> 341,470 +417,845 -> 417,702 +338,347 -> 304,313 +651,10 -> 72,10 +853,160 -> 853,85 +381,568 -> 436,623 +794,437 -> 250,437 +861,72 -> 206,72 +807,813 -> 807,827 +820,502 -> 820,329 +547,508 -> 547,773 +160,129 -> 160,175 +756,468 -> 756,80 +442,661 -> 405,661 +304,817 -> 304,765 +99,42 -> 957,900 +212,110 -> 854,752 +44,620 -> 661,620 +212,311 -> 784,883 +329,671 -> 329,908 +86,359 -> 553,826 +257,799 -> 934,122 +409,663 -> 409,367 +528,623 -> 593,688 +957,525 -> 544,938 +846,766 -> 113,33 +176,680 -> 176,102 +167,287 -> 167,929 +932,870 -> 834,968 +86,774 -> 49,774 +745,231 -> 70,906 +435,760 -> 138,463 +776,810 -> 625,810 +928,930 -> 76,78 +602,24 -> 602,688 +394,424 -> 65,424 +946,966 -> 93,113 +494,39 -> 951,39 +607,699 -> 832,699 +13,403 -> 391,403 +726,475 -> 726,29 +828,625 -> 836,617 +396,770 -> 167,770 +28,546 -> 374,200 +56,113 -> 837,894 +290,589 -> 740,139 +930,805 -> 296,171 +646,895 -> 49,895 +111,15 -> 111,497 +11,274 -> 570,833 +257,624 -> 603,624 +63,844 -> 666,844 +846,661 -> 846,464 +431,72 -> 431,674 +726,674 -> 726,40 +286,660 -> 286,909 +847,222 -> 847,861 +325,896 -> 325,416 +793,953 -> 365,953 +987,956 -> 62,31 +845,853 -> 363,371 +79,782 -> 506,782 +424,21 -> 424,369 +938,162 -> 177,923 +86,193 -> 799,906 +320,164 -> 320,654 +840,306 -> 840,711 +852,736 -> 852,690 +876,966 -> 143,233 +787,926 -> 38,177 +374,112 -> 340,112 +132,541 -> 740,541 +29,28 -> 968,967 +916,212 -> 170,958 +371,553 -> 521,403 +88,796 -> 870,796 +656,367 -> 71,367 +785,166 -> 785,427 +320,30 -> 320,549 +909,527 -> 816,620 +832,965 -> 302,965 +672,259 -> 80,259 +578,513 -> 578,243 +975,561 -> 537,123 +135,330 -> 188,330 +501,695 -> 501,573 +717,230 -> 878,230 +854,501 -> 27,501 +705,885 -> 950,885 +704,338 -> 704,630 +477,485 -> 864,485 +901,42 -> 305,638 +660,540 -> 660,546 +555,79 -> 190,79 +226,126 -> 800,700 +575,908 -> 944,908 +94,478 -> 94,746 +461,425 -> 929,893 +861,429 -> 451,19 +832,825 -> 179,172 +186,133 -> 298,133 +684,270 -> 558,270 +786,872 -> 125,872 +649,178 -> 649,595 +893,738 -> 412,257 +760,854 -> 901,713 +16,914 -> 866,64 +935,928 -> 266,259 +323,229 -> 32,229 +608,828 -> 608,49 +715,892 -> 74,251 +787,187 -> 787,903 +405,793 -> 405,183 +232,704 -> 232,389 +130,706 -> 130,657 \ No newline at end of file diff --git a/day05/line.ts b/day05/line.ts new file mode 100644 index 0000000..1d9a7f4 --- /dev/null +++ b/day05/line.ts @@ -0,0 +1,15 @@ +import { Point } from './lineTo' + +export const toNumber = (s: string): number => parseInt(s, 10) + +export type Line = [from: Point, to: Point] + +export const toLine = (s: string): Line => { + const [f, t] = s.split(' -> ') + const [x0, y0] = f.split(',').map(toNumber) + const [x1, y1] = t.split(',').map(toNumber) + return [ + [x0, y0], + [x1, y1], + ] +} diff --git a/day05/lineTo.spec.ts b/day05/lineTo.spec.ts new file mode 100644 index 0000000..1eb0ee5 --- /dev/null +++ b/day05/lineTo.spec.ts @@ -0,0 +1,26 @@ +import { lineTo, Point } from './lineTo' + +describe('lineTo', () => { + it.each([ + [ + [1, 1], + [1, 3], + [ + [1, 1], + [1, 2], + [1, 3], + ], + ], + [ + [9, 7], + [7, 7], + [ + [9, 7], + [8, 7], + [7, 7], + ], + ], + ])('should draw a line from %j to %j => %j', (from, to, expected) => + expect(lineTo(from as Point, to as Point)).toEqual(expected), + ) +}) diff --git a/day05/lineTo.ts b/day05/lineTo.ts new file mode 100644 index 0000000..fe980de --- /dev/null +++ b/day05/lineTo.ts @@ -0,0 +1,32 @@ +export type Point = [x: number, y: number] + +export const lineTo = ([x1, y1]: Point, [x2, y2]: Point): Point[] => { + const dx = x2 - x1 + const dy = y2 - y1 + const adx = Math.abs(dx) + const ady = Math.abs(dy) + const sx = dx > 0 ? 1 : -1 + const sy = dy > 0 ? 1 : -1 + const arr: Point[] = [] + let eps = 0 + if (adx > ady) { + for (let x = x1, y = y1; sx < 0 ? x >= x2 : x <= x2; x += sx) { + arr.push([x, y]) + eps += ady + if (eps << 1 >= adx) { + y += sy + eps -= adx + } + } + } else { + for (let x = x1, y = y1; sy < 0 ? y >= y2 : y <= y2; y += sy) { + arr.push([x, y]) + eps += adx + if (eps << 1 >= ady) { + x += sx + eps -= ady + } + } + } + return arr +} diff --git a/day05/linesOverlap.ts b/day05/linesOverlap.ts new file mode 100644 index 0000000..d309c17 --- /dev/null +++ b/day05/linesOverlap.ts @@ -0,0 +1,25 @@ +import { Point } from './lineTo' + +export const linesOverlap = ( + minOverlap: number, + diagram: number[][], +): { + point: Point + count: number +}[] => { + const points: { + point: Point + count: number + }[] = [] + for (let y = 0; y < diagram.length; y++) { + for (let x = 0; x < diagram[y].length; x++) { + const count = diagram[y][x] + if (count >= minOverlap) + points.push({ + count, + point: [x, y], + }) + } + } + return points +} diff --git a/day05/render.ts b/day05/render.ts new file mode 100644 index 0000000..e5bdb8a --- /dev/null +++ b/day05/render.ts @@ -0,0 +1,4 @@ +export const render = (diagram: number[][]): string => + diagram + .map((row) => row.map((n) => (n === 0 ? '.' : n.toString())).join('')) + .join('\n') diff --git a/day05/solution.spec.ts b/day05/solution.spec.ts new file mode 100644 index 0000000..5ee3fa0 --- /dev/null +++ b/day05/solution.spec.ts @@ -0,0 +1,43 @@ +import { loader } from '../lib/loader' +import { drawDiagram } from './drawDiagram' +import { drawLines } from './drawLines' +import { Line, toLine } from './line' +import { linesOverlap } from './linesOverlap' +import { render } from './render' + +const onlyHorizontal = ([[x1, y1], [x2, y2]]: Line): boolean => + x1 === x2 || y1 === y2 + +const example = [ + '0,9 -> 5,9', + '8,0 -> 0,8', + '9,4 -> 3,4', + '2,2 -> 2,1', + '7,0 -> 7,4', + '6,4 -> 2,0', + '0,9 -> 2,9', + '3,4 -> 1,4', + '0,0 -> 8,8', + '5,5 -> 8,2', +] + .map(toLine) + // For now, only consider horizontal and vertical lines: lines where either x1 = x2 or y1 = y2. + .filter(onlyHorizontal) + +const input = loader(5)('input').map(toLine).filter(onlyHorizontal) + +describe('Day 5: Hydrothermal Venture', () => { + it('should solve the example', () => { + const lines = drawLines(example) + const diagram = drawDiagram(lines) + console.log(render(diagram)) + const overlaps = linesOverlap(2, diagram) + expect(overlaps).toHaveLength(5) + }) + it('should solve the puzzle', () => { + const lines = drawLines(input) + const diagram = drawDiagram(lines) + const overlaps = linesOverlap(2, diagram) + expect(overlaps).toHaveLength(7468) + }) +}) From caab59526a0e82c8dc76904f2a2848764b3820d3 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sun, 5 Dec 2021 12:46:29 +0100 Subject: [PATCH 074/110] feat(day05): part 2 --- day05/solution.spec.ts | 49 +++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/day05/solution.spec.ts b/day05/solution.spec.ts index 5ee3fa0..ffaeb80 100644 --- a/day05/solution.spec.ts +++ b/day05/solution.spec.ts @@ -19,25 +19,44 @@ const example = [ '3,4 -> 1,4', '0,0 -> 8,8', '5,5 -> 8,2', -] - .map(toLine) - // For now, only consider horizontal and vertical lines: lines where either x1 = x2 or y1 = y2. +].map(toLine) + +const examplePart1 = example + // Only consider horizontal and vertical lines: lines where either x1 = x2 or y1 = y2. .filter(onlyHorizontal) -const input = loader(5)('input').map(toLine).filter(onlyHorizontal) +const input = loader(5)('input').map(toLine) +const inputPart1 = input.filter(onlyHorizontal) describe('Day 5: Hydrothermal Venture', () => { - it('should solve the example', () => { - const lines = drawLines(example) - const diagram = drawDiagram(lines) - console.log(render(diagram)) - const overlaps = linesOverlap(2, diagram) - expect(overlaps).toHaveLength(5) + describe('Part 1: only horizontal and vertical', () => { + it('should solve the example', () => { + const lines = drawLines(examplePart1) + const diagram = drawDiagram(lines) + console.log(render(diagram)) + const overlaps = linesOverlap(2, diagram) + expect(overlaps).toHaveLength(5) + }) + it('should solve the puzzle', () => { + const lines = drawLines(inputPart1) + const diagram = drawDiagram(lines) + const overlaps = linesOverlap(2, diagram) + expect(overlaps).toHaveLength(7468) + }) }) - it('should solve the puzzle', () => { - const lines = drawLines(input) - const diagram = drawDiagram(lines) - const overlaps = linesOverlap(2, diagram) - expect(overlaps).toHaveLength(7468) + describe('Part 2: all directions', () => { + it('should solve the example', () => { + const lines = drawLines(example) + const diagram = drawDiagram(lines) + console.log(render(diagram)) + const overlaps = linesOverlap(2, diagram) + expect(overlaps).toHaveLength(12) + }) + it('should solve the puzzle', () => { + const lines = drawLines(input) + const diagram = drawDiagram(lines) + const overlaps = linesOverlap(2, diagram) + expect(overlaps).toHaveLength(22364) + }) }) }) From 5edd966f094ed3bdec8e86ff39eba39acdbcb58b Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Mon, 6 Dec 2021 09:03:31 +0100 Subject: [PATCH 075/110] feat(day06): part 1 --- day06/game.spec.ts | 64 ++++++++++++++++++++++++++++++++++++++ day06/game.ts | 25 +++++++++++++++ day06/solution.spec.ts | 40 ++++++++++++++++++++++++ day06/toPopulation.spec.ts | 11 +++++++ day06/toPopulation.ts | 10 ++++++ 5 files changed, 150 insertions(+) create mode 100644 day06/game.spec.ts create mode 100644 day06/game.ts create mode 100644 day06/solution.spec.ts create mode 100644 day06/toPopulation.spec.ts create mode 100644 day06/toPopulation.ts diff --git a/day06/game.spec.ts b/day06/game.spec.ts new file mode 100644 index 0000000..36e666b --- /dev/null +++ b/day06/game.spec.ts @@ -0,0 +1,64 @@ +import { countFish, progressDay } from './game' +import { Population, toPopulation } from './toPopulation' + +describe('Game', () => { + describe('progressDay()', () => { + it.each([ + [{}, {}], + // So, suppose you have a lanternfish with an internal timer value of 3: + // After one day, its internal timer would become 2. + [{ 3: 1 }, { 2: 1 }], + // After another day, its internal timer would become 1. + [{ 2: 1 }, { 1: 1 }], + // After another day, its internal timer would become 0. + [{ 1: 1 }, { 0: 1 }], + // After another day, its internal timer would reset to 6, and it would create a new lanternfish with an internal timer of 8. + [{ 0: 1 }, { 6: 1, 8: 1 }], + // After another day, the first lanternfish would have an internal timer of 5, and the second lanternfish would have an internal timer of 7. + [ + { 6: 1, 8: 1 }, + { 5: 1, 7: 1 }, + ], + ])( + 'should advance the day by one and calculate the new population from %j => %j', + (population, expectedPopulation) => + expect(progressDay(population as Population)).toEqual( + expectedPopulation, + ), + ) + // Longer example + let p: Population = toPopulation([3, 4, 3, 1, 2]) + it.each([ + [[2, 3, 2, 0, 1]], + [[1, 2, 1, 6, 0, 8]], + [[0, 1, 0, 5, 6, 7, 8]], + [[6, 0, 6, 4, 5, 6, 7, 8, 8]], + [[5, 6, 5, 3, 4, 5, 6, 7, 7, 8]], + [[4, 5, 4, 2, 3, 4, 5, 6, 6, 7]], + [[3, 4, 3, 1, 2, 3, 4, 5, 5, 6]], + [[2, 3, 2, 0, 1, 2, 3, 4, 4, 5]], + [[1, 2, 1, 6, 0, 1, 2, 3, 3, 4, 8]], + [[0, 1, 0, 5, 6, 0, 1, 2, 2, 3, 7, 8]], + [[6, 0, 6, 4, 5, 6, 0, 1, 1, 2, 6, 7, 8, 8, 8]], + [[5, 6, 5, 3, 4, 5, 6, 0, 0, 1, 5, 6, 7, 7, 7, 8, 8]], + [[4, 5, 4, 2, 3, 4, 5, 6, 6, 0, 4, 5, 6, 6, 6, 7, 7, 8, 8]], + [[3, 4, 3, 1, 2, 3, 4, 5, 5, 6, 3, 4, 5, 5, 5, 6, 6, 7, 7, 8]], + [[2, 3, 2, 0, 1, 2, 3, 4, 4, 5, 2, 3, 4, 4, 4, 5, 5, 6, 6, 7]], + [[1, 2, 1, 6, 0, 1, 2, 3, 3, 4, 1, 2, 3, 3, 3, 4, 4, 5, 5, 6, 8]], + [[0, 1, 0, 5, 6, 0, 1, 2, 2, 3, 0, 1, 2, 2, 2, 3, 3, 4, 4, 5, 7, 8]], + [ + [ + 6, 0, 6, 4, 5, 6, 0, 1, 1, 2, 6, 0, 1, 1, 1, 2, 2, 3, 3, 4, 6, 7, 8, + 8, 8, 8, + ], + ], + ])('should calculate the new population to be %j', (expectedPopulation) => { + p = progressDay(p) + return expect(p).toEqual(toPopulation(expectedPopulation)) + }) + }) + describe('countFish', () => { + it('should count the fish in a population', () => + expect(countFish({ 6: 1, 8: 1, 0: 3 })).toEqual(5)) + }) +}) diff --git a/day06/game.ts b/day06/game.ts new file mode 100644 index 0000000..07b92fb --- /dev/null +++ b/day06/game.ts @@ -0,0 +1,25 @@ +import { Population } from './toPopulation' + +export const progressDay = (population: Population): Population => + Object.entries(population).reduce((population, [days, amount]) => { + const newTimer = parseInt(days, 10) - 1 + if (newTimer < 0) { + return { + ...population, + 6: amount + (population[6] ?? 0), + 8: amount + (population[8] ?? 0), + } + } + return { + ...population, + [newTimer]: amount + (population[newTimer] ?? 0), + } + }, {} as Population) + +export const countFish = (population: Population): number => + Object.values(population).reduce((sum, amount) => sum + amount, 0) + +export const renderPopulation = (population: Population): string => + Object.entries(population) + .map(([timer, amount]) => timer.repeat(amount).split('').join(',')) + .join(',') diff --git a/day06/solution.spec.ts b/day06/solution.spec.ts new file mode 100644 index 0000000..0fdb28f --- /dev/null +++ b/day06/solution.spec.ts @@ -0,0 +1,40 @@ +import { countFish, progressDay } from './game' +import { toPopulation } from './toPopulation' + +const example = [3, 4, 3, 1, 2] +const input = [ + 1, 1, 1, 3, 3, 2, 1, 1, 1, 1, 1, 4, 4, 1, 4, 1, 4, 1, 1, 4, 1, 1, 1, 3, 3, 2, + 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 4, 1, 1, 4, 3, 1, 2, 3, 1, 1, 1, 5, 2, 1, 1, + 1, 1, 2, 1, 2, 5, 2, 2, 1, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, 1, 1, 3, 3, 2, 1, 1, + 3, 1, 4, 1, 2, 1, 5, 1, 4, 2, 1, 1, 5, 1, 1, 1, 1, 4, 3, 1, 3, 2, 1, 4, 1, 1, + 2, 1, 4, 4, 5, 1, 3, 1, 1, 1, 1, 2, 1, 4, 4, 1, 1, 1, 3, 1, 5, 1, 1, 1, 1, 1, + 3, 2, 5, 1, 5, 4, 1, 4, 1, 3, 5, 1, 2, 5, 4, 3, 3, 2, 4, 1, 5, 1, 1, 2, 4, 1, + 1, 1, 1, 2, 4, 1, 2, 5, 1, 4, 1, 4, 2, 5, 4, 1, 1, 2, 2, 4, 1, 5, 1, 4, 3, 3, + 2, 3, 1, 2, 3, 1, 4, 1, 1, 1, 3, 5, 1, 1, 1, 3, 5, 1, 1, 4, 1, 4, 4, 1, 3, 1, + 1, 1, 2, 3, 3, 2, 5, 1, 2, 1, 1, 2, 2, 1, 3, 4, 1, 3, 5, 1, 3, 4, 3, 5, 1, 1, + 5, 1, 3, 3, 2, 1, 5, 1, 1, 3, 1, 1, 3, 1, 2, 1, 3, 2, 5, 1, 3, 1, 1, 3, 5, 1, + 1, 1, 1, 2, 1, 2, 4, 4, 4, 2, 2, 3, 1, 5, 1, 2, 1, 3, 3, 3, 4, 1, 1, 5, 1, 3, + 2, 4, 1, 5, 5, 1, 4, 4, 1, 4, 4, 1, 1, 2, +] + +describe('Day 6: Lanternfish', () => { + describe('Part 1', () => { + it.each([ + [18, 26], + [80, 5934], + ])('should solve the example', (days, expectedAmount) => { + let population = toPopulation(example) + for (let day = 1; day <= days; day++) { + population = progressDay(population) + } + expect(countFish(population)).toEqual(expectedAmount) + }) + it('should solve the puzzle', () => { + let population = toPopulation(input) + for (let day = 1; day <= 80; day++) { + population = progressDay(population) + } + expect(countFish(population)).toEqual(372984) + }) + }) +}) diff --git a/day06/toPopulation.spec.ts b/day06/toPopulation.spec.ts new file mode 100644 index 0000000..4c14110 --- /dev/null +++ b/day06/toPopulation.spec.ts @@ -0,0 +1,11 @@ +import { toPopulation } from './toPopulation' + +describe('toPopulation()', () => { + it('should convert the input to a population', () => + expect(toPopulation([3, 4, 3, 1, 2])).toEqual({ + 1: 1, + 2: 1, + 3: 2, + 4: 1, + })) +}) diff --git a/day06/toPopulation.ts b/day06/toPopulation.ts new file mode 100644 index 0000000..1856182 --- /dev/null +++ b/day06/toPopulation.ts @@ -0,0 +1,10 @@ +export type Population = Record + +export const toPopulation = (initial: number[]): Population => + initial.reduce( + (population, fish) => ({ + ...population, + [fish]: (population[fish] ?? 0) + 1, + }), + {} as Population, + ) From 3bfba90ffc6dfa39fc2527e83293b84d4d6a2fb5 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Mon, 6 Dec 2021 09:05:13 +0100 Subject: [PATCH 076/110] feat(day06): part 2 --- day06/solution.spec.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/day06/solution.spec.ts b/day06/solution.spec.ts index 0fdb28f..016f12b 100644 --- a/day06/solution.spec.ts +++ b/day06/solution.spec.ts @@ -37,4 +37,20 @@ describe('Day 6: Lanternfish', () => { expect(countFish(population)).toEqual(372984) }) }) + describe('Part 2', () => { + it('should solve the example', () => { + let population = toPopulation(example) + for (let day = 1; day <= 256; day++) { + population = progressDay(population) + } + expect(countFish(population)).toEqual(26984457539) + }) + it('should solve the puzzle', () => { + let population = toPopulation(input) + for (let day = 1; day <= 256; day++) { + population = progressDay(population) + } + expect(countFish(population)).toEqual(1681503251694) + }) + }) }) From 3dba0df800d92d2f724907d1618e3f3a5540d58b Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Tue, 7 Dec 2021 08:58:42 +0100 Subject: [PATCH 077/110] feat(day07): part 1 --- day07/input.txt | 1 + day07/moveCrabs.spec.ts | 11 +++++++++++ day07/moveCrabs.ts | 35 +++++++++++++++++++++++++++++++++++ day07/solution.spec.ts | 15 +++++++++++++++ 4 files changed, 62 insertions(+) create mode 100644 day07/input.txt create mode 100644 day07/moveCrabs.spec.ts create mode 100644 day07/moveCrabs.ts create mode 100644 day07/solution.spec.ts diff --git a/day07/input.txt b/day07/input.txt new file mode 100644 index 0000000..968f693 --- /dev/null +++ b/day07/input.txt @@ -0,0 +1 @@ +1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,273,102,514,428,300,13,9,457,92,169,1654,471,479,178,158,124,354,83,705,30,80,199,632,31,840,580,1228,1597,151,1374,1665,469,43,1113,103,1,1456,132,2,618,423,824,789,145,485,585,543,694,1266,866,1276,726,680,1714,503,79,137,208,8,1447,455,33,1098,1346,1028,178,1095,21,19,52,668,29,382,1659,310,225,21,15,258,915,434,92,181,120,408,612,684,2,5,1507,127,746,203,66,4,82,440,1796,166,515,216,422,175,1643,240,100,178,375,487,134,599,581,38,101,19,882,1580,282,228,409,1124,409,255,1004,90,123,146,1130,461,84,9,1537,240,42,812,815,72,140,299,317,398,982,340,529,521,204,1137,895,912,313,27,540,638,403,188,163,133,34,1038,1597,440,200,275,2,1057,682,108,340,1096,361,2,242,464,392,432,334,955,145,275,605,858,173,375,435,3,3,784,396,324,1004,25,794,61,1358,752,31,563,23,407,886,870,501,1353,195,751,1407,10,874,31,33,589,124,403,205,225,40,1510,150,172,74,9,715,39,14,36,1775,29,1094,1007,199,4,26,301,878,751,538,33,102,109,297,236,119,195,431,34,179,827,6,204,91,594,65,255,1136,820,163,1508,388,680,968,1587,235,294,543,197,640,143,95,28,814,1053,827,167,54,606,0,823,3,340,619,195,31,216,330,287,382,676,392,5,1233,248,1000,323,872,234,316,4,112,663,113,1402,357,416,148,53,102,681,15,294,407,269,297,386,4,254,1666,454,139,1173,65,572,132,3,368,290,271,716,646,626,1727,411,196,181,1256,92,29,4,337,207,557,425,43,465,35,85,1218,241,936,247,94,1433,1002,400,624,88,1072,1048,370,101,264,78,379,27,65,672,1368,692,822,1020,317,472,1019,298,486,2,18,163,1304,994,952,455,454,661,1,473,561,313,92,425,218,29,49,618,790,615,347,462,169,275,247,1445,1880,225,1778,159,176,569,32,529,602,34,365,84,753,253,962,137,917,401,507,242,451,751,67,20,1208,411,226,829,317,283,219,154,683,30,1092,24,386,24,117,545,35,188,621,14,1453,24,892,330,337,754,407,481,906,643,552,864,808,360,704,118,368,297,1446,1348,104,1077,588,298,141,971,2,801,74,434,663,543,872,447,368,109,292,526,933,489,65,33,1061,1030,727,718,62,31,518,457,1569,815,422,187,211,1193,256,811,88,65,275,998,618,113,208,160,113,270,1085,295,20,161,117,134,1045,132,28,29,779,1108,24,801,240,184,414,79,335,98,486,195,100,302,574,561,353,8,260,1,540,584,410,1299,266,44,1120,877,252,377,849,83,547,637,827,298,1151,222,90,533,551,203,203,67,881,6,812,88,1314,178,169,576,885,767,278,1565,154,108,543,31,100,190,298,254,1478,594,644,957,177,20,1578,482,121,106,841,195,16,51,561,205,55,97,107,380,128,655,629,995,1424,1005,276,838,143,506,450,56,172,955,20,1045,253,436,1016,1106,68,540,807,265,405,301,539,1236,874,986,1092,274,1208,738,89,107,510,90,15,1402,313,712,35,222,494,125,113,290,259,274,214,70,1416,242,1312,1023,974,128,1787,91,13,992,84,673,185,375,385,0,285,135,116,105,26,103,929,733,567,294,174,82,1181,941,161,1242,387,20,882,1789,1164,1157,936,1110,1142,1308,657,931,29,603,1001,157,22,786,161,835,459,843,50,3,51,42,476,509,1214,733,1102,1011,0,832,1186,246,284,503,455,146,398,13,1109,106,90,511,1232,1837,580,285,86,1388,1199,195,225,742,194,1448,1732,309,1074,1380,251,1010,137,382,1367,490,1828,47,11,888,251,16,37,393,1407,233,5,814,780,850,22,1196,957,492,4,254,745,580,651,225,1072,872,323,618,24,303,79,7,75,11,15,65,449,205,103,836,150,111,424,786,194,1752,55,674,1469,1050,891,50,792,0,381,31,152,141,91,1521,420,18,779,450,68,929,122,106,7,142,185,355,768,581,1024,140,438,350,1838,815,977,23,663,324,30,7,408,461,40,108,203,459,530,69,120,177,962,162,1566,253,2,308,232,42,1564,1161,48,270,253,83,652,247,539,166,159,856,331,1701,970,1085,442,21,868,960,298,534,378,75,226,586,21,57,636,279,1112,63,1519,555,191,773,168,120,603,716,544,1546,378,418,149,138,1212,575,29,284,577,223,145,387,639,1204,154,613,48,116,307,341,716,3,831,987,629,1338,852,189,340,1213 \ No newline at end of file diff --git a/day07/moveCrabs.spec.ts b/day07/moveCrabs.spec.ts new file mode 100644 index 0000000..260bb35 --- /dev/null +++ b/day07/moveCrabs.spec.ts @@ -0,0 +1,11 @@ +import { moveCrabs } from './moveCrabs' + +describe('moveCrabs()', () => { + it.each([ + //[[0], 0], + [[1, 2, 3], 2], + ])( + 'should calculate the fuel needed to move the crabs %j to be %d', + (crabs, expectedFuel) => expect(moveCrabs(crabs)).toEqual(expectedFuel), + ) +}) diff --git a/day07/moveCrabs.ts b/day07/moveCrabs.ts new file mode 100644 index 0000000..c639e78 --- /dev/null +++ b/day07/moveCrabs.ts @@ -0,0 +1,35 @@ +export const moveCrabs = (crabs: number[]): number => { + if (crabs.length === 1) return 0 + // Find max steps to move + crabs.sort((a, b) => a - b) + const min = crabs[0] + const max = crabs[crabs.length - 1] + let maxFuel = Number.MAX_SAFE_INTEGER + for (let pos = min; pos <= max; pos++) { + // Try to move all crabs to this position + const { spentFuel } = moveCrabsToPos(crabs, pos, maxFuel) + if (spentFuel < maxFuel) { + maxFuel = spentFuel + } + } + return maxFuel +} + +export type Move = [crab: number, amount: number] + +const moveCrabsToPos = ( + crabs: number[], + target: number, + maxFuel: number, +): { moves: Move[]; spentFuel: number } => { + const moves: Move[] = [] + let spentFuel = 0 + for (const crab of crabs) { + const neededFuel = Math.abs(target - crab) + spentFuel += neededFuel + moves.push([crab, neededFuel]) + // End early + if (spentFuel > maxFuel) return { moves, spentFuel } + } + return { moves, spentFuel } +} diff --git a/day07/solution.spec.ts b/day07/solution.spec.ts new file mode 100644 index 0000000..1957397 --- /dev/null +++ b/day07/solution.spec.ts @@ -0,0 +1,15 @@ +import { loader } from '../lib/loader' +import { moveCrabs } from './moveCrabs' + +const input = loader(7)('input')[0] + .split(',') + .map((s) => parseInt(s, 10)) + +describe('Day 7: The Treachery of Whales', () => { + describe('Part 1', () => { + it('should solve the example', () => + expect(moveCrabs([16, 1, 2, 0, 4, 2, 7, 1, 2, 14])).toEqual(37)) + it('should solve the puzzle', () => + expect(moveCrabs(input)).toEqual(344297)) + }) +}) From baf2df5135ea706b88f1f495422805a5bb9668de Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Tue, 7 Dec 2021 09:07:11 +0100 Subject: [PATCH 078/110] feat(day07): part 2 --- day07/moveCrabs.ts | 20 +++++++++++++++++--- day07/solution.spec.ts | 12 +++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/day07/moveCrabs.ts b/day07/moveCrabs.ts index c639e78..a529715 100644 --- a/day07/moveCrabs.ts +++ b/day07/moveCrabs.ts @@ -1,4 +1,7 @@ -export const moveCrabs = (crabs: number[]): number => { +export const moveCrabs = ( + crabs: number[], + fuelCosts = (from: number, to: number) => Math.abs(from - to), +): number => { if (crabs.length === 1) return 0 // Find max steps to move crabs.sort((a, b) => a - b) @@ -7,7 +10,7 @@ export const moveCrabs = (crabs: number[]): number => { let maxFuel = Number.MAX_SAFE_INTEGER for (let pos = min; pos <= max; pos++) { // Try to move all crabs to this position - const { spentFuel } = moveCrabsToPos(crabs, pos, maxFuel) + const { spentFuel } = moveCrabsToPos(crabs, pos, maxFuel, fuelCosts) if (spentFuel < maxFuel) { maxFuel = spentFuel } @@ -21,11 +24,12 @@ const moveCrabsToPos = ( crabs: number[], target: number, maxFuel: number, + fuelCosts: (from: number, to: number) => number, ): { moves: Move[]; spentFuel: number } => { const moves: Move[] = [] let spentFuel = 0 for (const crab of crabs) { - const neededFuel = Math.abs(target - crab) + const neededFuel = fuelCosts(target, crab) spentFuel += neededFuel moves.push([crab, neededFuel]) // End early @@ -33,3 +37,13 @@ const moveCrabsToPos = ( } return { moves, spentFuel } } + +export const moveCrabsWithIncreasingFuelCosts = (crabs: number[]): number => + moveCrabs(crabs, (from, to) => { + let totalFuel = 0 + const distance = Math.abs(from - to) + for (let costs = 1; costs <= distance; costs++) { + totalFuel += costs + } + return totalFuel + }) diff --git a/day07/solution.spec.ts b/day07/solution.spec.ts index 1957397..72146cc 100644 --- a/day07/solution.spec.ts +++ b/day07/solution.spec.ts @@ -1,15 +1,21 @@ import { loader } from '../lib/loader' -import { moveCrabs } from './moveCrabs' +import { moveCrabs, moveCrabsWithIncreasingFuelCosts } from './moveCrabs' +const example = [16, 1, 2, 0, 4, 2, 7, 1, 2, 14] const input = loader(7)('input')[0] .split(',') .map((s) => parseInt(s, 10)) describe('Day 7: The Treachery of Whales', () => { describe('Part 1', () => { - it('should solve the example', () => - expect(moveCrabs([16, 1, 2, 0, 4, 2, 7, 1, 2, 14])).toEqual(37)) + it('should solve the example', () => expect(moveCrabs(example)).toEqual(37)) it('should solve the puzzle', () => expect(moveCrabs(input)).toEqual(344297)) }) + describe('Part 2', () => { + it('should solve the example', () => + expect(moveCrabsWithIncreasingFuelCosts(example)).toEqual(168)) + it('should solve the puzzle', () => + expect(moveCrabsWithIncreasingFuelCosts(input)).toEqual(97164301)) + }) }) From c85245d98fa4eaa5e90746a064a4ca64cf9d811d Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 8 Dec 2021 08:59:09 +0100 Subject: [PATCH 079/110] feat(day08): part 1 --- day08/input.txt | 200 +++++++++++++++++++++++++++++++++++++++++ day08/solution.spec.ts | 55 ++++++++++++ 2 files changed, 255 insertions(+) create mode 100644 day08/input.txt create mode 100644 day08/solution.spec.ts diff --git a/day08/input.txt b/day08/input.txt new file mode 100644 index 0000000..945b08c --- /dev/null +++ b/day08/input.txt @@ -0,0 +1,200 @@ +ecbad fdeacg gaecbd gbae gfcdbea cadge fcagdb abc cfdbe ab | beag bac dacgbe aegb +gad agcfb afegcd afed gacdf gdfce ad cfdgbe cfgdeba bdcgea | gbdecf cdgeaf abcgde ad +ebadf ag efgcdab fgced edgbcf begcfa adgef gcaedf afg dgca | agcd agdc fagcbde gfa +bgaefd gfcbe fgeda dbf dafbgc dfbge bd bdgcaef dfecga ebad | dbf db edab dbf +ebfcgd fedbc adc da gafdce bdaec bdcegaf edbafc bdfa gbcea | afbcedg cedbf decfb eacbg +fdabec adefcg dcf gabcf fedgcba gdaebf dfcga gfead decg dc | beafgd fcd dfc dcf +cgfbd gfb cgfa dcgeb fg bdafge gcfbad acbfd fcdabe aefcgbd | abfdc cgfa gbf gf +dfae aeg cfeag ea fgedac fdcbega agebdc cdegf fgcedb abcfg | feda fcgba ae efcgda +eafdgb bfaceg fba bf bgdf agdecbf cdafe gabde dfbae agcdeb | bfeda ecdaf fb fab +agebf dgbcef dagc ebcgadf da dfcge egdaf dea dfecag fabecd | gefab feadg ead agdc +afbcg bdgcfe aecgf gb dcafgeb bgad agfcdb bfg bfdeca bafcd | gdba dabegfc decbagf acfdbe +ag acdgfb fecgbd edacbgf dgcfb gbad gaf ecbaf cagbf gefacd | ag cebaf gbdfce ga +ecbg gb acdbg dgceab acdegfb beadfc cfagd ecbda adfegb dbg | efdagb gebc gb bg +cdafgb gdebca edgbf becf fb fegcbd fgb egdfa cadefgb bgced | bf cbfaegd fecb fceb +bacgedf afdgb ebagf bfadec ebafcg ecabg fae fe ecfg cdabge | fe adcgebf gabef ef +cdgbaf ebadfc afcbdge gfeadc fgcde egdbf ce cagfd geac cef | dgfaec agec fgdaec ce +dcag dfeabc cba bfcdg ecdbfg egafb afgcb gcaefbd ca gfcabd | fcebdg dbegcf bcefadg gdfcb +cdgefa fdebg abfdg dba agcdf bcadfg cbadfe dabfegc acbg ab | fgadceb fbcgead bda facgd +fbg bf agbfde bgcdefa fcdb gcfebd efgcb ecgbd gefac gaedcb | cgbfe cfgbe fcaeg bgdfae +dafcg cefd fcg geafbd deagcf fcdgbea fbgcea abgdc cf gdaef | gcf fcg dfec fc +cbea gebdfa ecbgf cfgdbe afgcbe gae adgbefc eagfc ea gfdac | agbfec eacfbg ea begafc +ba dfaegb afbd gfbea cegbf caegdb fdaeg dcfgeba feagcd abg | bafge dfba feagd gceafdb +dea bgade geabf adcfbe adgebf adgf bdegacf cdebg da agcfbe | dfag dafecgb dcaegbf cedbfa +fedcag fdebgca dfeab gdcaeb be fdeag fbge fadegb aeb bcadf | eba bae ebcfgda egfda +dcfb cgf abgcf gdcab adcgfe cf dgcbfa fabeg beacgd fgdebac | cgfdab deagfc feabg cf +adbgc cabgef adec dfgbec gdbfa cbgdafe dgc begac cbaged dc | cade bgafec gdc edca +agef eac fbceg ecgbfa bcdgea fceadbg cbfda eabcf ebfdgc ea | gfae badgfce acgdeb ea +cfb cdegfa badf gcaeb dbacgf cagdf eacgfdb fcagb dfgebc fb | bf gfdebc fcgdba cafgdb +dbgfae bgfeac bc cgb gecfd facb fbega fdgbace gbefc adecbg | edafgb cbg dgeafb fabc +geafcdb ec gcedfb acgbfd ecd cedfg gaefd bcfdg ecgb dcafeb | cde dfcbge acdfgb fegcd +decab acegf bfgdec cabegf bfc aebfc cbdefga adgcfe bf bagf | aecbfgd cfb bf cfdgbea +egf gfbade dbecg gdfeb edaf cadgbf fe cfaebg bgedcfa fadbg | fe gdfabc gfdbe fdbcag +fdgecb geb gdcfeba edagf dcefga dgbac bfdgea be eadgb ebaf | fdegba caegdf deabfg dgbea +egfbad efgacb bgfea cea gaefdcb cdeagf aecfb cgeb dbfac ec | ecbaf bafedcg ce dfaebcg +gecad dbeag dfcgea bd deb eabgf eabdfgc agbdec bcad fdcgeb | edb adgfce eagbf db +gdbac cbgea cdb gadfb cd faegdb dgfc dbceagf fbcadg ecadfb | facbdg cafdbe dc gcfd +cagbe abdgcf ca fcbgea baedg gac gdbfce ecfbg aefc gcfadeb | cafe face abcge febgc +gaebd fcba debca adc dacfge cfbde afdbce dgbefc ac fbceagd | ac becfd fcdbgae cefagd +cfdgbae abcgdf afbcg aecbg eb gedac bfgcea cbef fdbage bea | eabcg gcfba be geacdbf +cbfga faeg bcfae gbcda efbdac bfgcde bdefgac gf gfc agfbec | dgaebfc bdcfaeg gfea fage +fb egacb bdacgfe afgbc cbf aebf adcgeb fbgace fedgbc cdafg | cfb cfbag ebaf fb +beafd cafbe gedfca dfebagc bceg ec fcbdag fbecga gacfb ace | bgcfad afdgbec ec efcab +abefdg bacgd ecfg fag ebfca fcgba gcefab beafdc fg agefcbd | fgec cfeba fga gf +degf adgcf edcfgba ead cbaefd bcega cafdeg ed dagce gbcdfa | ead aebdfcg agbdfc egdf +gfecdb dacfe dacgb fb facbd facedb bdf fbae bcdafeg aedfgc | bf cedaf fgacde dfb +gabdf cfbegad dbagfc decaf bgdecf aedgf eg egab gaedfb edg | eg gadfb abdgf gde +dgaf faecb bacfdg gbdac abdegc cbfgade fcbag efgcdb bfg gf | defacbg gcdfeb fgbadc bagcf +adfgcb feg aedbg fdgbc gafcebd bdgef fe fcdegb eafbcg decf | ef fdce eabgd faebcg +fb fgbde bdgefca cgbf fdb deacgb cefdgb bdafec aefdg degbc | bfcgde bdgec befcda dfb +efcgb fgcaed fcdbga fed acfdbge eadbfg edgfb de deab bfgda | fbgda ed fgdbae aebd +ecfabg dfegbac ecfbd cbdaf gceadb cgbdfa dagbc af fba gafd | fa bagfcd bafgdec af +bae dcbfag fadgebc acgbf fageb cbfega bdafce ea bfgde cega | eba efbgd eab bdecfa +dfgeacb fgcbed cfbdg gbcaed fcebg cd fced ecgbaf fdagb bdc | dc bdc bcgfde dcbfage +cgbeaf adefgb gbefcd cbfa bcfedag bfage cb ceb gcdae gcbea | ecb cb cegabf eacfdgb +gfbea adgfb dfbage fad fd agcbd defcga fdeb baecfg gcbdafe | df dgfab egbfa afegb +acedbg becgdfa dcfe gbfda gdceb bcf fc fgbdce cdgfb efcbga | fcgdb fbc bcf bcf +deb gfbdeca cead agbed dcefbg ecgdba bgacd gbfea de fdabgc | cegbfd feabg bed badfgce +acegdf cdaefbg acbgf df agced aedgbf gbedac adf cfed gfacd | dcegfa fbeagd edcf df +ecbfa dbegfc bcdga bgafedc bcadge gdcafb de bed bcade geda | caebf bdcafg eabgcd cbefa +edbcfg agedf bacgfd bdagf dfgcaeb gdabc bgf gdbaec fabc bf | bgdcef bf gbf adgcb +fg afegcb gbf aegf gbfceda fcbgad decbg fabec gcfbe bacdef | bgf dgbefca fg agfcebd +eb fgebdc dcafge bgdeacf acedf bdae fecbda ecb fcgba cbfae | efgcda facdeb eadb ebc +gbafecd bgaced cabed eg bega fgadc fadcbe dge cadge dcgbfe | edg cadbfe cfgad ageb +badc fbcgde bgfaed cb febca fbc eadcbf gceaf aebfd bdfcage | acdb fcb bcad bdac +ecgfa deafcg bcdgfea ed cdaeg acfgeb aedf ecd gcbad bgcfde | ecd befgac de cgbad +cbeda bc ecbfdag gcabdf egbdca bgce aebfdg bcd gbade dcfae | decaf gacfdb bgce cbeg +ecdgb dc dbc cfegb decf fgacbe dafcbg gbcefd bacdfge gbdea | fdabgc cd gecadbf cbfeg +afbcdg gcaef degfca ec cge aedc efadbcg fgaeb gcfad fcdbge | aefcg fcbgda ec acde +adcfgb afe acegf cdefgab dafegc aedbfc dfcga fegd ef ceagb | dafceb cdaegf gdfe fe +gacdf bedgac bgfe bg gdb feabcdg fabdeg gdbaf bfade afdbce | begf bg egbcad gdb +beda aecfdg dgfaceb fegbc gbaec cba dbfacg gaedc ba dbcage | acdegf gcbfda aedcg edab +dbce ecgab cadge fcabg bfadegc ebdafg beg eb becdag fedacg | eb be efgdba be +cagebd df agdec fegcdba abfdce gfda cdgfe gdecfa cbgfe fde | egadfc fd cgdef dfga +da dgcafb acfbeg abgd dfbec fbacg fad fdagecb egafcd bfadc | feabcg fgaceb cbfeag bfgca +dcegaf dabgcf bedac febgadc fcdaeb eagcb cdfae dab db fedb | efdagbc bfdcga ebcagfd dab +bfc facgb deagbc fgeac badf bgdac bfdgac gcadfeb bf cdfbge | abgdecf afegc efgabcd fb +afbcde da bcfdge dbecg cad dgfebac dgbac edag cgbfa baedgc | gdeabc dega abdegcf dage +abfdc fa gabdcf gcbfd dfaebcg gbfeac bdeca acf cgbfde agdf | gdfa af caf fa +cfdg bedfca cfdbeg fdceb edcbga agbfe cg fcgbe bgc gaecdbf | bfaegcd bgc bcg cg +gcdafe fgec eafdcgb agdcf cfdea dgf fcaebd gf eadgbf adcbg | efcg cfge abgdef fg +cadgf dfacb cb ebdcafg cbf ebcdgf dabfe fbaged bcea fdacbe | gdcaf gbcefd dagcf cfabed +gcbdafe acd bacegd feca ac fgbdc facdg adegbf adegf dcgeaf | ebgacdf begdfca cgdaf cad +bfdc debfac acdeg baegcf afecd afd fd beacf bfedga acdgfeb | baedfc egcafb dfa afecd +geacfb efdacg eag cagdf cdea dgebf eagdf fgbacd dbgface ea | cdae acdgf acdgf efgdb +gafced eacgf cgbfe egdca eaf af eacbgd bacefdg adcf ebafgd | dbgaef agedbc fcda geacdb +eabcg gadb acgdeb db cegabf fecad dgefcab daceb dcb cbgdfe | db dgab gdba defgbc +eacf acgdfeb dgace cgfda gbcfad ebdgc efbdga aed ae cegdfa | cfgad cgdfa ae gadfec +bfdacg gdbfc cfbadge fcagb bcfdeg adfg dgebac ga agb bfaec | fgbeacd bdgeca ag ga +fabedc ed abegfcd bdfga feacb fecd ebadf agecfb aed adcbeg | ed fcde agcbdef fadeb +afgdce ecgabdf fc debaf cadbf gdabc cgadbf cebadg gfbc fca | fgbc eafdcg ecfdbag gdcabf +gad agedcf gebfadc gafbd fbcgd da abdc begfa bcgdaf dcefbg | efdcga gbfecad befga bagfe +feg afgb abdceg ecdgaf faedbgc afbcge cebdf efbcg cbage gf | gafbcde bgecaf feg egbfc +ba fdcagb dab adcefbg edacg dfecb gdabec cgfead gbea cedab | adb abd baecd cedbf +ged acgd dg cgabdfe cedgba fdcaeb baegd adecb bagef dgcbef | edg edg cdaeb ebfcad +bgdfe dfgae eabgfdc fdaebg egb afbg fcdbe bg agdebc degacf | egb egb bge bcfedga +adbfc ceabdgf aced facedb gadfcb dbe cdfbeg fdaeb efabg de | deabfc geadcfb ed fabdc +bc badgce gecb dabcg egfcad bdfaec cdgae abgdf beagdfc bca | dcaegbf cb dcbfage gdbca +debgafc becgda bdgfca dea bcdfe dcagb ae ecgadf egba ebdac | ebgdac gdaefc bgae eagb +gbdae adegbc daf gadbf fd dgef bfacg eafdcb cgefadb eadgbf | dfgab df daf adf +gbad fbdecg bcgfea bdafc defac dgbfc cgbfad ba bafecdg fba | bcgdf ba edcgbf efgdcb +ged gfecab cgfbdea aedc agefdb aebcgd ed dbceg abgce gdcbf | ged ged aegfbc dge +gbedcf be bfe afgdb aecb decafgb cgadef aebfd dacbfe faedc | be dcegbf cadbfeg cdfaeb +adfeb ecfadgb cbdefg ebdfag efag af daf acdbfg caedb fbedg | fdgbe daf daf af +gcbefda agfebc cedaf gface fecgad dc eadfb acd cdeg gfbcda | cgfdbea acd dcfea dc +gecafd aebfgd cde gcdf gdafe adcbge ecfba cgbfade cd decfa | egfadcb gbfdace cagfed fgcd +fgcdb gefcbd agb ag dcfegab bgcfda fbadge gacf bcgda dbace | degbafc agb dcgba gab +abfgde acdgfbe gabd gfecdb dfeca abgfe fdaeg gfd dg begcfa | bdag dgab gdafebc dfcae +eadcb dbcfe dgecbaf agdcfb cf fbc cbdfea abgedc fedbg ecaf | cf bfdace fbc fcb +ad efdgc cdafbg fecadg dbcegfa fgbae gdfae fbecdg adg cdea | decgbf acgbfde gabef da +gbf cdbgfea acfeb bedfgc adgbe gfeadb cegbad fg fdag afegb | gfb bgf cbefdga cafbe +adbcf gefb agbce acfbg gbfaecd fg fcg gceafd edagbc cfaebg | beagc fdeagc gf gfc +gdfbcea cdaeb egdbc fcgdbe gc cfdage gdbfe eadbfg fcbg cge | fbdecg fcegda bfdge bagdfe +adfbgc aegdb dc ecgdab dceb cedag fcgea dac ebagdfc dfbgae | efacdgb abcgfd egdab dac +dfg eacgbd ceadg gfac cefadg fg efagd gcfdbe begdacf eabdf | afgc acegd gf fg +fe eagfbd cgfab egf cadge begacd cedf caefg ecfagd dgbfaec | adegcb fe gdecbfa ecdf +da cedabg cfegad edacb bgcfdae dbcge gabd efbdgc adc ceabf | ceagfd bcefa cgdeb da +cebgdf bgcad dgface agbecf dfceg ecdbfag ae edaf ecdag eac | eca decgbf daef acefdg +aebgcd fdgcabe gecbfa fbgec bgfad gbecdf face cab ac acgbf | bfceg ca agdefbc efbgc +cgf caedf dfgabce gf ceagb bgaf cegdab fagebc dfcgeb fcega | eabcdfg fg gfc fgadbec +egfabdc gbfaed fcdea egadb fdgecb beacdg gc cge cedag gabc | bdgcef dceag gbac acedf +ecfdgab bd cadb bdg cbgdfa dbfcge bdafg efgda acbfg afbcge | bgd bd bgd dbg +aef acbefg ebcgf ecafdb degcbf fcadg afcge gaefdcb ae bage | daegbfc fgeabdc abge beag +egdc dacgf cafegd ebfgca cadfe gc gdbfa gfc dgfcaeb dacbfe | dfgeacb gc cg fgc +ebadgf acegfd ad debgfac efdba ebdcfg gbad gdfeb beacf aed | fagdbe da adgb gebcfda +gecfb ebadcf gbdcae ecg fabce gbdef fabceg beacdgf cg cagf | ceg fcegb gce dfbeg +dabcge gbdafe facbed fbacdge ecgfa dabeg bdgf fb bef fageb | bdeag bcdaef fbgd bdaeg +ac cfabe ecfbgd cbefg gbceda efcagdb edbfa bca cafg ecagfb | cgefdb cfgaebd ac edgcfba +cef abefcgd cabfe facgde cabgef agdecb fabdc fbge cgbae fe | agbec fcdabge gebf dfcega +agcbed aefgdbc ca gfabd dca abgcdf cbfa efbadg fcagd fcgde | ca cad gedfc dca +gadfcbe dc bcdag cdb dbcegf dbagce dabge gfdeab agcfb eacd | ecfgbd adce fgcdeab cead +cbafed bcefag ga aefbdcg abcef fgabcd aegc bedfg afg gaefb | gfa gdbfe acbef ecag +gdefa agedcfb gadbec fegbd gad da gdaefc cgabfe gfeca cdaf | dcgabef agd fcgea fcgea +fgcea fab cgfbae cefab ecbfd cgfdae dgefab gebdfac ba agcb | deacfbg beadgfc cgab cbga +dag dfebca gd bcdfa adbgc dfgeba cfgbad ebagc badcegf fgdc | gceab dag gd dag +gefbd aedgbf dgebcf ea aefd gea fbgae decgbaf gbafc agbcde | bgfed efad agbfe fbecgd +ebfc gfe ef ebgacfd cefdgb egcbd degfc dcabeg dfbgae dagfc | faegdb fge gefdc egf +dgefab fbeadgc gcadbe bdgcef bcgae edca cbdeg gae cgabf ae | age ae cdgbe cfdgeb +agdbf fe eabdc efd bfdaecg dbcage bfdae bdefcg cefa acbdef | fe ef efcgadb bedfacg +fcebga badecg adcef cfg cdebg cbdegf gfbd gefcd dfbaegc fg | edcbfg bfgd fceda fg +df dfgbca gfed feacb bdf bdfegc dagbcfe cgbeda bdecf ebdgc | acdbfg edfcb debcf debcf +dbc beac edfgb afdce facdbe debcf cb abdcfg gdecfa aedcbfg | eacb becdfa deafcbg cbd +gcdbfa afdceg abdfge befag gba efbgc ba cfeabgd dfaeg baed | feagb agb ba acdbgfe +gfdace ecdgafb fdegb ebdagc gb fcegd dgfbce bge debaf fcbg | bcdage egfbd gdebcf gb +bfa gface fb fabgdc dacfeb becgad bcead fbed dgbcfea eacbf | bedf beacgd gceaf caegbd +adgcb de edafgc egfba eda abecgf geabd abfged egbcadf bdef | ebfdcga ebdf ed dae +cgbed ebdgfc aebdcg bcdga efcbadg cfgab cfaged aedb da dag | bagcfed cdefgab cgdeba aegcbd +efabdg aedc cd fdcge cbdafg dcbeafg ecbgf fdgae dgcfea gdc | gdc dc aegdf dc +edgfca febgac egcfb efcgbd begcfda acg gdbea aegbc bcfa ac | bcaf fcegb bcaefdg bedfcga +ecfba bg cgdafbe cbfag cgbe aegfbc dafecb efbgad agb dgafc | bag fcbea aefcbg cegb +ebagdc fgaecd gcaefb dgceb ebfgd gcb dgfbeca bdac cb decag | cafebgd fcgdea adcbgfe cb +caedfb bdcegf dgac fad cbfdg gfabd gacdfb feabcdg da afgbe | deagcfb adf dfcgb aefgb +adgfbe ed eda dbaec bcagde egcd gacbe bfdac bagecf edfcbag | cedab bgfeda bdfac ed +abcgf cd edbag gbacd fcgd gfebca dfbgca adc bcgdafe facebd | dac fcdg gacdb dc +fagde badfe acdeg gbefacd gf bdgecf ecdgba fagc fecdga fdg | bfdgec dfg gf egcadbf +aedcfb cadeb agbecd cfda aefbg ecabgfd fbecdg bfaec fc efc | dcfa acfd dcaeb fagbe +ecbdga bacefg ea dcefb bcdae adeg dgbac fcgdba aeb cgafbde | dcbea ae cbefd aecdbg +df ecabgf fbde efgba fad dbfgca fdebga fegad cdgbfae acdge | daf agced egfba fcdbega +bfaecg gfdaebc dgec dcb baegc agdfb cd befdac bcdga cdgeba | decfab dcb cedg agdbc +gbadecf gbef gadec ebdcg bg dgb gcbfad dcfbea bfdecg fcbed | dbg dgb gb bfeg +bdfca cbdea dae ebgdfac cabedg efcbgd egdcb ae agce badfeg | dabcf dcabf dbecag cabedfg +edcafb ed aedgbc cedbf dgfbc dafe abefc deb cdfbeag bagfec | fdea ecabgd fcbgd ecfab +afbdce agc dcgf bcdag cedgfba dbgcfa bacfge gaedb bdfca cg | cbafd dcgf cg edbacf +eabfgc cfaeg cbfde adgbfc bface eagb acdbefg ab acb edacgf | ba cfdgab ab ab +egdfb dfbgaec dfaeg abgedf defcga egba feb dgbfc fabdec eb | efb eabg fbgcead aegdcfb +df fbdace gdebcf efabdcg dbf cagbfe efgd gbcda cgdfb cebfg | bgfecd aedfcgb dfbcae abcgd +ebgacf adcebf gcbaf df adbfcg bdcfega cfgbd dbf gecbd fadg | fcbga agbefdc fdb fadg +bagfe efcab cbf cbfgad abgfed faecbg begc cb daebfcg feadc | bcafe ecgb fcb cb +afdecg adbfeg cdgebf fecbgad eafc eacgd ec ceg cagbd afedg | gec ce ecfa fegdca +fgcade fbadeg abcedf ebcgf adcgfbe eca dafge ac cagd agecf | agdc cdgfae begfc geafcdb +cadbeg beagc ba afgbed cefdga bacd fecgb caedg gfebcda bag | gebacdf fcegb gdebaf ba +fbgad fcad egdab fdb cbedfg cbafedg gdcfab fd agbfc abcegf | df dfagecb gbefcd aebgcf +gbacfd ebacfd fcadb eagfbc ag adbgf cedfgab bag dfbge acgd | ga ag ag acbfgd +gebdfc fbedac efbag cdebf dg decg fbgadce egfdb dfcgba bdg | fegdb dfbec fbdacge dg +dbgfc fabcd fcegb bacdfe bgd eabdgc gd bdagfc fadg afdebgc | bcgdf dg dgb gd +aefcgdb faegcb fead edc aecbd bgcad de bfaec bdegfc afdbce | badfec cfgeab gbacef baecdf +fecdga cdgaf gba dbcafg dbfg cbfae agedcb dafgecb bgcaf bg | fdbg bgcfa dbagcf gefbdac +fea gfdbec abdf abefg edbgf bacge dcebgfa af egdabf cefadg | abfgdce dacfegb efa efa +bdgafc ebcgf bfea dgcbe abfcge egbcdaf efc gabcf ef cgdaef | fce fe fe fgbac +gadefbc dg egdcaf fdcbe caegb gcfedb dfbg gde edcbg fedbca | aebgc bfeacd cgdafbe gebdc +ec dcgfe aebgfd cagfbde fec dcgfa ebdc gebdf cbfdge ecbafg | egdbf cbegfa ebdc egcfba +dcbgf dcgeb cf dfc fgdbeac eacdfg gcdabf gafbd adfgbe bafc | cgdafb bfac dgeafc fdabg +aefbcd cadgf eacdg bgade facgbd eac ec dacegbf gfec acfged | gecf bedagfc geadc eac +egcab eagdfc egcdfb aegdf dec afcd cgead eadcfgb agdfbe cd | eafcdg cgdae aedgc dbfacge +ag bfdcge gca bgcef fgcae bagdfc egab bcdeafg afdce abcgfe | fdagcb ag egab faegc +abdfgec bgdca edcg abedgf bcd cd cgeadb fgcab dbgea dacefb | cbd dgbca gabdce dcfbaeg +eacbg gbe egacd dbecfg agedcb bg dgab edfacg cafeb fbgcaed | dgba dgab aecfb gb +fcgabe fecab fabedcg edbca bdgfce afeg efbcg dabfcg fab af | bgedfc afb baf ebgcafd +badcgf bef cgedbf fbagc ceafbdg begfa afgecb eabc egfad eb | abefcg fbgae gebafc gdcfeb +dafecg defbc fbgcae dbcg abfed gecfd ebc cgefbd cb dfagcbe | cb ceb bdcg bgcd +acgefb cae dgecbfa fcead abfdc gdcfe dbae bdcgaf ea dbface | cefdg cea eca cefdabg +fab egfda fb egbcda bgfc gafdb afdbgc dfebac gbadcef cdabg | dbcfag fb bgfad ecafdb +bgace badceg fdeacbg bedc gdebfa bge eb cdaeg dgefac fcgba | be fcabgde gdcafeb be +cg dcg gdabcfe dcgfae gcdea abgdef fgec abedc bgcafd gadef | gfdea cbead ecfg dcg +aecbfg edagc edc edcgfa gcbad gfcae gefd adecbgf bdafec de | cgaefd efcga cagef bgcaef +fedgc dafecg bcedfag agdbc dgbfec bge dbceg bcgfea be bdfe | cdgefab gdabc gbe eadgfc +eagf fcgbad edgabf cfegbd efb dbeaf decba fbgad bfedcag fe | dfbaeg ef ebf fbe +cebfag dbefgc cdgba dcgaeb dfbagce dg bgeca aged adcbf gdc | cbdegaf gefcab abcgd daeg +gafdb bdfea afbgcd fgd dgcfaeb gdbc facbg gd acdfeg efbcag | gdcb adfeb gcafb bagcef +fdaec adbcf acegfbd efbdag afcedg ea gbefdc geac cfdge ead | aegc dgcef fdcae gcae +afcbed dce fgadc gcea abfcgde dgefb ec bfagcd fadgce fcegd | efbdca bfdecag cde cefgd \ No newline at end of file diff --git a/day08/solution.spec.ts b/day08/solution.spec.ts new file mode 100644 index 0000000..74d3989 --- /dev/null +++ b/day08/solution.spec.ts @@ -0,0 +1,55 @@ +import { loader } from '../lib/loader' + +type Note = [signal: string[], output: string[]] + +const parseInput = (line: string): Note => { + const [s, o] = line.split('|') + return [s.split(' ').map((s) => s.trim()), o.split(' ').map((o) => o.trim())] +} +const example = [ + 'be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe', + 'edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc', + 'fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg', + 'fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb', + 'aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea', + 'fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb', + 'dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe', + 'bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef', + 'egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb', + 'gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce', +].map(parseInput) + +const input = loader(8)('input').map(parseInput) + +/** + * 0: abcefg (6) + * 1: cf (2)* + * 2: acdeg (5) + * 3: acdfg (5) + * 4: bcdf (4)* + * 5: abdfg (5) + * 6: abdefg (6) + * 7: acf (3)* + * 8: abcdefg (7)* + * 9: abcdfg (6) + */ + +const isUnique = (s: string): boolean => + s.length === 2 || s.length === 4 || s.length === 3 || s.length === 7 +const countUnique = (output: string[]): number => + output.filter((s) => isUnique(s)).length + +const allUnique = (notes: Note[]): number => + notes + .map(([, output]) => output) + .map(countUnique) + .reduce((total, count) => total + count, 0) + +describe('Day 8: Seven Segment Search', () => { + describe('Part 1', () => { + it('should solve the example', () => { + expect(allUnique(example)).toEqual(26) + }) + it('should solve the puzzle', () => expect(allUnique(input)).toEqual(456)) + }) +}) From 4f13440cee8b6fd6e9cc8283bd98429ef3e01972 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 8 Dec 2021 13:41:20 +0100 Subject: [PATCH 080/110] feat(day08): part 2 --- day08/solution.spec.ts | 178 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 168 insertions(+), 10 deletions(-) diff --git a/day08/solution.spec.ts b/day08/solution.spec.ts index 74d3989..c8a1fe3 100644 --- a/day08/solution.spec.ts +++ b/day08/solution.spec.ts @@ -22,16 +22,16 @@ const example = [ const input = loader(8)('input').map(parseInput) /** - * 0: abcefg (6) - * 1: cf (2)* - * 2: acdeg (5) - * 3: acdfg (5) - * 4: bcdf (4)* - * 5: abdfg (5) - * 6: abdefg (6) - * 7: acf (3)* - * 8: abcdefg (7)* - * 9: abcdfg (6) + * 0: abcefg (6) 1*, 7*, Not: 2, 3, 4*, 5, 6, 8*, 9 + * 1: cf (2) Unique + * 2: acdeg (5) Not: 0, 1*, 3, 4*, 5, 6, 7*, 8*, 9 + * 3: acdfg (5) 1*, 7*, Not: 0, 1, 2, 4*, 5, 6, 8*, 9 + * 4: bcdf (4) Unique + * 5: abdfg (5) Not: 0, 1*, 2, 3, 4*, 6, 7*, 8*, 9 + * 6: abdefg (6) 5, Not: 0, 1*, 2, 3, 4*, 7*, 8*, 9 + * 7: acf (3) Unique + * 8: abcdefg (7) Unique + * 9: abcdfg (6) 1*, 3, 4*, 5, 7*, Not: 0, 2, 6, 8 */ const isUnique = (s: string): boolean => @@ -45,6 +45,136 @@ const allUnique = (notes: Note[]): number => .map(countUnique) .reduce((total, count) => total + count, 0) +const uniquePatterns = [ + [1, 2], + [4, 4], + [7, 3], + [8, 7], +] + +const digitIncluded = ( + pattern: string, + digit: number, + configuration: Record, +) => + pattern.split('').filter((s) => configuration[digit].includes(s)).length === + configuration[digit].length + +const len = (len: number) => (p: string) => p.length === len + +const includesDigitsInConfig = + (configuration: Record) => + (digits: number[]) => + (pattern: string) => + digits.reduce((included, digit) => { + if (!included) return false + return digitIncluded(pattern, digit, configuration) + }, true) + +const notInDigitPattern = + (configuration: Record) => + (digit: number) => + (pattern: string) => + !digitIncluded(pattern, digit, configuration) + +const includesPattern = (pattern: string, inPattern: string) => + pattern.split('').filter((s) => inPattern.includes(s)).length === + pattern.length + +const includesDigitPatternInConfig = + (digitPattern: Record) => + (digit: number) => + (pattern: string) => + includesPattern(pattern, digitPattern[digit]) + +const wireConfiguration = ([pattern]: Note): Record => { + const digitPattern: Record = {} + const includesDigits = includesDigitsInConfig(digitPattern) + const not = notInDigitPattern(digitPattern) + const includesDigitPattern = includesDigitPatternInConfig(digitPattern) + + // unique patterns + for (const [digit, length] of uniquePatterns) { + const p = pattern.find(len(length)) + if (p !== undefined) { + digitPattern[digit] = p + } + } + // Nine + const nines = pattern + .filter(len(6)) // has 6 segments, + .filter(includesDigits([1, 4, 7])) // and includes segements for 1, 4, and 7 (which are all unique) + if (nines.length != 1) + throw new Error(`Unexpected number of candidates for 9`) + digitPattern[9] = nines[0] + + // Zero + const zeros = pattern + .filter(len(6)) // has 6 segments + .filter(not(9)) // but is not 9 + .filter(includesDigits([1, 7])) // and includes segements for 1, and 7 (which are all unique) + if (zeros.length != 1) + throw new Error(`Unexpected number of candidates for 0`) + digitPattern[0] = zeros[0] + + // Six + const sixes = pattern + .filter(len(6)) // has 6 segments + .filter(not(0)) // but is not 0 + .filter(not(9)) // but is not 9 + if (sixes.length != 1) + throw new Error(`Unexpected number of candidates for 6`) + digitPattern[6] = sixes[0] + + // Three + const threes = pattern + .filter(len(5)) // Has 5 segments + .filter(includesDigits([1, 7])) // includes 1 and 7 + if (threes.length != 1) + throw new Error(`Unexpected number of candidates for 3`) + digitPattern[3] = threes[0] + + // Five + const fives = pattern + .filter(len(5)) // has 5 segments + .filter(includesDigitPattern(6)) // The pattern of 5 must be included in the pattern for 6 + if (fives.length != 1) + throw new Error(`Unexpected number of candidates for 5`) + digitPattern[5] = fives[0] + + // Two + const twos = pattern + .filter(len(5)) // has 5 segments + .filter(not(3)) // is not 3 + .filter(not(5)) // is not 5 + if (twos.length != 1) throw new Error(`Unexpected number of candidates for 2`) + digitPattern[2] = twos[0] + + return Object.entries(digitPattern).reduce( + (wireConfig, [digit, pattern]) => ({ + ...wireConfig, + [pattern]: parseInt(digit, 10), + }), + {}, + ) +} + +const outputValue = (note: Note): number => { + const config = wireConfiguration(note) + return parseInt( + note[1] + .map((pattern) => { + return ( + Object.entries(config).find( + ([p]) => p.length === pattern.length && includesPattern(p, pattern), + )?.[1] ?? 0 + ) + }) + .join(''), + 10, + ) +} + describe('Day 8: Seven Segment Search', () => { describe('Part 1', () => { it('should solve the example', () => { @@ -52,4 +182,32 @@ describe('Day 8: Seven Segment Search', () => { }) it('should solve the puzzle', () => expect(allUnique(input)).toEqual(456)) }) + describe('Part 2', () => { + it('should solve the example', () => { + const sample = parseInput( + 'acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab | cdfeb fcadb cdfeb cdbaf', + ) + const config = wireConfiguration(sample) + expect(config).toEqual({ + acedgfb: 8, + cdfbe: 5, + gcdfa: 2, + fbcad: 3, + dab: 7, + cefabd: 9, + cdfgeb: 6, + eafb: 4, + cagedb: 0, + ab: 1, + }) + expect(outputValue(sample)).toEqual(5353) + expect(example.map(outputValue).reduce((sum, s) => sum + s, 0)).toEqual( + 61229, + ) + }) + it('should solve the puzzle', () => + expect(input.map(outputValue).reduce((sum, s) => sum + s, 0)).toEqual( + 1091609, + )) + }) }) From 274098f1ac6878274a796b58bebaf899b2a53885 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Thu, 9 Dec 2021 08:31:20 +0100 Subject: [PATCH 081/110] feat(day09): part 1 --- day09/input.txt | 100 +++++++++++++++++++++++++++++++++++++++++ day09/solution.spec.ts | 55 +++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 day09/input.txt create mode 100644 day09/solution.spec.ts diff --git a/day09/input.txt b/day09/input.txt new file mode 100644 index 0000000..9947a9b --- /dev/null +++ b/day09/input.txt @@ -0,0 +1,100 @@ +5678998989432198943298876799876586789998999434988989999876544345789987654545678931299765458679432456 +4556987678949987899097655679767345678987898949876579899987432134889987653237889542989654323488921347 +3245696569298765678976544598653234567896567899885467799876598245678998542126898769878943212367892356 +7656789689019654569895432987743125678923456998764345689987987656789987632015789998767932103456789969 +8767898789298965698789321296532012789912367897651234993398999867897898543234567897657899344868999898 +9898909899987976987679434987432123567893458976543349892109234978935987654945678956545888956779019787 +2999312999876899876548976798543256798954578987985498789290125989124698878876789545434677897892197656 +1098929989765678987537897899674345689765989299876989687989234998995789989989895432123456998999976545 +2987898763234567895426899999965457999879999101999878576978949876789891096593987643034587899698765434 +3496987654345979971015678989876598943989898999998765465767898765678992987432398854234567934569876745 +4985499795659898965434599575989699432396797878999874323456789654567989989321239954346789123456987659 +9875324989798787896545789434798789101234986767899983212345896543459878976310198765457991014569999868 +9766219878989656789659897321679893212379875456798432101236998532598767895421239876678962195998941979 +9854398768878968998767896432567954523459864323987543212456897431999656789532345987789653979896532989 +8765498656867978979898998543459995745569876434598798654567896569898545678945478998999969867789549899 +9876986545457899656979999876598989856978987945679898767878987798767634599999567899019898656678998789 +9989978432345898789767899987987679997899199896789979878989498987656424989987678999198776547578999678 +8998764321256789995456789999976567989921099798996568989595349998843213577898789878998652123469996578 +7987653210127897654365898998765465678932989699765439995430157898632102356999896569986541012345987989 +6398865432238976543234567899901234567899876587996549899321298976543214467899954398997632123657898994 +5219976554349899432129698999893345678998765346789659798932349998654323578999876497989543234567899543 +4323987665656798921098989998789556989987654223878998687893499969875987679987988986578994547678978932 +9495999877897987892987878987678967898998743012567896546979987855987898789876599965489789659789459891 +8989892998999876789976567897567998957989432123456985434569756234598939898765498744345699967891298789 +7678793459998965678975456976456789549876543254569876324598542123459329999654399534234898898999987678 +6547689567987854769894345994347695434987656767878987765987643044678998998765987620123456789998976567 +2134578979876543456789234789234589323698787878989998987896543235799987989976798731245977898987894348 +1023456798989874767890125696345678934569898999598999199987654376789876476799987654356898987656791239 +2434587997898765889931459895456989545679999545457889298998775479898784345678998767487929876545789545 +3679679876779976789432345796587997656798789432345678987989986567987673234789769876598934987656899696 +4598798785669899996543456998798998787989699421234567896767897678976543125898654987679875898967998989 +5689987674357698999876567899899899899876568994365898965658998789985432016789543298789876789878987977 +6898998543234567899997878965956789921965434589456789984347899899876543123895432109897989898989995456 +7987899932123456789398989954345997899875325678987896543256789976987754544789549212976799997699984378 +8996998761014767891239997896456896898765456789198987632149899965599865765678998999765678986569876467 +9965987654145678910949876789587965789876567991019996543234999843479876878989576788974599875454987678 +7894398743234599999898765678998954678987878992398897755345898764567987989995435567893987654323499789 +6989219894346789987769989789989563867999989989987789976456789879679998999876323467932198763212599890 +5678923998456799976545699899876432345693299979876667896597999998998999998987212348942019874343989921 +4567894986568897895434567921987321276789129864985456997678999987897999987658301239953198765454678934 +3656789997679936789323989210995490987899298743234357898789878546786789876543212367893239887565789995 +2345678998789325679999898929876989898998987654101256789898765435545678987665325456789357997676799989 +3476789019995434569878787899989978789997987643214347999999854321236789898775434567895467898789989878 +4567892129876765698765676789998767679876987654765656789998763210145698769887655698986578969899878767 +5688943436987986997654565678987654598765498769876777899989954321234789656998767899987699656998766456 +7899894545698999876543234567896543987654329989987888989679895452345678946989878957899988997987654345 +9956789656789123987632123479987659876543213597898999876565789667458789239878989745987567689998765456 +2345678967894234696541014578898767998632101456789767987434578978569890198767897659986456578909876567 +3456789878954356986532123456789878996543212347890345898323467999998932987656789798765343469219989878 +4567896989996969897543234587990989987654323456921256789212356989897949876545678999973212458998596989 +8689965699989898798656945678991399898785434567892345892101249876786899865434567899865393567967445698 +8792123989876767679987898789789989789897545679953556789234598765645697654323798999976989998953234567 +9893439876565654567898989897678976567998976789767787896545987543234789763212346789899877899762146788 +1999598765434123456999878978567985445879987899879898987657998652101679654101235898765766794321017899 +2398987654321014567894569865379876234567898999989999698769876543213568969233346789654545689987634799 +9987898998432123798923498765456989445789999998993987569899989984623479598944567896543234568976545678 +8765659996543235689212349878579876556895698987894595456989999876534689457899698965432124589987678989 +5434347987656345678901656987689987667894987656889696579878989987678994345678969999943012679799889998 +6521236798965456789892997899893198789989876645678989698769878998789101234589456987899323569654999987 +7632345899878569898799789910999099895469985434569878997645568999893214456678967965678954578967998976 +6543656901989689987687678921398987994398996945698969876431467989965323467889899876789995678979876765 +7654567899798799976546469892987856789987889896987654986542349878976545578996791987899989789998765434 +8765678978669899865435346789896543899765678789998743297656598967897767899545932398999878999987654321 +9889889765554987654321234599787012987654885678987654198787987656899898989959893999989656798999766432 +6998999984323498765634345987652123498753234569988621019899876547999979569899789899877545987899997949 +5656789993212549876765678999543934995432123458976542323999987656898763456798656789765434876789989898 +3245678995301234987876789987659899876541012367897643434589998867897652367987545679654321345899876767 +5346889876418345698997895698998767987632123456789656565678939978998743489876434599865632346989765656 +6757895987567896789298994349898657898743246577898969996799320989987654578987645689976543559876534345 +7878934599678987892129789656798745569854768688957898789978999999898965789998786792987654667987621234 +8989321698789998943345678969959433498769879799346789698767688998789896999979897891099788789599732345 +9399934789899999874456989298743212349899989890123699545654567987678797899765998999988999995498543456 +1239895698999889965569890129654101257999897921234568932343879876587689999854349998877989654397654767 +3398789987898779897698789298765233398998765434345678921012998765434567899873234987765678965298765878 +5497679876789657789987678999874345479999876845456989532323459764323456789984749896584567994349896989 +9986545985698745678998545899985456567899987656567896543456798765436578999875698785323456789956997891 +8765439876789434567899676789876567898989998787898987654578899877748789854976987654212345679897989930 +9854323987896567678998787898998678959678999898999498767999901987659899765987998765401256798769878921 +9965214598987679789799898997679789344569989969894329898999892398767978979998999878919347987656767932 +9876329699998799897689999999569896103498767456789212959998789999898956798939389989898959876545658993 +3987898989899899954599987878979975212997656345892101345894569889999345987821278998767898765434545689 +2198987676799989323989765468998764329876543234789292456793298767893239876710367987656797654323434578 +3999997545989878939878954359899765478987832145678989667894987656789123985321459977645498967410123467 +9889998659878967899867895456789876569998953256899679998965976545993239876432598766532359978823234589 +9775879769767456798756789767898987878999866367996567899876987636789998987543679854321267898764345699 +8654569898659345986545678978987898989398765456789456999987898747898767987654678965432878929875456789 +8743453986545239875434567899876789999219876567894347898998999898989654599865679876543989434986578999 +9432012987432129854323456789765898998723987678989256987899298969678913479876789987767998745797989378 +6543123497654098765212345678954767896545698989879129876789197654599904567989894398979997656998990165 +8656934598843259876323467989653457997959789698768998695778986543489895989199965219497998797899989234 +9879899789654348985434578999942346789898994599545986434569999642376789891019876101356989989987678946 +9998778998765467897665689678799457898767895987439876545678998921235679792198989212349879978998567897 +9897669899989878998786789545678968998656789876545989656789987892346895679987654323498768967899456789 +8789456789999989659887895434567899876545457987676798767899876789457893568999876654599545656789577897 +7678345678999896543998976125678923965432346798787899879954965878967932477899987765987434346899789956 +8543234567898765432159876546789019876553456899898965989965954767898921276789998879876521235678993234 +8732145678969876643345987657893247987864579965999754296899843459899632345899879989987432346789210123 +9543234689654987754456799768985356798977678954987653124989752576789543656946965399876545457894321234 +7687657995323499767569894978976467899398789432098764349876641345689654568939873212999856567965432345 +8798767897435679898989943989989878910239896545139975668965432456799767899123982101298767878978644567 \ No newline at end of file diff --git a/day09/solution.spec.ts b/day09/solution.spec.ts new file mode 100644 index 0000000..2444461 --- /dev/null +++ b/day09/solution.spec.ts @@ -0,0 +1,55 @@ +import { loader } from '../lib/loader' + +const toHeatMap = (map: string[]): number[][] => + map.map((s) => s.split('').map((s) => parseInt(s, 10))) + +const example = toHeatMap([ + '2199943210', + '3987894921', + '9856789892', + '8767896789', + '9899965678', +]) + +const input = toHeatMap(loader(9)('input')) + +export const findLowPoints = (heightmap: number[][]): number[] => { + const lowPoints: number[] = [] + + for (let y = 0; y < heightmap.length; y++) { + for (let x = 0; x < heightmap[y].length; x++) { + const point = heightmap[y][x] + const up = heightmap[y - 1]?.[x] ?? Number.MAX_SAFE_INTEGER + if (up <= point) continue + const down = heightmap[y + 1]?.[x] ?? Number.MAX_SAFE_INTEGER + if (down <= point) continue + const left = heightmap[y][x - 1] ?? Number.MAX_SAFE_INTEGER + if (left <= point) continue + const right = heightmap[y][x + 1] ?? Number.MAX_SAFE_INTEGER + if (right <= point) continue + lowPoints.push(point) + } + } + return lowPoints +} + +export const riskLevel = (heightmap: number[][]): number => { + const lowPoints = findLowPoints(heightmap) + return lowPoints.reduce((sum, level) => sum + level + 1, 0) +} + +describe('findLowPoints()', () => { + it.each([ + [['000', '000', '000'], []], + [['111', '101', '111'], [0]], + ])('should find low points in %j to be %j', (map, expected) => + expect(findLowPoints(toHeatMap(map))).toEqual(expected), + ) +}) + +describe('Day 9: Smoke Basin', () => { + describe('Part 1', () => { + it('should solve the example', () => expect(riskLevel(example)).toEqual(15)) + it('should solve the puzzle', () => expect(riskLevel(input)).toEqual(498)) + }) +}) From 1e2141512e095b2bdea18d0a6211356bbe3ad6bf Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Thu, 9 Dec 2021 09:14:35 +0100 Subject: [PATCH 082/110] feat(day09): part 2 --- day09/solution.spec.ts | 113 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 105 insertions(+), 8 deletions(-) diff --git a/day09/solution.spec.ts b/day09/solution.spec.ts index 2444461..9368fd4 100644 --- a/day09/solution.spec.ts +++ b/day09/solution.spec.ts @@ -13,35 +13,114 @@ const example = toHeatMap([ const input = toHeatMap(loader(9)('input')) -export const findLowPoints = (heightmap: number[][]): number[] => { - const lowPoints: number[] = [] +type Point = { + level: number + x: number + y: number +} + +export const findLowPoints = (heightmap: number[][]): Point[] => { + const lowPoints: Point[] = [] for (let y = 0; y < heightmap.length; y++) { for (let x = 0; x < heightmap[y].length; x++) { const point = heightmap[y][x] const up = heightmap[y - 1]?.[x] ?? Number.MAX_SAFE_INTEGER - if (up <= point) continue const down = heightmap[y + 1]?.[x] ?? Number.MAX_SAFE_INTEGER - if (down <= point) continue const left = heightmap[y][x - 1] ?? Number.MAX_SAFE_INTEGER - if (left <= point) continue const right = heightmap[y][x + 1] ?? Number.MAX_SAFE_INTEGER if (right <= point) continue - lowPoints.push(point) + if (left <= point) continue + if (up <= point) continue + if (down <= point) continue + lowPoints.push({ + x, + y, + level: point, + }) } } return lowPoints } +export const flood = ( + heightmap: number[][], + lowPoint: Point, + basin = [lowPoint], + endLevel = 9, +): Point[] => { + const { x, y } = lowPoint + const up: Point = { x, y: y - 1, level: heightmap[y - 1]?.[x] ?? endLevel } + const down: Point = { x, y: y + 1, level: heightmap[y + 1]?.[x] ?? endLevel } + const left: Point = { x: x - 1, y, level: heightmap[y][x - 1] ?? endLevel } + const right: Point = { x: x + 1, y, level: heightmap[y][x + 1] ?? endLevel } + + if (up.level < endLevel) { + if (basin.find(({ x, y }) => x === up.x && y === up.y) === undefined) { + basin.push(...flood(heightmap, up, [...basin, up], endLevel)) + } + } + if (down.level < endLevel) { + if (basin.find(({ x, y }) => x === down.x && y === down.y) === undefined) { + basin.push(...flood(heightmap, down, [...basin, down], endLevel)) + } + } + if (left.level < endLevel) { + if (basin.find(({ x, y }) => x === left.x && y === left.y) === undefined) { + basin.push(...flood(heightmap, left, [...basin, left], endLevel)) + } + } + if (right.level < endLevel) { + if ( + basin.find(({ x, y }) => x === right.x && y === right.y) === undefined + ) { + basin.push(...flood(heightmap, right, [...basin, right], endLevel)) + } + } + // Remove duplicates (FIXME!) + const uniquePoints: Point[] = [] + const basinMap = basin.reduce((basinMap, { x, y, level }) => { + if (basinMap[y] === undefined) basinMap[y] = [] + basinMap[y][x] = level + return basinMap + }, [] as number[][]) + for (let y = 0; y < basinMap.length; y++) { + for (let x = 0; x < basinMap[y]?.length ?? 0; x++) { + const level = basinMap[y][x] + if (level !== undefined) + uniquePoints.push({ + x, + y, + level, + }) + } + } + return uniquePoints +} + +export const findBasins = (heightmap: number[][]): Point[][] => { + const lowPoints = findLowPoints(heightmap) + return lowPoints.map((lowPoint) => flood(heightmap, lowPoint)) +} + export const riskLevel = (heightmap: number[][]): number => { const lowPoints = findLowPoints(heightmap) - return lowPoints.reduce((sum, level) => sum + level + 1, 0) + return lowPoints.reduce((sum, { level }) => sum + level + 1, 0) } describe('findLowPoints()', () => { it.each([ [['000', '000', '000'], []], - [['111', '101', '111'], [0]], + [ + ['111', '101', '111'], + [ + { + x: 1, + y: 1, + level: 0, + }, + ], + ], ])('should find low points in %j to be %j', (map, expected) => expect(findLowPoints(toHeatMap(map))).toEqual(expected), ) @@ -52,4 +131,22 @@ describe('Day 9: Smoke Basin', () => { it('should solve the example', () => expect(riskLevel(example)).toEqual(15)) it('should solve the puzzle', () => expect(riskLevel(input)).toEqual(498)) }) + describe('Part 2', () => { + it('should solve the example', () => { + const basins = findBasins(example) + expect(basins).toHaveLength(4) + basins.sort((b1, b2) => b2.length - b1.length) + expect(basins[0]).toHaveLength(14) + expect(basins[1]).toHaveLength(9) + expect(basins[2]).toHaveLength(9) + expect(basins[3]).toHaveLength(3) + }) + it('should solve the puzzle', () => { + const basins = findBasins(input) + basins.sort((b1, b2) => b2.length - b1.length) + expect(basins[0]).toHaveLength(105) + expect(basins[1]).toHaveLength(102) + expect(basins[2]).toHaveLength(100) + }) + }) }) From 4ebd524913b13eaa6a522ee94109e80410981930 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 10 Dec 2021 14:03:42 +0100 Subject: [PATCH 083/110] feat(day10): part 1 --- day10/input.txt | 106 ++++++++++++++++++++++++++++++++++++ day10/solution.spec.ts | 118 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 224 insertions(+) create mode 100644 day10/input.txt create mode 100644 day10/solution.spec.ts diff --git a/day10/input.txt b/day10/input.txt new file mode 100644 index 0000000..e2c0770 --- /dev/null +++ b/day10/input.txt @@ -0,0 +1,106 @@ +[<([((<(<<{{{[{}[]][<>{}]}[{[]()}{[]<>}]}<({(){}}<()<>>](<{}<>><[]<>>)>}<<[<<><>>[()<>]]{({}<>) +<([{<<{[{{{[[{{}[]}(<>[])]{[[]<>]>]<[[<><>]([]<>)]{<{}<>>{{}<>}}>}[<((<>())[[]{}])>[<{[][]}<{ +[{{[{([[[[{[{((){})(()<>)}{([]())}][(({}{})[[]()]){(<>{})<()<>>}]}][[{<{[]{}}[{}()]>[[{}<>](<>{})]}[ +[{[<[(([{[<(<{{}{}}([]<>)>)>([[[[]{}]<(){}>](<{}[]>[[]{}])]({<{}{}>}<{[]()}([][])>))]}{{[[[<[]{}>([]())]{{ +{(<[<{(<[(({([{}[]]({}{}))<{()[]}([][])>})([[<{}[]>([])][<[]{}><<><>>]][[<<>[]><(){}>](({}{}){<>()})])) +<{(<[[([[[{<[({}[])<()()>]>}[[{<<>()><{}()>}[<<>{}><[]<>>]]]][(<({[]}([][]))><(<{}{}>){({}())[[]{}]}>){[[ +(<(<(((<<{[<[{[]{}}({}{}>]><[<()<>><{}{}>][{()<>}({}())]>]}({<[[[]()]{[]<>}](<[]<>>([]<>))>[{(<><>)([][])}] +<{[[{({<([[<{(<>())[<>[]]}><({[]{}}<<>>)[((){})[[]()]]>]]({<<(<><>)[{}<>]>{[{}{}](()[])}>([([]<>){() +(((<{{{{<<[<([[]<>])({()<>}[{}<>])>(<{<>()}>{[{}<>]})]><[[([[]{}]{{}()})(([]){(){}})]{[{<>{}}<<>{}> +[{((({[[([[[{{[]<>}(<>[])}[([]{})([][])}]<[(<><>){[][]}]{<{}{}>(()())}>]]<([<{{}()}{{}<>}>[( +{(<{[[{(<[[{{[(){}](()[])}}<[(<>{}){[][]}]{<<><>>{{}()}}>][{{{()}<()()>}{<<>()>(()[])}}]]>[{<({[<> +(([([([(([<([([][])<()()>]<({}()]({}())>)>{[{<[][]>(<>{})}<{{}{}}(<>{})>]<{([]())(<>{})}[{<>{}}[()()]] +{<<<{[({(<({(<{}()>){[<>()](()<>)}})<[<{()[]}{<><>}>]{[[(){}]({}<>)][<<>{}><{}<>>]}>><(([<{}[]>(<> +{[[([[([{[(<<(<>[]){{}}><([]<>)<()<>>>><([(){}](<>{}))[{[]}<{}<>>]>)][{{(({}())[[]{}])}{([()<>][[]<>]){<[][]> +{([{(({<<{<{{(<>())[{}{}]}{(()[])[[]<>]}}>}>[<{(<[[]()]<{}()>>)<{((){}]((){})}[[{}]([]{})]>}([({ +(([(<({[<({{<{<>[]}<<>{}>](([]()))}<(<{}()>(<>))<((){})[<>{}]>>})({[[<()<>>][<()<>>[<><>]]](({ +<<((<<{[{(<<<{{}{}}[{}<>])(<<>()>[[][]])>>([({()[]}[<>{}]){[{}<>]{()<>}}]{(<{}{}>[<>[]])[{<>[]}<[]{ +([{(<<{{<{<<<<()<>>([][])>(([]()){()})><{[{}()]{<>{}}}<{()<>}<()[]]>>>}{<<<{()}((){})>[[{}()][<>]]>>[ +<[(<<<([{{{((<()>(<>{}))<([]<>)(<>())>){([(){}]<()()>)}}{{[[()[]](()<>)]{(<>()){()()}}}<[({}()){[]<>}][<{}[ +(<{{({({({[{([()<>])[{<>{}}]}{<([]())[[]<>]>([()()]{[]<>})}]{(<[{}()]<<>()>>[<<>())<()[]>])[({()()}[[] +<({<({[{(({{{<{}()>[(){}]}{({}<>)<[]{}>}}<<<{}[]>([]<>)>[(()())[()<>]]>}<(<[[]{}]([]())>([(){}]<[][] +{(((<(<{{{<[[{[][]}]<{[]{})[{}()]>]<[<{}<>>][[[]()](()<>)]>>}([([{{}[]}[<>[]]][(<>{}){[]()}])({[{}[]][<> +{{({(<{{(([<(<()<>>{(){}})>[<{()()}[<>{}]>[<<>{}>{[][]}]]]({{<<><>><[][]>}[[<>()]<[]()>>}<<(()())[[]<>]><{< +<{(<([{[{<[[[(<>)({}{})]]((<()<>>))]{{{(()<>)([])}}[{{{}()}{<>[]}}[{[]{}}{<><>}]]}>}][<[<[<[(){}]><({}[])<<>{ +<({[[<<([(<{[<[]<>>[{}<>]](({}[]))}{{[{}<>]}([[]{}]([]{}))}>[[{<[]<>)<{}>}{{(){}}{()}}]([(<>{})]<<[]()> +{(([{<{(((<<<(()[])([]())>[<<>{}>({}[]]]>>[[([[]<>]<{}[]>)<[<>[]]{(){}}>][((<>[])(()[]))]]))(([{<{<>}{{}<> +<[((([<{{([{({<>{}}(<><>)){([]{})<()[]>}}({[[][]]([]{})}({[]<>}))][<<[<>{}]([][])>(<{}<>>[( +<[{{[{{<{[[([<<><>>]{({}())([]<>)})]]}[<({([{}{}]{[]})({()()}[(){}])}[{<(){}><{}[]>}])<[[<[]{}> +(<(<{<{<{([([<<><>>]({[]}[()[]])){<{<>()}<()[]>>[([]{}){{}[]}]}]{{({[]()}{<><>})([{}()](()()))}<[<[][]>][<[] +{[{{<[(<(<{<{{<><>}{{}{}}}([()()])>[<<{}>[()()]>[[()()]{[][]}]]}>)[<<<<<[]()><(){}>>[[<>()]<{}{}>]>[{{ +([{(<({((([<(<()()><[]()>)({{}()}{<>()})>{[({}[]){{}[]}]{{{}()}{{}<>}}}])(<[{((){}){[][]}}([[]()])]{<{()<> +((<<[{<[(([({(()<>)[{}{}]}{<{}[]><[]<>>})<[<()>]([()<>])>]{((<[]{}><()<>>)<{{}><<>>>)[(<{}()>)<[[]()]( +({<([[<{[{[[{{{}<>}({}())}<[<>()][{}[]]]][[{[]<>}]<([]{})[{}()]>]]}]([{[(<[]{}>[{}[]])]}]{((<[{} +<[(<{<[<<({<<{<><>}(()())>)}{(({(){}}){[{}[]]{{}{}}})})>>]>}<[<{(<<[(<()<>>[[]()]){{{}<>}<[][]>}][(<( +({([(<{[{[{<({<>{}}<()[]>)>{[(<><>){{}<>}]}}]}]}[([[{[[[[]{}]][([][]){<>{}}]][[{[][]}(<>[])] +[<([<[([[{{({{<>{}}[{}[]]}([()()]({})))((<(){}>)([[]())({}<>)))}}]])]>{<<(({{<[<{}[]>[()<>]]>}}([[{({}<>) +<{[{<[<([{(<{<<>{}><<>()>}[(<>[])[<><>]]>[(((){}))<(<>){{}[]}>]){(<({}{})[{}{}]}<<[]{}><{}<>>> +{[[{<{[<<<(<<(<><>)<[][]>>{[<>{}]{()<>}}>{{{[]<>}<<>()>}}){(<{<>()}(()<>)>{{{}[]}(()())})]>>({(([<{}()>([]{ +[<({(({<<{<<{<<>>{<><>}}((<>{})({}()))>([({}())([][])][{{}{}}<[]<>>])>}((<<<(){}>{{}()}>[{<>()}({}{ +<([[[{[(({([{<()<>>}]{(([]<>)[()<>])}){<[{()()}[<><>]]([<><>][{}[]])>{({{}{}}){<{}[]><<><>>}}}}{<({<()<> +<[<((<[[<({{[{<><>}{{}{}}]{<{}{}><(){}>}}{{[[]{}][<>[]]}([<><>][{}()])}}({{{<>()}<<>{}>}([{}]{ +{[(<({[{<<{<{{()[]}({}())}{{{}()}<()>}>[<([]{})<<>{}>><{{}()}{{}{}}>]}<{({[][]}{{}[]})}<<{<>{}}[[][]]>>>> +<{[<([(<<([[(<[]<>><{}()>)<({}<>){(){}}>]]<<[(<>{}){{}<>}]([[]{}]({}{}))>>)>{[{[<<[]><{}<>>>(({}{})) +{(<<{{{((<<[({[][]})[([]())(<>{})]][((()<>)([][]))}><([[()[]]]){<<[][]>><<{}[]>[(){}]>}>>[([{[[]< +<{(<<<{{((<{{<{}()>[<>()]}({<>{}}[(){}])}[{({}<>)(()[])}<{(){}}<{}{}>>]>{{[[[]{}]<[][]>]{[{}{}][[]<>]} +{(<(<([{<([<{{<>}<<>{}>}{<()[]>[[]()]}>{<[()()]({}{})>((<>{}))}][{<{[]}[[]()]>{{<>}[[]<>]}}({<<>{}>[[][]]}{< +{((<[<<[{<{[{{{}<>}}<[<>()]([]())>]([<()()><()()>]{[()<>]{[]()}})}<{([[]()]{<>})}(<<[]{}}{[][ +[{{{<<<[{[(<[{[]{}}{(){}}}(<()>[[][]])>{{(<><>)<<>()>}<<<>{}>(())>})]{<(<<[]()>({}())><[{}<>]{[]()}>)>< +{{[[[({((({{({{}()}<()()>)}{(<{}{}>{()<>})[(()<>)<<><>>]}}<[<[{}[]][()<>]>[[(){}][()()]]>{<{<>[]}[ +[<[([{[{[{[{({(){}})}[[<[]{}>{<>()}]]]<[<{<>()}[<><>]>[{<>[]}<()()>]][<{[]{}}({}())>{<[]()>{{}()}}]> +<([{({<(({<{<[[]{}]({}[])>[[<>[]]<<>[]>]}>}{(({(()[])[[]()]})<[[{}<>][<>{}]]<[[]()]([])>>)}))[([[([([][])[< +{<{[([(({<(<{{<>[]}[[]<>]}<(<><>)[[]{}]>>{{{{}()}((){})}))<[{[{}{}]([]{})}{([]())(<>{})}][<(()[]) +([[[([<[[{{((<{}{}>(<>()))[({}[]){<>{}}])}}[[(({{}{}}(()[]))<[<>{}]<()<>>>)]<({<()<>>}{{{}<>}{( +(<([{[{<[{[<<<{}()}{{}<>}>({(){}}<[][]>)><{<<>[]>((){})}>](<([()()])[([])({}{})]>[[<{}[]>(<> +([(<{<([{{[[[({}{})[(){}]]]([(()<>)[<>[]]][<{}{}>])][<[<<>[]>[(){}]][[{}[]](<>[])]>({{{}[]>([]{})}[{[][]}[{} +{<[(<[({[<({[({}[])]<{{}<>}[{}()]>}<{{{}{}}[[]]}<(()())[[]<>]>>)>{[{[(<>{})[<>{}]]<({}<>)((){}) +{[{[<<<[([[[<{[]{}}[<>()]>(([][])({}[]))]<[[<>()]{<>()}]<[()[]]{[]()}>>]](<{<[()[]]>{({}{})}}(<<[]<>><[]<>> +({[<{{<<({<(<[{}{}]>)[(<{}{}>[[]{}]){<{}()>{<>[]}}]>(({<<><>><<><>>}({[][]}))[[{{}}([]{})]])}[({(<{}[]>{()<>} +({{{{{{[<[<([([]){{}[]}][([]{})])(<([]{})(<>{})><[<>](()())>)>{(([[]()](()())))}]{[[({()[]}{<>( +(({{[<[[[((<{(()<>)[[]{}]}([[]()]{<><>})>))((<{{(){}}(<>())}(<<><>><[]{}>)>(({()()}[{}[]])))<([<<>><()[]>])< +<[[{<({[((<<({{}()}{<><>})<<()[]>[{}()]>>><(<[[][]][()]><[()[]]>)>>){{<((({}<>)(()))(<{}()>) +{<{[([{<{<([{[<>{}][{}{}]}[([]())[[]<>]]]{([<><>]<<>{}})}){[(([][]){<><>}){<<>{}>[()[]]}]<(<()()>{{}})<([] +<{<{<([[[[{[({[][]}<[]{}>){[<>{}]{[]}}]}([[(<>[])][(<><>)<<>{}>]]<([()<>][()()])[<[]()><<> +(<((({{{<([{<[()()]{[]()}>[{{}{}}[()[]]]}]{[(<()<>><[]{}>)<<{}()>[<>[]]}]([[()()]]{(()<>)})}){<{{({}())( +[[[[(([{[(((((<>()){{}{}})(<[]()>({}<>)))<<<()>([]>>((()<>)[<><>])>)([[<()[]><{}()>]{{[][]}([]< +[[{([(<((<[[(([]<>)({}[]))<(())>]]>))>(<([[<{((){})<<>{}>}>{{<()()>[<>[]]}([[]{}]{[][]})}]])[<[< +((([[(<(<[<((<{}()>({}[]))<<<>[]>[()[]]>)([((){})({}())])>][<[(<()()>{{}{}}){<{}<>>{()[]}}]>{[{{{}( +{<(([((<[({<<{<>[]}[[]()]>>([<{}{}]({}())]([()()]<{}<>>))}({[<()()>{[]{}}]((()<>)<()()>)}))([<[[<><> +<[{[<{({([{([({}<>)({}{}>])<([{}{}][()[]])<([]())>>}[{<(<>{})((){})><[<><>](()[])>}<<{<>{}}([])><({}( +({{<<<(([<{<<([]<>)[<>]][{[]{}}{(){}}]>{(({}{}){()<>})}}[({<{}()><(){}>}{([]{})[<>[]]})<[{<> +(<<(<[({[<({<<()<>>({}<>)>})<({<()()><{}{}>}[{(){}}[<><>]]){(({}())<{}<>>)<<(){}>({}<>)>}>>((((<< +[{{{({[{([<<<(<><>)<{}<>>>{{[]()}[()[]]}>{[<<>{}><<>[]>]{[[]{}][()<>]}}>{<<[()<>]><([]{}){<><>}>>[{{{}()}{()[ +[[{{(<[[{<<[<[{}{}][{}{}]>>({[(){}]<{}{}>}(((){})[<>[]]))>>}((({<(()<>){{}{}}>{<()[]>[{}[]]}} +(((<{{<{[<<[{{[][]}{[][]}}]{[{[]<>}{()}]}>{{[[[]<>]<(){}>]<[[]()][[]()]>}[<<[]<>>(<>}>{(()<>)<()()>}]}>[ +([[{[({{{{[(<<()<>>(<>[])>[(()())<[]{}>])]<{{(<><>)(()<>)}([<><>]<(){}>>}>}[<{({(){}}<()<>>){(<>< +{({<{[(<{(({<[[]{}](()())>(((){}))})<(<{<>()}<{}>>{<()()>([]{})})([[<>[]]{[]()}][{<>[]}[{}[]]])>)<{<(<{}()> +{(({[{<{<({{(<[]{}><{}()>)[{{}<>}]}})(<{([()()]{()<>})<{<>()}<[]()>>}<([()[]]([]{}))<{{}{}}<<>[])>>>{({[[]{ +<<{{([([[[{<{[<>()]]>{<[[]{}]((){})>{{<>{}}<{}<>>}}}{{{<<>{}>({}<>)}[<(){}><{}()>]}([<{}<>>(<>[]) +[{<[<{{{{<({{<{}()>{{}<>}}})[(<{<>[]}{<>()}>[(<>())<()>])<<{()[]}<<>()>>{([]<>>}>]><({[[{}[]] +[{{<(<({(<{[<[<>[]]{()<>}><(<>[]){{}}>]{<<<>{}>[<>{}]><[[]<>]{<>()})}}>)}[[({{<[()()][(){}]>((()[])( +[[[[[[[[<<([<[()[]](<><>)><(<>[])<<>{}>>])><{[<<<>{}><{}()>>({[][]}<[]{}>)]([{<>()}{{}[]}]{{{}{}}{[]()}} +<(((<(([<{(<[[[][]]{()[]}]<(<>{}){[]{}}>>)}>]))[({[<<{(<()[]>([]<>))[<()[]>{()[]}]}<([<><>](<>[]))((<>() +<{{{<{{{[[{([({}{})<[][]>]<[<>{}]{<>()}>)}<({{[]<>}([]())}<<<>[]><<>{}>>){(<[]><(){}>)>>]{{(<([]<>)([]( +<[<{[<{{([(({(<>())}{[<>[]](()<>)})([([][]){<>()}][<[]<>>{[]{}}]))])}([{{(<{<>()}[()<>])(( +{{[({[[{([<<{<()()>[()[]]}{<<>{}>{{}()}}>>]<{<[<{}()>{[][]}][{[][]}[<><>>]>}>)}]][<((({({([]{}) +[(<[([<{[[{{<{{}[]}({}())>([{}[]]{[]})}([([]())<<><>>]<(())<<>>>)}[<[(<>{}){{}<>}]{{()<>}[<>{ +{{[{[<([{<[((<(){}><()[]>){[{}]({}<>)})(([()[]]<<>[]>)<[(){}]>]]{({[<>()][<>[]]}({[]{}}{{}[]}))[[[(){}][[]{} +{[<<<[<[{[<((<[]{}>)<([]<>){{}<>}>)<{([]())({}{})}>>](<([(<><>)[[]<>]]<{<><>}{()[]}>)>[(<<<>()><()[]>> +<[<((<<(<{(({<{}<>>{{}<>}}{<[]()>{<>{}}})){<[(<><>)<()<>>]>[{{<>{}}<(){}>}<{<><>}({}())>]}}>)>[[{<[[ +[([((<<([<{<[[()()]][[{}[]]]>{{(<>{})<<>()>][{[]()}]}}>])<([{<({{}()}<<>{}>)><[[()]<()[]>][[()<>](<> +{{((<[(({<[<[<[]<>>[(){}]](<[]<>><{}[]>)>][({{[]()}{<>[]}}{(()[]){<><>}})<[<{}[]>]>]>}<{[{{{<>[]}{{}()}}{{<> +({{({{{{{{[<[({}())[<><>]]>[(<<>[]>((){}))]]{{(<<>()>[{}[]])[{<>{}}<{}[]>]}{({{}()})}}}[[({{{}<>}<()()>}({() +[<<[((({<<<(({(){}}({}{})){<<>{}>{{}{}}}]((<[][]>{<>[]}))>>{[[([()()])<[()[]]{[]<>}>][(<<>()>({}[]))<({}[] +{(<<(<{({<<[[(<><>){(){}}][([]())([][])]](<<<>()>[[][]]>[({}{})[()<>]])>((<[[]<>]<{}()>>){<([][])[[]<> +<([{<[({{{[<{{()<>}(<><>)}{<{}()>[{}<>]}>{{[{}{}]<<>>}<[<>()]<<>[]>>}]{<<([][]){[]()}>[<{}()><()()>]>[ +(<<[[<(<{[<(([()<>]<()<>>){[{}[]][{}()]})<[[<><>]<[]>]<[[]()]{[]{}}>>>}<[[[<{}{}>(<>())]]{({<>{}}([ +[(([<(<(([(<<<{}{}>[[]()]>[<[][]>{[]}]><<<<>()>[[]{}]>([[][]]{<>()})>)(({<<><>>[()()]}))]))>((({(( +<<[[<{{({[{({(<><>)(()<>)}[[<><>]])[({<><>}([][]))[[[]()]([]{})]]}]<{({(<>{})[(){}]}({()<>}))([{( +({[<<<<[<(<[<[[]<>]([]<>)>{<(){}><[]()>}]{[(()<>)(()())][{(){}}[<>]]}>)>][(([({([][])<[][]>][{(){}}({})])<<{[ +<<({[(<{<(<({<[]<>>{()()}})<{<()[]>[[]()]}(((){}){<>})>>){[[<[{}()]>][{[(){}]({}[])}<[<>[]](<><>)>]]({(<< +<[([[(<<({(<<({}())]>{[[[]<>][[]()]]})<<{([]())[[]<>]}<(())<{}<>>>>{(([]{}){<>{}}){[{}()][(){}]}}>})>< +{(<{{[{<({[[[[{}()]({}[])]({()()}{{}[]})]{<[(){}]>([{}()]{{}{}})}](<{<{}[]>[{}[]]}((()[]){<>{}})>([{[]{ +<[(<({<(<[<{<([]<>)<<><>>>([<><>])}>]{([{(<><>)(<>())}[{()()}{(){}}]]){{{([]{}}{{}[]}}<{<>[]}[[ +<[<[[{([<({([<[]()><[]<>>])[([[]<>]{{}})]}<<<<[]<>>(()[])>({()()}<<>[]>)>[<{[]<>}>({()()}(()<>))]>)({( +{{<[(<{{{<[<(([]<>}[<>{}])><<<<>{}>([]())>[([][])]>]>}}}>)]>(({(<{<<<(({()}<[][]>)[<[]>{<><>} +({{[<[({[[{({{{}[])}<[<>[]][<><>]>)<{{[]{}}{{}[]}}>}]<((<(<>()){()}>)(<[{}()]{<><>}>(<()()>{()[]}) \ No newline at end of file diff --git a/day10/solution.spec.ts b/day10/solution.spec.ts new file mode 100644 index 0000000..53e84c6 --- /dev/null +++ b/day10/solution.spec.ts @@ -0,0 +1,118 @@ +import { loader } from '../lib/loader' + +const openingBraces = ['(', '[', '{', '<'] +const closingBraces = [')', ']', '}', '>'] +const braces = [...openingBraces, ...closingBraces] as const +type Brace = typeof braces[number] +type Chunk = Brace + +const scores: Record = { + ')': 3, + ']': 57, + '}': 1197, + '>': 25137, +} + +export class ParseError extends Error { + public readonly chunk: Chunk + public readonly position: number + public readonly program: string + constructor( + message: string, + chunk: Chunk, + position: number, + program: string, + ) { + super(message) + this.name = 'ParseError' + this.chunk = chunk + this.position = position + this.program = program + } +} + +export const parseProgram = ( + program: string, + index = 0, + stack: Chunk[] = [], +): void => { + if (index >= program.length) return + const chunk = program[index] + if (!braces.includes(chunk)) + throw new Error(`Unexpected chunk ${chunk} at ${index}`) + if (closingBraces.includes(chunk)) { + const expectedOpeningBrace = openingBraces[closingBraces.indexOf(chunk)] + if (stack[stack.length - 1] !== expectedOpeningBrace) { + throw new ParseError( + `${program}\nExpected ${expectedOpeningBrace} at ${index}, got ${chunk}`, + chunk, + index, + program, + ) + } + stack.pop() + } else { + stack.push(chunk) + } + return parseProgram(program, ++index, stack) +} + +describe('parseProgram()', () => { + it.each([ + ['()'], + ['[]'], + ['([])'], + ['{()()()}'], + ['<([{}])>'], + ['[<>({}){}[([])<>]]'], + ['(((((((((())))))))))'], + ])('should parse program %s', (program) => { + parseProgram(program) + }) + it.each([['(]'], ['{()()()>'], ['(((()))}'], ['<([]){()}[{}])']])( + 'should fail to parse program %s', + (program) => expect(() => parseProgram(program)).toThrow(), + ) +}) + +const example = [ + '[({(<(())[]>[[{[]{<()<>>', + '[(()[<>])]({[<{<<[]>>(', + '{([(<{}[<>[]}>{[]{[(<()>', + '(((({<>}<{<{<>}{[]{[]{}', + '[[<[([]))<([[{}[[()]]]', + '[{[{({}]{}}([{[{{{}}([]', + '{<[[]]>}<{[{[{[]{()[[[]', + '[<(<(<(<{}))><([]([]()', + '<{([([[(<>()){}]>(<<{{', + '<{([{{}}[<[[[<>{}]]]>[]]', +] + +const input = loader(10)('input') + +describe('Day 10: Syntax Scoring', () => { + describe('Part 1', () => { + it('should solve the example', () => { + let score = 0 + for (const program of example) { + try { + parseProgram(program) + } catch (err) { + score += scores[(err as ParseError).chunk] + } + } + expect(score).toEqual(26397) + }) + it('should solve the puzzle', () => { + let score = 0 + for (const program of input) { + try { + parseProgram(program) + } catch (err) { + score += scores[(err as ParseError).chunk] + } + } + expect(score).toEqual(367227) + }) + }) +}) From 0ed71620e3c1f8b61b158705251c8623149a7645 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 11 Dec 2021 00:10:59 +0100 Subject: [PATCH 084/110] refactor: move files --- day10/parseProgram.spec.ts | 19 +++++++++ day10/parseProgram.ts | 49 ++++++++++++++++++++++ day10/solution.spec.ts | 83 ++++---------------------------------- 3 files changed, 76 insertions(+), 75 deletions(-) create mode 100644 day10/parseProgram.spec.ts create mode 100644 day10/parseProgram.ts diff --git a/day10/parseProgram.spec.ts b/day10/parseProgram.spec.ts new file mode 100644 index 0000000..b3484bc --- /dev/null +++ b/day10/parseProgram.spec.ts @@ -0,0 +1,19 @@ +import { parseProgram } from './parseProgram' + +describe('parseProgram()', () => { + it.each([ + ['()'], + ['[]'], + ['([])'], + ['{()()()}'], + ['<([{}])>'], + ['[<>({}){}[([])<>]]'], + ['(((((((((())))))))))'], + ])('should parse program %s', (program) => { + parseProgram(program) + }) + it.each([['(]'], ['{()()()>'], ['(((()))}'], ['<([]){()}[{}])']])( + 'should fail to parse program %s', + (program) => expect(() => parseProgram(program)).toThrow(), + ) +}) diff --git a/day10/parseProgram.ts b/day10/parseProgram.ts new file mode 100644 index 0000000..ef1a40d --- /dev/null +++ b/day10/parseProgram.ts @@ -0,0 +1,49 @@ +export const openingBraces = ['(', '[', '{', '<'] +export const closingBraces = [')', ']', '}', '>'] +export const braces = [...openingBraces, ...closingBraces] as const +export type Brace = typeof braces[number] +export type Chunk = Brace + +export class ParseError extends Error { + public readonly chunk: Chunk + public readonly position: number + public readonly program: string + constructor( + message: string, + chunk: Chunk, + position: number, + program: string, + ) { + super(message) + this.name = 'ParseError' + this.chunk = chunk + this.position = position + this.program = program + } +} + +export const parseProgram = ( + program: string, + index = 0, + stack: Chunk[] = [], +): void => { + if (index >= program.length) return + const chunk = program[index] + if (!braces.includes(chunk)) + throw new Error(`Unexpected chunk ${chunk} at ${index}`) + if (closingBraces.includes(chunk)) { + const expectedOpeningBrace = openingBraces[closingBraces.indexOf(chunk)] + if (stack[stack.length - 1] !== expectedOpeningBrace) { + throw new ParseError( + `${program}\nExpected ${expectedOpeningBrace} at ${index}, got ${chunk}`, + chunk, + index, + program, + ) + } + stack.pop() + } else { + stack.push(chunk) + } + return parseProgram(program, ++index, stack) +} diff --git a/day10/solution.spec.ts b/day10/solution.spec.ts index 53e84c6..1b51010 100644 --- a/day10/solution.spec.ts +++ b/day10/solution.spec.ts @@ -1,79 +1,5 @@ import { loader } from '../lib/loader' - -const openingBraces = ['(', '[', '{', '<'] -const closingBraces = [')', ']', '}', '>'] -const braces = [...openingBraces, ...closingBraces] as const -type Brace = typeof braces[number] -type Chunk = Brace - -const scores: Record = { - ')': 3, - ']': 57, - '}': 1197, - '>': 25137, -} - -export class ParseError extends Error { - public readonly chunk: Chunk - public readonly position: number - public readonly program: string - constructor( - message: string, - chunk: Chunk, - position: number, - program: string, - ) { - super(message) - this.name = 'ParseError' - this.chunk = chunk - this.position = position - this.program = program - } -} - -export const parseProgram = ( - program: string, - index = 0, - stack: Chunk[] = [], -): void => { - if (index >= program.length) return - const chunk = program[index] - if (!braces.includes(chunk)) - throw new Error(`Unexpected chunk ${chunk} at ${index}`) - if (closingBraces.includes(chunk)) { - const expectedOpeningBrace = openingBraces[closingBraces.indexOf(chunk)] - if (stack[stack.length - 1] !== expectedOpeningBrace) { - throw new ParseError( - `${program}\nExpected ${expectedOpeningBrace} at ${index}, got ${chunk}`, - chunk, - index, - program, - ) - } - stack.pop() - } else { - stack.push(chunk) - } - return parseProgram(program, ++index, stack) -} - -describe('parseProgram()', () => { - it.each([ - ['()'], - ['[]'], - ['([])'], - ['{()()()}'], - ['<([{}])>'], - ['[<>({}){}[([])<>]]'], - ['(((((((((())))))))))'], - ])('should parse program %s', (program) => { - parseProgram(program) - }) - it.each([['(]'], ['{()()()>'], ['(((()))}'], ['<([]){()}[{}])']])( - 'should fail to parse program %s', - (program) => expect(() => parseProgram(program)).toThrow(), - ) -}) +import { Brace, ParseError, parseProgram } from './parseProgram' const example = [ '[({(<(())[]>[[{[]{<()<>>', @@ -90,6 +16,13 @@ const example = [ const input = loader(10)('input') +const scores: Record = { + ')': 3, + ']': 57, + '}': 1197, + '>': 25137, +} + describe('Day 10: Syntax Scoring', () => { describe('Part 1', () => { it('should solve the example', () => { From 9ad61926f7ffb755f6447702bd8fce3dcde81581 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 11 Dec 2021 00:35:40 +0100 Subject: [PATCH 085/110] feat(day10): part 2 --- day10/completeProgram.spec.ts | 14 ++++++++++++++ day10/completeProgram.ts | 14 ++++++++++++++ day10/parseProgram.ts | 4 ++-- day10/solution.spec.ts | 36 +++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 day10/completeProgram.spec.ts create mode 100644 day10/completeProgram.ts diff --git a/day10/completeProgram.spec.ts b/day10/completeProgram.spec.ts new file mode 100644 index 0000000..9377270 --- /dev/null +++ b/day10/completeProgram.spec.ts @@ -0,0 +1,14 @@ +import { completeProgram } from './completeProgram' + +describe('completeProgram()', () => { + it.each([ + ['(', ')'], + ['[({(<(())[]>[[{[]{<()<>>', '}}]])})]'], + ['[(()[<>])]({[<{<<[]>>(', ')}>]})'], + ['(((({<>}<{<{<>}{[]{[]{}', '}}>}>))))'], + ['{<[[]]>}<{[{[{[]{()[[[]', ']]}}]}]}>'], + ['<{([{{}}[<[[[<>{}]]]>[]]', '])}>'], + ])('should complete program %s with %s', (program, completion) => + expect(completeProgram(program)).toEqual(completion.split('')), + ) +}) diff --git a/day10/completeProgram.ts b/day10/completeProgram.ts new file mode 100644 index 0000000..7871a04 --- /dev/null +++ b/day10/completeProgram.ts @@ -0,0 +1,14 @@ +import { parseProgram } from './parseProgram' + +const matchingBrace: Record = { + '(': ')', + '[': ']', + '{': '}', + '<': '>', +} + +export const completeProgram = (program: string): string[] => { + const stack = parseProgram(program) + if (stack.length === 0) return [] + return stack.reverse().map((openingBrace) => matchingBrace[openingBrace]) +} diff --git a/day10/parseProgram.ts b/day10/parseProgram.ts index ef1a40d..b291cd0 100644 --- a/day10/parseProgram.ts +++ b/day10/parseProgram.ts @@ -26,8 +26,8 @@ export const parseProgram = ( program: string, index = 0, stack: Chunk[] = [], -): void => { - if (index >= program.length) return +): Chunk[] => { + if (index >= program.length) return stack const chunk = program[index] if (!braces.includes(chunk)) throw new Error(`Unexpected chunk ${chunk} at ${index}`) diff --git a/day10/solution.spec.ts b/day10/solution.spec.ts index 1b51010..2a29a61 100644 --- a/day10/solution.spec.ts +++ b/day10/solution.spec.ts @@ -1,4 +1,5 @@ import { loader } from '../lib/loader' +import { completeProgram } from './completeProgram' import { Brace, ParseError, parseProgram } from './parseProgram' const example = [ @@ -23,6 +24,13 @@ const scores: Record = { '>': 25137, } +const incompleteScores: Record = { + ')': 1, + ']': 2, + '}': 3, + '>': 4, +} + describe('Day 10: Syntax Scoring', () => { describe('Part 1', () => { it('should solve the example', () => { @@ -48,4 +56,32 @@ describe('Day 10: Syntax Scoring', () => { expect(score).toEqual(367227) }) }) + describe('Part 2', () => { + const scoreCompletions = (programs: string[]) => { + const scores: number[] = [] + for (const program of programs) { + try { + const stack = parseProgram(program) + if (stack.length > 0) { + const completion = completeProgram(program) + // Program is incomplete + let programScore = 0 + for (const brace of completion) { + programScore = programScore * 5 + incompleteScores[brace] + } + scores.push(programScore) + } + } catch { + // Ignore + } + } + return scores.sort((a, b) => a - b)[Math.floor(scores.length / 2)] + } + it('should solve the example', () => { + expect(scoreCompletions(example)).toEqual(288957) + }) + it('should solve the example', () => { + expect(scoreCompletions(input)).toEqual(3583341858) + }) + }) }) From 622a45452d37b0c29f66a23a6ccab96cb7da89d6 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 11 Dec 2021 09:50:13 +0100 Subject: [PATCH 086/110] feat(day11): part 1 --- day11/countFlashes.ts | 11 ++++ day11/game.spec.ts | 71 ++++++++++++++++++++++++++ day11/game.ts | 111 +++++++++++++++++++++++++++++++++++++++++ day11/solution.spec.ts | 46 +++++++++++++++++ 4 files changed, 239 insertions(+) create mode 100644 day11/countFlashes.ts create mode 100644 day11/game.spec.ts create mode 100644 day11/game.ts create mode 100644 day11/solution.spec.ts diff --git a/day11/countFlashes.ts b/day11/countFlashes.ts new file mode 100644 index 0000000..e88e4fb --- /dev/null +++ b/day11/countFlashes.ts @@ -0,0 +1,11 @@ +import { Generation, step } from './game' + +export const countFlashes = (generation: Generation, steps: number): number => { + let flashes = 0 + for (let i = 0; i < steps; i++) { + generation = step(generation, () => { + flashes++ + }) + } + return flashes +} diff --git a/day11/game.spec.ts b/day11/game.spec.ts new file mode 100644 index 0000000..4ed11b2 --- /dev/null +++ b/day11/game.spec.ts @@ -0,0 +1,71 @@ +import { render } from '../day05/render' +import { generation, step } from './game' + +describe('Glowing Octopus Game of Life', () => { + it('should calculate the next generation', () => { + const start = generation( + `11111 + 19991 + 19191 + 19991 + 11111`, + ) + const gen1 = step(start) + const gen2 = step(gen1) + expect(render(gen1)).toEqual( + render( + generation( + `34543 + 40004 + 50005 + 40004 + 34543`, + ), + ), + ) + expect(render(gen2)).toEqual( + render( + generation( + `45654 + 51115 + 61116 + 51115 + 45654`, + ), + ), + ) + }) + it('should calculate a bigger example', () => { + let gen = generation( + `5483143223 + 2745854711 + 5264556173 + 6141336146 + 6357385478 + 4167524645 + 2176841721 + 6882881134 + 4846848554 + 5283751526`, + ) + for (let i = 0; i < 10; i++) { + gen = step(gen) + } + expect(render(gen)).toEqual( + render( + generation( + `0481112976 + 0031112009 + 0041112504 + 0081111406 + 0099111306 + 0093511233 + 0442361130 + 5532252350 + 0532250600 + 0032240000`, + ), + ), + ) + }) +}) diff --git a/day11/game.ts b/day11/game.ts new file mode 100644 index 0000000..edb08f7 --- /dev/null +++ b/day11/game.ts @@ -0,0 +1,111 @@ +const trim = (s: string): string => s.trim() + +export type Generation = number[][] + +export const generation = (squids: string): Generation => + squids + .split('\n') + .map(trim) + .map((s) => s.split('').map((s) => parseInt(s, 10))) + +export const render = (generation: Generation): string => + generation.map((row) => row.join('')).join('\n') + +/** + * You can model the energy levels and flashes of light in steps. During a single step, the following occurs: + * - First, the energy level of each octopus increases by 1. + * - Then, any octopus with an energy level greater than 9 flashes. + * This increases the energy level of all adjacent octopuses by 1, including octopuses that are diagonally adjacent. + * If this causes an octopus to have an energy level greater than 9, it also flashes. + * This process continues as long as new octopuses keep having their energy level increased beyond 9. + * (An octopus can only flash at most once per step.) + * - Finally, any octopus that flashed during this step has its energy level set to 0, as it used all of its energy to flash. + */ +export const step = ( + generation: Generation, + onFlash?: (_: [x: number, y: number]) => void, +): Generation => { + const flashing: boolean[][] = [] + const nextGeneration: Generation = [] + // First, the energy level of each octopus increases by 1. + for (let y = 0; y < generation.length; y++) { + for (let x = 0; x < generation[y].length; x++) { + const current = generation[y][x] + if (nextGeneration[y] === undefined) { + nextGeneration[y] = [] + flashing[y] = [] + } + nextGeneration[y][x] = current + 1 + } + } + // Then, any octopus with an energy level greater than 9 flashes. + do { + for (let y = 0; y < nextGeneration.length; y++) { + for (let x = 0; x < nextGeneration[y].length; x++) { + const current = nextGeneration[y][x] + if ( + current > 9 && + // (An octopus can only flash at most once per step.) + flashing[y][x] !== true + ) { + // Flashing + flashing[y][x] = true + // This increases the energy level of all adjacent octopuses by 1, including octopuses that are diagonally adjacent. + const N = nextGeneration[y - 1]?.[x] + const NE = nextGeneration[y - 1]?.[x + 1] + const E = nextGeneration[y]?.[x + 1] + const SE = nextGeneration[y + 1]?.[x + 1] + const S = nextGeneration[y + 1]?.[x] + const SW = nextGeneration[y + 1]?.[x - 1] + const W = nextGeneration[y]?.[x - 1] + const NW = nextGeneration[y - 1]?.[x - 1] + if (N !== undefined) { + nextGeneration[y - 1][x]++ + } + if (NE !== undefined) { + nextGeneration[y - 1][x + 1]++ + } + if (E !== undefined) { + nextGeneration[y][x + 1]++ + } + if (SE !== undefined) { + nextGeneration[y + 1][x + 1]++ + } + if (S !== undefined) { + nextGeneration[y + 1][x]++ + } + if (SW !== undefined) { + nextGeneration[y + 1][x - 1]++ + } + if (W !== undefined) { + nextGeneration[y][x - 1]++ + } + if (NW !== undefined) { + nextGeneration[y - 1][x - 1]++ + } + } + } + } + } while ( + // This process continues as long as new octopuses keep having their energy level increased beyond 9. + (() => { + for (let y = 0; y < nextGeneration.length; y++) { + for (let x = 0; x < nextGeneration[y].length; x++) { + const current = nextGeneration[y][x] + if (current > 9 && flashing[y][x] !== true) return true + } + } + return false + })() + ) + // Finally, any octopus that flashed during this step has its energy level set to 0, as it used all of its energy to flash. + for (let y = 0; y < nextGeneration.length; y++) { + for (let x = 0; x < nextGeneration[y].length; x++) { + if (flashing[y][x]) { + nextGeneration[y][x] = 0 + onFlash?.([x, y]) + } + } + } + return nextGeneration +} diff --git a/day11/solution.spec.ts b/day11/solution.spec.ts new file mode 100644 index 0000000..7fd48ea --- /dev/null +++ b/day11/solution.spec.ts @@ -0,0 +1,46 @@ +import { countFlashes } from './countFlashes' +import { generation } from './game' + +describe('Day 11: Dumbo Octopus', () => { + describe('Part 1', () => { + it('should solve the example', () => { + //After 100 steps, there have been a total of 1656 flashes. + expect( + countFlashes( + generation( + `5483143223 + 2745854711 + 5264556173 + 6141336146 + 6357385478 + 4167524645 + 2176841721 + 6882881134 + 4846848554 + 5283751526`, + ), + 100, + ), + ).toEqual(1656) + }) + it('should solve the puzzle', () => { + expect( + countFlashes( + generation( + `3265255276 + 1537412665 + 7335746422 + 6426325658 + 3854434364 + 8717377486 + 4522286326 + 6337772845 + 8824387665 + 6351586484`, + ), + 100, + ), + ).toEqual(1627) + }) + }) +}) From 39f66808030dcf753edfbe3b0f2b272b25132a22 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 11 Dec 2021 09:57:26 +0100 Subject: [PATCH 087/110] feat(day11): part 2 --- day11/countFlashes.ts | 20 ++++++++++++++++++-- day11/game.ts | 6 ++++-- day11/solution.spec.ts | 41 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/day11/countFlashes.ts b/day11/countFlashes.ts index e88e4fb..466a21f 100644 --- a/day11/countFlashes.ts +++ b/day11/countFlashes.ts @@ -3,9 +3,25 @@ import { Generation, step } from './game' export const countFlashes = (generation: Generation, steps: number): number => { let flashes = 0 for (let i = 0; i < steps; i++) { - generation = step(generation, () => { - flashes++ + generation = step(generation, (numFlashes) => { + flashes += numFlashes }) } return flashes } + +export const allFlash = ( + generation: Generation, + limit = Number.MAX_SAFE_INTEGER, +): number => { + const squids = generation.length * generation[0].length + let flashes = 0 + let stepNum = 0 + do { + generation = step(generation, (numFlashes) => { + flashes = numFlashes + }) + stepNum++ + } while (flashes < squids && stepNum < limit) + return stepNum +} diff --git a/day11/game.ts b/day11/game.ts index edb08f7..db011ea 100644 --- a/day11/game.ts +++ b/day11/game.ts @@ -23,7 +23,7 @@ export const render = (generation: Generation): string => */ export const step = ( generation: Generation, - onFlash?: (_: [x: number, y: number]) => void, + onFlashes?: (_: number) => void, ): Generation => { const flashing: boolean[][] = [] const nextGeneration: Generation = [] @@ -99,13 +99,15 @@ export const step = ( })() ) // Finally, any octopus that flashed during this step has its energy level set to 0, as it used all of its energy to flash. + let flashes = 0 for (let y = 0; y < nextGeneration.length; y++) { for (let x = 0; x < nextGeneration[y].length; x++) { if (flashing[y][x]) { nextGeneration[y][x] = 0 - onFlash?.([x, y]) + flashes++ } } } + onFlashes?.(flashes) return nextGeneration } diff --git a/day11/solution.spec.ts b/day11/solution.spec.ts index 7fd48ea..c4e9685 100644 --- a/day11/solution.spec.ts +++ b/day11/solution.spec.ts @@ -1,4 +1,4 @@ -import { countFlashes } from './countFlashes' +import { allFlash, countFlashes } from './countFlashes' import { generation } from './game' describe('Day 11: Dumbo Octopus', () => { @@ -43,4 +43,43 @@ describe('Day 11: Dumbo Octopus', () => { ).toEqual(1627) }) }) + describe('Part 2', () => { + it('should solve the example', () => { + // the first time all octopuses flash simultaneously is step 195 + expect( + allFlash( + generation( + `5483143223 + 2745854711 + 5264556173 + 6141336146 + 6357385478 + 4167524645 + 2176841721 + 6882881134 + 4846848554 + 5283751526`, + ), + ), + ).toEqual(195) + }) + it('should solve the puzzle', () => { + expect( + allFlash( + generation( + `3265255276 + 1537412665 + 7335746422 + 6426325658 + 3854434364 + 8717377486 + 4522286326 + 6337772845 + 8824387665 + 6351586484`, + ), + ), + ).toEqual(329) + }) + }) }) From ff8decc0b99d92da63ded0b3097ae1c9ed2e908f Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sun, 12 Dec 2021 09:09:33 +0100 Subject: [PATCH 088/110] fix: update dependencies --- package-lock.json | 858 ++++++++++++++++++++++------------------------ package.json | 14 +- 2 files changed, 414 insertions(+), 458 deletions(-) diff --git a/package-lock.json b/package-lock.json index 949b8a4..a32d676 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,16 +12,16 @@ "devDependencies": { "@commitlint/cli": "15.0.0", "@commitlint/config-angular": "15.0.0", - "@nordicsemiconductor/asset-tracker-cloud-code-style": "9.2.26", + "@nordicsemiconductor/asset-tracker-cloud-code-style": "9.2.31", "@types/jest": "27.0.3", - "@types/node": "16.11.11", - "eslint": "8.3.0", + "@types/node": "16.11.12", + "eslint": "8.4.1", "husky": "7.0.4", - "jest": "27.4.2", + "jest": "27.4.4", "lint-staged": "12.1.2", - "prettier": "2.5.0", - "ts-jest": "27.0.7", - "typescript": "4.5.2" + "prettier": "2.5.1", + "ts-jest": "27.1.1", + "typescript": "4.5.3" }, "engines": { "node": ">=16.0.0", @@ -889,14 +889,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.0.0", + "espree": "^9.2.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -918,12 +918,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" }, @@ -1054,15 +1054,15 @@ } }, "node_modules/@jest/core": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.2.tgz", - "integrity": "sha512-0mPM61tDbu8yc9CMKH9bvV+g+17VUpdWQtU1x6P1gk4AKj8iywWi8zBmEIl7pTGjUtYA92CNc/LlBfKCioBOow==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.4.tgz", + "integrity": "sha512-xBNPVqYAdAiAMXnb4ugx9Cdmr0S52lBsLbQMR/sGBRO0810VSPKiuSDtuup6qdkK1e9vxbv3KK3IAP1QFAp8mw==", "dev": true, "dependencies": { "@jest/console": "^27.4.2", - "@jest/reporters": "^27.4.2", + "@jest/reporters": "^27.4.4", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1071,15 +1071,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.2", - "jest-haste-map": "^27.4.2", + "jest-config": "^27.4.4", + "jest-haste-map": "^27.4.4", "jest-message-util": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-resolve-dependencies": "^27.4.2", - "jest-runner": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-resolve": "^27.4.4", + "jest-resolve-dependencies": "^27.4.4", + "jest-runner": "^27.4.4", + "jest-runtime": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "jest-watcher": "^27.4.2", @@ -1101,9 +1101,9 @@ } }, "node_modules/@jest/environment": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.2.tgz", - "integrity": "sha512-uSljKxh/rGlHlmhyeG4ZoVK9hOec+EPBkwTHkHKQ2EqDu5K+MaG9uJZ8o1CbRsSdZqSuhXvJCYhBWsORPPg6qw==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.4.tgz", + "integrity": "sha512-q+niMx7cJgt/t/b6dzLOh4W8Ef/8VyKG7hxASK39jakijJzbFBGpptx3RXz13FFV7OishQ9lTbv+dQ5K3EhfDQ==", "dev": true, "dependencies": { "@jest/fake-timers": "^27.4.2", @@ -1133,12 +1133,12 @@ } }, "node_modules/@jest/globals": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.2.tgz", - "integrity": "sha512-KkfaHEttlGpXYAQTZHgrESiEPx2q/DKAFLGLFda1uGVrqc17snd3YVPhOxlXOHIzVPs+lQ/SDB2EIvxyGzb3Ew==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.4.tgz", + "integrity": "sha512-bqpqQhW30BOreXM8bA8t8JbOQzsq/WnPTnBl+It3UxAD9J8yxEAaBEylHx1dtBapAr/UBk8GidXbzmqnee8tYQ==", "dev": true, "dependencies": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/types": "^27.4.2", "expect": "^27.4.2" }, @@ -1147,15 +1147,15 @@ } }, "node_modules/@jest/reporters": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.2.tgz", - "integrity": "sha512-sp4aqmdBJtjKetEakzDPcZggPcVIF6w9QLkYBbaWDV6e/SIsHnF1S4KtIH91eEc2fp7ep6V/e1xvdfEoho1d2w==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.4.tgz", + "integrity": "sha512-ssyJSw9B9Awb1QaxDhIPSs4de1b7SE2kv7tqFehQL13xpn5HUkMYZK/ufTOXiCAnXFOZS+XDl1GaQ/LmJAzI1A==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.4.2", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -1168,10 +1168,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.4.2", - "jest-resolve": "^27.4.2", + "jest-haste-map": "^27.4.4", + "jest-resolve": "^27.4.4", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.4", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -1220,24 +1220,24 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.2.tgz", - "integrity": "sha512-HmHp5mlh9f9GyNej5yCS1JZIFfUGnP9+jEOH5zoq5EmsuZeYD+dGULqyvGDPtuzzbyAFJ6R4+z4SS0VvnFwwGQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.4.tgz", + "integrity": "sha512-mCh+d4JTGTtX7vr13d7q2GHJy33nAobEwtEJ8X3u7R8+0ImVO2eAsQzsLfX8lyvdYHBxYABhqbYuaUNo42/pQw==", "dev": true, "dependencies": { "@jest/test-result": "^27.4.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", - "jest-runtime": "^27.4.2" + "jest-haste-map": "^27.4.4", + "jest-runtime": "^27.4.4" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.2.tgz", - "integrity": "sha512-RTKcPZllfcmLfnlxBya7aypofhdz05+E6QITe55Ex0rxyerkgjmmpMlvVn11V0cP719Ps6WcDYCnDzxnnJUwKg==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.4.tgz", + "integrity": "sha512-7U/nDSrGsGzL7+X8ScNFV71w8u8knJQWSa9C2xsrrKLMOgb+rWuCG4VAyWke/53BU96GnT+Ka81xCAHA5gk6zA==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", @@ -1247,7 +1247,7 @@ "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-regex-util": "^27.4.0", "jest-util": "^27.4.2", "micromatch": "^4.0.4", @@ -1312,20 +1312,20 @@ } }, "node_modules/@nordicsemiconductor/asset-tracker-cloud-code-style": { - "version": "9.2.26", - "resolved": "https://registry.npmjs.org/@nordicsemiconductor/asset-tracker-cloud-code-style/-/asset-tracker-cloud-code-style-9.2.26.tgz", - "integrity": "sha512-jnuCCIRfKRPvoLeZerunEiT0GLLZWn1S/rVmkbBMUqm/+cttEn448cJrRq1r+s08rkNHoApSX/hjB995qCWYbA==", + "version": "9.2.31", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/asset-tracker-cloud-code-style/-/asset-tracker-cloud-code-style-9.2.31.tgz", + "integrity": "sha512-143DyHKqz1Yq/A7i1JzfrYQorS10K3m+3gJd84AtcnEMRxNrAbnf8hQwifswyyIe3v+YWoGlqM78Gfkby6/mYA==", "dev": true, "dependencies": { "@commitlint/cli": "15.0.0", "@commitlint/config-angular": "15.0.0", - "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": "8.1.17", - "eslint": "8.3.0", + "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": "8.1.18", + "eslint": "8.4.1", "husky": "7.0.4", "lint-staged": "12.1.2", "pinst": "2.1.6", - "prettier": "2.5.0", - "typescript": "4.5.2" + "prettier": "2.5.1", + "typescript": "4.5.3" }, "engines": { "node": ">=14", @@ -1333,12 +1333,12 @@ } }, "node_modules/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": { - "version": "8.1.17", - "resolved": "https://registry.npmjs.org/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript/-/eslint-config-asset-tracker-cloud-typescript-8.1.17.tgz", - "integrity": "sha512-Xsie6AYbieLyVyboV0alF5ohBo1R2SP8hfzoenzw9B3SR9Oz7rkB04hB7g3HDWoCcilRY1RYgglUai4FgAhW8Q==", + "version": "8.1.18", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript/-/eslint-config-asset-tracker-cloud-typescript-8.1.18.tgz", + "integrity": "sha512-OAkXxX1Ia9QLSh2Oayzwb48e2hqH1QbLbfKSwSpLdOmEUnvGK6pBx8jfmQzI3fZZkljlkIGUfOs+uU5HjMLSVA==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "5.5.0", + "@typescript-eslint/eslint-plugin": "5.6.0", "eslint-config-prettier": "8.3.0" }, "engines": { @@ -1457,17 +1457,6 @@ "pretty-format": "^27.0.0" } }, - "node_modules/@types/jsdom": { - "version": "16.2.13", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.13.tgz", - "integrity": "sha512-8JQCjdeAidptSsOcRWk2iTm9wCcwn9l+kRG6k5bzUacrnm1ezV4forq0kWjUih/tumAeoG+OspOvQEbbRucBTw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/parse5": "*", - "@types/tough-cookie": "*" - } - }, "node_modules/@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -1481,9 +1470,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.11.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", - "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==", + "version": "16.11.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", + "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -1498,12 +1487,6 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, "node_modules/@types/prettier": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz", @@ -1516,12 +1499,6 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, - "node_modules/@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==", - "dev": true - }, "node_modules/@types/yargs": { "version": "16.0.4", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", @@ -1538,13 +1515,13 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.5.0.tgz", - "integrity": "sha512-4bV6fulqbuaO9UMXU0Ia0o6z6if+kmMRW8rMRyfqXj/eGrZZRGedS4n0adeGNnjr8LKAM495hrQ7Tea52UWmQA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.6.0.tgz", + "integrity": "sha512-MIbeMy5qfLqtgs1hWd088k1hOuRsN9JrHUPwVVKCD99EOUqScd7SrwoZl4Gso05EAP9w1kvLWUVGJOVpRPkDPA==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "5.5.0", - "@typescript-eslint/scope-manager": "5.5.0", + "@typescript-eslint/experimental-utils": "5.6.0", + "@typescript-eslint/scope-manager": "5.6.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -1570,15 +1547,15 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.5.0.tgz", - "integrity": "sha512-kjWeeVU+4lQ1SLYErRKV5yDXbWDPkpbzTUUlfAUifPYvpX0qZlrcCZ96/6oWxt3QxtK5WVhXz+KsnwW9cIW+3A==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.6.0.tgz", + "integrity": "sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.5.0", - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/typescript-estree": "5.5.0", + "@typescript-eslint/scope-manager": "5.6.0", + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/typescript-estree": "5.6.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -1594,15 +1571,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.5.0.tgz", - "integrity": "sha512-JsXBU+kgQOAgzUn2jPrLA+Rd0Y1dswOlX3hp8MuRO1hQDs6xgHtbCXEiAu7bz5hyVURxbXcA2draasMbNqrhmg==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.6.0.tgz", + "integrity": "sha512-YVK49NgdUPQ8SpCZaOpiq1kLkYRPMv9U5gcMrywzI8brtwZjr/tG3sZpuHyODt76W/A0SufNjYt9ZOgrC4tLIQ==", "dev": true, "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.5.0", - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/typescript-estree": "5.5.0", + "@typescript-eslint/scope-manager": "5.6.0", + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/typescript-estree": "5.6.0", "debug": "^4.3.2" }, "engines": { @@ -1622,13 +1599,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.5.0.tgz", - "integrity": "sha512-0/r656RmRLo7CbN4Mdd+xZyPJ/fPCKhYdU6mnZx+8msAD8nJSP8EyCFkzbd6vNVZzZvWlMYrSNekqGrCBqFQhg==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.6.0.tgz", + "integrity": "sha512-1U1G77Hw2jsGWVsO2w6eVCbOg0HZ5WxL/cozVSTfqnL/eB9muhb8THsP0G3w+BB5xAHv9KptwdfYFAUfzcIh4A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/visitor-keys": "5.5.0" + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/visitor-keys": "5.6.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1639,9 +1616,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.5.0.tgz", - "integrity": "sha512-OaYTqkW3GnuHxqsxxJ6KypIKd5Uw7bFiQJZRyNi1jbMJnK3Hc/DR4KwB6KJj6PBRkJJoaNwzMNv9vtTk87JhOg==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.6.0.tgz", + "integrity": "sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1652,13 +1629,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.5.0.tgz", - "integrity": "sha512-pVn8btYUiYrjonhMAO0yG8lm7RApzy2L4RC7Td/mC/qFkyf6vRbGyZozoA94+w6D2Y2GRqpMoCWcwx/EUOzyoQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.6.0.tgz", + "integrity": "sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/visitor-keys": "5.5.0", + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/visitor-keys": "5.6.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -1679,12 +1656,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.5.0.tgz", - "integrity": "sha512-4GzJ1kRtsWzHhdM40tv0ZKHNSbkDhF0Woi/TDwVJX6UICwJItvP7ZTXbjTkCdrors7ww0sYe0t+cIKDAJwZ7Kw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.6.0.tgz", + "integrity": "sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/types": "5.6.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -1919,12 +1896,12 @@ "dev": true }, "node_modules/babel-jest": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.2.tgz", - "integrity": "sha512-MADrjb3KBO2eyZCAc6QaJg6RT5u+6oEdDyHO5HEalnpwQ6LrhTsQF2Kj1Wnz2t6UPXIXPk18dSXXOT0wF5yTxA==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.4.tgz", + "integrity": "sha512-+6RVutZxOQgJkt4svgTHPFtOQlVe9dUg3wrimIAM38pY6hL/nsL8glfFSUjD9jNVjaVjzkCzj6loFFecrjr9Qw==", "dev": true, "dependencies": { - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", @@ -2768,13 +2745,13 @@ } }, "node_modules/eslint": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", - "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-TxU/p7LB1KxQ6+7aztTnO7K0i+h0tDi81YRY9VzB6Id71kNz+fFYnf5HD5UOQmxkzcoa0TlVZf9dpMtUv0GpWg==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -2785,7 +2762,7 @@ "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.1.0", - "espree": "^9.1.0", + "espree": "^9.2.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2915,9 +2892,9 @@ } }, "node_modules/espree": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", - "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", + "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", "dev": true, "dependencies": { "acorn": "^8.6.0", @@ -3809,9 +3786,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", - "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.1.tgz", + "integrity": "sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -3822,14 +3799,14 @@ } }, "node_modules/jest": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.2.tgz", - "integrity": "sha512-TAReynFYCfHNcrL+8Z74WPGafLFLF++bGkrpcsk6cO5G9S2VuJGhu2c44YFForMgF0GlYmtbpmeznkvZpNgTxg==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.4.tgz", + "integrity": "sha512-AXwEIFa58Uf1Jno3/KSo5HZZ0/2Xwqvfrz0/3bmTwImkFlbOvz5vARAW9nTrxRLkojjkitaZ1KNKAtw3JRFAaA==", "dev": true, "dependencies": { - "@jest/core": "^27.4.2", + "@jest/core": "^27.4.4", "import-local": "^3.0.2", - "jest-cli": "^27.4.2" + "jest-cli": "^27.4.4" }, "bin": { "jest": "bin/jest.js" @@ -3861,12 +3838,12 @@ } }, "node_modules/jest-circus": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.2.tgz", - "integrity": "sha512-2ePUSru1BGMyzxsMvRfu+tNb+PW60rUyMLJBfw1Nrh5zC8RoTPfF+zbE0JToU31a6ZVe4nnrNKWYRzlghAbL0A==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.4.tgz", + "integrity": "sha512-4DWhvQerDq5X4GaqhEUoZiBhuNdKDGr0geW0iJwarbDljAmGaGOErKQG+z2PBr0vgN05z7tsGSY51mdWr8E4xg==", "dev": true, "dependencies": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", "@types/node": "*", @@ -3878,8 +3855,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-runtime": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "slash": "^3.0.0", @@ -3891,19 +3868,19 @@ } }, "node_modules/jest-cli": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.2.tgz", - "integrity": "sha512-Ex2WhCj4s0XFntTKTnyLgV/CZKgQaZBYrKz02XOZ4nUjFD+26Fji/M1SgHm+2IWEIsQqoipNRx9RJH56p8d7MQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.4.tgz", + "integrity": "sha512-+MfsHnZPUOBigCBURuQFRpgYoPCgmIFkICkqt4SrramZCUp/UAuWcst4pMZb84O3VU8JyKJmnpGG4qH8ClQloA==", "dev": true, "dependencies": { - "@jest/core": "^27.4.2", + "@jest/core": "^27.4.4", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.4.2", + "jest-config": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "prompts": "^2.0.1", @@ -3943,28 +3920,28 @@ } }, "node_modules/jest-config": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.2.tgz", - "integrity": "sha512-2vKqelsfHPnIzrPTpE9hImqxZLp5l9Vszpci19RdVB2i5OwoM+OkPExZMQb8aGrpEGXoKtlzvdqCL1GObiz8JQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.4.tgz", + "integrity": "sha512-6lxg0ugO6KS2zKEbpdDwBzu1IT0Xg4/VhxXMuBu+z/5FvBjLCEMTaWQm3bCaGCZUR9j9FK4DzUIxyhIgn6kVEg==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.4.2", + "@jest/test-sequencer": "^27.4.4", "@jest/types": "^27.4.2", - "babel-jest": "^27.4.2", + "babel-jest": "^27.4.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.2", - "jest-environment-jsdom": "^27.4.2", - "jest-environment-node": "^27.4.2", + "jest-circus": "^27.4.4", + "jest-environment-jsdom": "^27.4.4", + "jest-environment-node": "^27.4.4", "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.2", + "jest-jasmine2": "^27.4.4", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-runner": "^27.4.2", + "jest-resolve": "^27.4.4", + "jest-runner": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "micromatch": "^4.0.4", @@ -4027,15 +4004,14 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.2.tgz", - "integrity": "sha512-L0dV4oq4+Ll7hZ8QCGvSELn8uOr938/QKOg6o70kMHiZOpWOjAqSf7fMVAtGhG/BVSvk1GTzhGJNOWsxtH5KbQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.4.tgz", + "integrity": "sha512-cYR3ndNfHBqQgFvS1RL7dNqSvD//K56j/q1s2ygNHcfTCAp12zfIromO1w3COmXrxS8hWAh7+CmZmGCIoqGcGA==", "dev": true, "dependencies": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/fake-timers": "^27.4.2", "@jest/types": "^27.4.2", - "@types/jsdom": "^16.2.4", "@types/node": "*", "jest-mock": "^27.4.2", "jest-util": "^27.4.2", @@ -4046,12 +4022,12 @@ } }, "node_modules/jest-environment-node": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.2.tgz", - "integrity": "sha512-nzTZ5nJ+FabuZPH2YVci7SZIHpvtNRHPt8+vipLkCnAgXGjVzHm7XJWdnNqXbAkExIgiKeVEkVMNZOZE/LeiIg==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.4.tgz", + "integrity": "sha512-D+v3lbJ2GjQTQR23TK0kY3vFVmSeea05giInI41HHOaJnAwOnmUHTZgUaZL+VxUB43pIzoa7PMwWtCVlIUoVoA==", "dev": true, "dependencies": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/fake-timers": "^27.4.2", "@jest/types": "^27.4.2", "@types/node": "*", @@ -4072,9 +4048,9 @@ } }, "node_modules/jest-haste-map": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.2.tgz", - "integrity": "sha512-foiyAEePORUN2eeJnOtcM1y8qW0ShEd9kTjWVL4sVaMcuCJM6gtHegvYPBRT0mpI/bs4ueThM90+Eoj2ncoNsA==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.4.tgz", + "integrity": "sha512-kvspmHmgPIZoDaqUsvsJFTaspuxhATvdO6wsFNGNSi8kfdiOCEEvECNbht8xG+eE5Ol88JyJmp2D7RF4dYo85Q==", "dev": true, "dependencies": { "@jest/types": "^27.4.2", @@ -4086,7 +4062,7 @@ "jest-regex-util": "^27.4.0", "jest-serializer": "^27.4.0", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.4", "micromatch": "^4.0.4", "walker": "^1.0.7" }, @@ -4098,13 +4074,13 @@ } }, "node_modules/jest-jasmine2": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.2.tgz", - "integrity": "sha512-VO/fyAJSH9u0THjbteFiL8qc93ufU+yW+bdieDc8tzTCWwlWzO53UHS5nFK1qmE8izb5Smkn+XHlVt6/l06MKQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.4.tgz", + "integrity": "sha512-ygk2tUgtLeN3ouj4KEYw9p81GLI1EKrnvourPULN5gdgB482PH5op9gqaRG0IenbJhBbbRwiSvh5NoBoQZSqdA==", "dev": true, "dependencies": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/source-map": "^27.4.0", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", @@ -4116,8 +4092,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-runtime": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "throat": "^6.0.1" @@ -4214,15 +4190,15 @@ } }, "node_modules/jest-resolve": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.2.tgz", - "integrity": "sha512-d/zqPjxCzMqHlOdRTg8cTpO9jY+1/T74KazT8Ws/LwmwxV5sRMWOkiLjmzUCDj/5IqA5XHNK4Hkmlq9Kdpb9Sg==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.4.tgz", + "integrity": "sha512-Yh5jK3PBmDbm01Rc8pT0XqpBlTPEGwWp7cN61ijJuwony/tR2Taof3TLy6yfNiuRS8ucUOPO7NBYm3ei38kkcg==", "dev": true, "dependencies": { "@jest/types": "^27.4.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", @@ -4235,29 +4211,29 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.2.tgz", - "integrity": "sha512-hb++cTpqvOWfU49MCP/JQkxmnrhKoAVqXWFjgYXswRSVGk8Q6bDTSvhbCeYXDtXaymY0y7WrrSIlKogClcKJuw==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.4.tgz", + "integrity": "sha512-iAnpCXh81sd9nbyqySvm5/aV9X6JZKE0dQyFXTC8tptXcdrgS0vjPFy+mEgzPHxXw+tq4TQupuTa0n8OXwRIxw==", "dev": true, "dependencies": { "@jest/types": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.2" + "jest-snapshot": "^27.4.4" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-runner": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.2.tgz", - "integrity": "sha512-YsgbYKk8V7J5BQPINXhdzNLoqIwUWrJkV9h6/ccsn6fbmC3n3ax1K5cDWzAU9qXyaQhetwFqPpHmAHIACscRKQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.4.tgz", + "integrity": "sha512-AXv/8Q0Xf1puWnDf52m7oLrK7sXcv6re0V/kItwTSVHJbX7Oebm07oGFQqGmq0R0mhO1zpmB3OpqRuaCN2elPA==", "dev": true, "dependencies": { "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -4265,15 +4241,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-docblock": "^27.4.0", - "jest-environment-jsdom": "^27.4.2", - "jest-environment-node": "^27.4.2", - "jest-haste-map": "^27.4.2", + "jest-environment-jsdom": "^27.4.4", + "jest-environment-node": "^27.4.4", + "jest-haste-map": "^27.4.4", "jest-leak-detector": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.2", - "jest-runtime": "^27.4.2", + "jest-resolve": "^27.4.4", + "jest-runtime": "^27.4.4", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.4", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -4282,17 +4258,17 @@ } }, "node_modules/jest-runtime": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.2.tgz", - "integrity": "sha512-eqPgcBaUNaw6j8T5M+dnfAEh6MIrh2YmtskCr9sl50QYpD22Sg+QqHw3J3nmaLzVMbBtOMHFFxLF0Qx8MsZVFQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.4.tgz", + "integrity": "sha512-tZGay6P6vXJq8t4jVFAUzYHx+lzIHXjz+rj1XBk6mAR1Lwtf5kz0Uun7qNuU+oqpZu4+hhuxpUfXb6j30bEPqA==", "dev": true, "dependencies": { "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.2", - "@jest/globals": "^27.4.2", + "@jest/environment": "^27.4.4", + "@jest/globals": "^27.4.4", "@jest/source-map": "^27.4.0", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", @@ -4302,12 +4278,12 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-message-util": "^27.4.2", "jest-mock": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-resolve": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "slash": "^3.0.0", @@ -4350,9 +4326,9 @@ } }, "node_modules/jest-snapshot": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.2.tgz", - "integrity": "sha512-DI7lJlNIu6WSQ+esqhnJzEzU70+dV+cNjoF1c+j5FagWEd3KtOyZvVliAH0RWNQ6KSnAAnKSU0qxJ8UXOOhuUQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.4.tgz", + "integrity": "sha512-yy+rpCvYMOjTl7IMuaMI9OP9WT229zi8BhdNHm6e6mttAOIzvIiCxFoZ6yRxaV3HDPPgMryi+ReX2b8+IQJdPA==", "dev": true, "dependencies": { "@babel/core": "^7.7.2", @@ -4361,7 +4337,7 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", @@ -4371,10 +4347,10 @@ "graceful-fs": "^4.2.4", "jest-diff": "^27.4.2", "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.2", + "jest-resolve": "^27.4.4", "jest-util": "^27.4.2", "natural-compare": "^1.4.0", "pretty-format": "^27.4.2", @@ -4449,9 +4425,9 @@ } }, "node_modules/jest-worker": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz", - "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", + "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", "dev": true, "dependencies": { "@types/node": "*", @@ -5517,9 +5493,9 @@ } }, "node_modules/prettier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", - "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -6415,9 +6391,9 @@ } }, "node_modules/ts-jest": { - "version": "27.0.7", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.7.tgz", - "integrity": "sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.1.tgz", + "integrity": "sha512-Ds0VkB+cB+8g2JUmP/GKWndeZcCKrbe6jzolGrVWdqVUFByY/2KDHqxJ7yBSon7hDB1TA4PXxjfZ+JjzJisvgA==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -6439,6 +6415,7 @@ "@babel/core": ">=7.0.0-beta.0 <8", "@types/jest": "^27.0.0", "babel-jest": ">=27.0.0 <28", + "esbuild": "~0.14.0", "jest": "^27.0.0", "typescript": ">=3.8 <5.0" }, @@ -6451,6 +6428,9 @@ }, "babel-jest": { "optional": true + }, + "esbuild": { + "optional": true } } }, @@ -6550,9 +6530,9 @@ } }, "node_modules/typescript": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", - "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.3.tgz", + "integrity": "sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -7513,14 +7493,14 @@ } }, "@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.0.0", + "espree": "^9.2.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -7538,12 +7518,12 @@ } }, "@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" } @@ -7646,15 +7626,15 @@ } }, "@jest/core": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.2.tgz", - "integrity": "sha512-0mPM61tDbu8yc9CMKH9bvV+g+17VUpdWQtU1x6P1gk4AKj8iywWi8zBmEIl7pTGjUtYA92CNc/LlBfKCioBOow==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.4.tgz", + "integrity": "sha512-xBNPVqYAdAiAMXnb4ugx9Cdmr0S52lBsLbQMR/sGBRO0810VSPKiuSDtuup6qdkK1e9vxbv3KK3IAP1QFAp8mw==", "dev": true, "requires": { "@jest/console": "^27.4.2", - "@jest/reporters": "^27.4.2", + "@jest/reporters": "^27.4.4", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -7663,15 +7643,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.2", - "jest-haste-map": "^27.4.2", + "jest-config": "^27.4.4", + "jest-haste-map": "^27.4.4", "jest-message-util": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-resolve-dependencies": "^27.4.2", - "jest-runner": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-resolve": "^27.4.4", + "jest-resolve-dependencies": "^27.4.4", + "jest-runner": "^27.4.4", + "jest-runtime": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "jest-watcher": "^27.4.2", @@ -7682,9 +7662,9 @@ } }, "@jest/environment": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.2.tgz", - "integrity": "sha512-uSljKxh/rGlHlmhyeG4ZoVK9hOec+EPBkwTHkHKQ2EqDu5K+MaG9uJZ8o1CbRsSdZqSuhXvJCYhBWsORPPg6qw==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.4.tgz", + "integrity": "sha512-q+niMx7cJgt/t/b6dzLOh4W8Ef/8VyKG7hxASK39jakijJzbFBGpptx3RXz13FFV7OishQ9lTbv+dQ5K3EhfDQ==", "dev": true, "requires": { "@jest/fake-timers": "^27.4.2", @@ -7708,26 +7688,26 @@ } }, "@jest/globals": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.2.tgz", - "integrity": "sha512-KkfaHEttlGpXYAQTZHgrESiEPx2q/DKAFLGLFda1uGVrqc17snd3YVPhOxlXOHIzVPs+lQ/SDB2EIvxyGzb3Ew==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.4.tgz", + "integrity": "sha512-bqpqQhW30BOreXM8bA8t8JbOQzsq/WnPTnBl+It3UxAD9J8yxEAaBEylHx1dtBapAr/UBk8GidXbzmqnee8tYQ==", "dev": true, "requires": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/types": "^27.4.2", "expect": "^27.4.2" } }, "@jest/reporters": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.2.tgz", - "integrity": "sha512-sp4aqmdBJtjKetEakzDPcZggPcVIF6w9QLkYBbaWDV6e/SIsHnF1S4KtIH91eEc2fp7ep6V/e1xvdfEoho1d2w==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.4.tgz", + "integrity": "sha512-ssyJSw9B9Awb1QaxDhIPSs4de1b7SE2kv7tqFehQL13xpn5HUkMYZK/ufTOXiCAnXFOZS+XDl1GaQ/LmJAzI1A==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.4.2", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -7740,10 +7720,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.4.2", - "jest-resolve": "^27.4.2", + "jest-haste-map": "^27.4.4", + "jest-resolve": "^27.4.4", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.4", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -7775,21 +7755,21 @@ } }, "@jest/test-sequencer": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.2.tgz", - "integrity": "sha512-HmHp5mlh9f9GyNej5yCS1JZIFfUGnP9+jEOH5zoq5EmsuZeYD+dGULqyvGDPtuzzbyAFJ6R4+z4SS0VvnFwwGQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.4.tgz", + "integrity": "sha512-mCh+d4JTGTtX7vr13d7q2GHJy33nAobEwtEJ8X3u7R8+0ImVO2eAsQzsLfX8lyvdYHBxYABhqbYuaUNo42/pQw==", "dev": true, "requires": { "@jest/test-result": "^27.4.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", - "jest-runtime": "^27.4.2" + "jest-haste-map": "^27.4.4", + "jest-runtime": "^27.4.4" } }, "@jest/transform": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.2.tgz", - "integrity": "sha512-RTKcPZllfcmLfnlxBya7aypofhdz05+E6QITe55Ex0rxyerkgjmmpMlvVn11V0cP719Ps6WcDYCnDzxnnJUwKg==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.4.tgz", + "integrity": "sha512-7U/nDSrGsGzL7+X8ScNFV71w8u8knJQWSa9C2xsrrKLMOgb+rWuCG4VAyWke/53BU96GnT+Ka81xCAHA5gk6zA==", "dev": true, "requires": { "@babel/core": "^7.1.0", @@ -7799,7 +7779,7 @@ "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-regex-util": "^27.4.0", "jest-util": "^27.4.2", "micromatch": "^4.0.4", @@ -7849,29 +7829,29 @@ } }, "@nordicsemiconductor/asset-tracker-cloud-code-style": { - "version": "9.2.26", - "resolved": "https://registry.npmjs.org/@nordicsemiconductor/asset-tracker-cloud-code-style/-/asset-tracker-cloud-code-style-9.2.26.tgz", - "integrity": "sha512-jnuCCIRfKRPvoLeZerunEiT0GLLZWn1S/rVmkbBMUqm/+cttEn448cJrRq1r+s08rkNHoApSX/hjB995qCWYbA==", + "version": "9.2.31", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/asset-tracker-cloud-code-style/-/asset-tracker-cloud-code-style-9.2.31.tgz", + "integrity": "sha512-143DyHKqz1Yq/A7i1JzfrYQorS10K3m+3gJd84AtcnEMRxNrAbnf8hQwifswyyIe3v+YWoGlqM78Gfkby6/mYA==", "dev": true, "requires": { "@commitlint/cli": "15.0.0", "@commitlint/config-angular": "15.0.0", - "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": "8.1.17", - "eslint": "8.3.0", + "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": "8.1.18", + "eslint": "8.4.1", "husky": "7.0.4", "lint-staged": "12.1.2", "pinst": "2.1.6", - "prettier": "2.5.0", - "typescript": "4.5.2" + "prettier": "2.5.1", + "typescript": "4.5.3" } }, "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": { - "version": "8.1.17", - "resolved": "https://registry.npmjs.org/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript/-/eslint-config-asset-tracker-cloud-typescript-8.1.17.tgz", - "integrity": "sha512-Xsie6AYbieLyVyboV0alF5ohBo1R2SP8hfzoenzw9B3SR9Oz7rkB04hB7g3HDWoCcilRY1RYgglUai4FgAhW8Q==", + "version": "8.1.18", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript/-/eslint-config-asset-tracker-cloud-typescript-8.1.18.tgz", + "integrity": "sha512-OAkXxX1Ia9QLSh2Oayzwb48e2hqH1QbLbfKSwSpLdOmEUnvGK6pBx8jfmQzI3fZZkljlkIGUfOs+uU5HjMLSVA==", "dev": true, "requires": { - "@typescript-eslint/eslint-plugin": "5.5.0", + "@typescript-eslint/eslint-plugin": "5.6.0", "eslint-config-prettier": "8.3.0" } }, @@ -7983,17 +7963,6 @@ "pretty-format": "^27.0.0" } }, - "@types/jsdom": { - "version": "16.2.13", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.13.tgz", - "integrity": "sha512-8JQCjdeAidptSsOcRWk2iTm9wCcwn9l+kRG6k5bzUacrnm1ezV4forq0kWjUih/tumAeoG+OspOvQEbbRucBTw==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/parse5": "*", - "@types/tough-cookie": "*" - } - }, "@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -8007,9 +7976,9 @@ "dev": true }, "@types/node": { - "version": "16.11.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", - "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==", + "version": "16.11.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", + "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==", "dev": true }, "@types/normalize-package-data": { @@ -8024,12 +7993,6 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, "@types/prettier": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz", @@ -8042,12 +8005,6 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, - "@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==", - "dev": true - }, "@types/yargs": { "version": "16.0.4", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", @@ -8064,13 +8021,13 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.5.0.tgz", - "integrity": "sha512-4bV6fulqbuaO9UMXU0Ia0o6z6if+kmMRW8rMRyfqXj/eGrZZRGedS4n0adeGNnjr8LKAM495hrQ7Tea52UWmQA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.6.0.tgz", + "integrity": "sha512-MIbeMy5qfLqtgs1hWd088k1hOuRsN9JrHUPwVVKCD99EOUqScd7SrwoZl4Gso05EAP9w1kvLWUVGJOVpRPkDPA==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.5.0", - "@typescript-eslint/scope-manager": "5.5.0", + "@typescript-eslint/experimental-utils": "5.6.0", + "@typescript-eslint/scope-manager": "5.6.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -8080,56 +8037,56 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.5.0.tgz", - "integrity": "sha512-kjWeeVU+4lQ1SLYErRKV5yDXbWDPkpbzTUUlfAUifPYvpX0qZlrcCZ96/6oWxt3QxtK5WVhXz+KsnwW9cIW+3A==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.6.0.tgz", + "integrity": "sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.5.0", - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/typescript-estree": "5.5.0", + "@typescript-eslint/scope-manager": "5.6.0", + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/typescript-estree": "5.6.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.5.0.tgz", - "integrity": "sha512-JsXBU+kgQOAgzUn2jPrLA+Rd0Y1dswOlX3hp8MuRO1hQDs6xgHtbCXEiAu7bz5hyVURxbXcA2draasMbNqrhmg==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.6.0.tgz", + "integrity": "sha512-YVK49NgdUPQ8SpCZaOpiq1kLkYRPMv9U5gcMrywzI8brtwZjr/tG3sZpuHyODt76W/A0SufNjYt9ZOgrC4tLIQ==", "dev": true, "peer": true, "requires": { - "@typescript-eslint/scope-manager": "5.5.0", - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/typescript-estree": "5.5.0", + "@typescript-eslint/scope-manager": "5.6.0", + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/typescript-estree": "5.6.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.5.0.tgz", - "integrity": "sha512-0/r656RmRLo7CbN4Mdd+xZyPJ/fPCKhYdU6mnZx+8msAD8nJSP8EyCFkzbd6vNVZzZvWlMYrSNekqGrCBqFQhg==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.6.0.tgz", + "integrity": "sha512-1U1G77Hw2jsGWVsO2w6eVCbOg0HZ5WxL/cozVSTfqnL/eB9muhb8THsP0G3w+BB5xAHv9KptwdfYFAUfzcIh4A==", "dev": true, "requires": { - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/visitor-keys": "5.5.0" + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/visitor-keys": "5.6.0" } }, "@typescript-eslint/types": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.5.0.tgz", - "integrity": "sha512-OaYTqkW3GnuHxqsxxJ6KypIKd5Uw7bFiQJZRyNi1jbMJnK3Hc/DR4KwB6KJj6PBRkJJoaNwzMNv9vtTk87JhOg==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.6.0.tgz", + "integrity": "sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.5.0.tgz", - "integrity": "sha512-pVn8btYUiYrjonhMAO0yG8lm7RApzy2L4RC7Td/mC/qFkyf6vRbGyZozoA94+w6D2Y2GRqpMoCWcwx/EUOzyoQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.6.0.tgz", + "integrity": "sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/visitor-keys": "5.5.0", + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/visitor-keys": "5.6.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -8138,12 +8095,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.5.0.tgz", - "integrity": "sha512-4GzJ1kRtsWzHhdM40tv0ZKHNSbkDhF0Woi/TDwVJX6UICwJItvP7ZTXbjTkCdrors7ww0sYe0t+cIKDAJwZ7Kw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.6.0.tgz", + "integrity": "sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng==", "dev": true, "requires": { - "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/types": "5.6.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -8312,12 +8269,12 @@ "dev": true }, "babel-jest": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.2.tgz", - "integrity": "sha512-MADrjb3KBO2eyZCAc6QaJg6RT5u+6oEdDyHO5HEalnpwQ6LrhTsQF2Kj1Wnz2t6UPXIXPk18dSXXOT0wF5yTxA==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.4.tgz", + "integrity": "sha512-+6RVutZxOQgJkt4svgTHPFtOQlVe9dUg3wrimIAM38pY6hL/nsL8glfFSUjD9jNVjaVjzkCzj6loFFecrjr9Qw==", "dev": true, "requires": { - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", @@ -8965,13 +8922,13 @@ } }, "eslint": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", - "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-TxU/p7LB1KxQ6+7aztTnO7K0i+h0tDi81YRY9VzB6Id71kNz+fFYnf5HD5UOQmxkzcoa0TlVZf9dpMtUv0GpWg==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -8982,7 +8939,7 @@ "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.1.0", - "espree": "^9.1.0", + "espree": "^9.2.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -9075,9 +9032,9 @@ "dev": true }, "espree": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", - "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", + "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", "dev": true, "requires": { "acorn": "^8.6.0", @@ -9734,9 +9691,9 @@ } }, "istanbul-reports": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", - "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.1.tgz", + "integrity": "sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -9744,14 +9701,14 @@ } }, "jest": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.2.tgz", - "integrity": "sha512-TAReynFYCfHNcrL+8Z74WPGafLFLF++bGkrpcsk6cO5G9S2VuJGhu2c44YFForMgF0GlYmtbpmeznkvZpNgTxg==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.4.tgz", + "integrity": "sha512-AXwEIFa58Uf1Jno3/KSo5HZZ0/2Xwqvfrz0/3bmTwImkFlbOvz5vARAW9nTrxRLkojjkitaZ1KNKAtw3JRFAaA==", "dev": true, "requires": { - "@jest/core": "^27.4.2", + "@jest/core": "^27.4.4", "import-local": "^3.0.2", - "jest-cli": "^27.4.2" + "jest-cli": "^27.4.4" } }, "jest-changed-files": { @@ -9766,12 +9723,12 @@ } }, "jest-circus": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.2.tgz", - "integrity": "sha512-2ePUSru1BGMyzxsMvRfu+tNb+PW60rUyMLJBfw1Nrh5zC8RoTPfF+zbE0JToU31a6ZVe4nnrNKWYRzlghAbL0A==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.4.tgz", + "integrity": "sha512-4DWhvQerDq5X4GaqhEUoZiBhuNdKDGr0geW0iJwarbDljAmGaGOErKQG+z2PBr0vgN05z7tsGSY51mdWr8E4xg==", "dev": true, "requires": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", "@types/node": "*", @@ -9783,8 +9740,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-runtime": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "slash": "^3.0.0", @@ -9793,19 +9750,19 @@ } }, "jest-cli": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.2.tgz", - "integrity": "sha512-Ex2WhCj4s0XFntTKTnyLgV/CZKgQaZBYrKz02XOZ4nUjFD+26Fji/M1SgHm+2IWEIsQqoipNRx9RJH56p8d7MQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.4.tgz", + "integrity": "sha512-+MfsHnZPUOBigCBURuQFRpgYoPCgmIFkICkqt4SrramZCUp/UAuWcst4pMZb84O3VU8JyKJmnpGG4qH8ClQloA==", "dev": true, "requires": { - "@jest/core": "^27.4.2", + "@jest/core": "^27.4.4", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.4.2", + "jest-config": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "prompts": "^2.0.1", @@ -9830,28 +9787,28 @@ } }, "jest-config": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.2.tgz", - "integrity": "sha512-2vKqelsfHPnIzrPTpE9hImqxZLp5l9Vszpci19RdVB2i5OwoM+OkPExZMQb8aGrpEGXoKtlzvdqCL1GObiz8JQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.4.tgz", + "integrity": "sha512-6lxg0ugO6KS2zKEbpdDwBzu1IT0Xg4/VhxXMuBu+z/5FvBjLCEMTaWQm3bCaGCZUR9j9FK4DzUIxyhIgn6kVEg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.4.2", + "@jest/test-sequencer": "^27.4.4", "@jest/types": "^27.4.2", - "babel-jest": "^27.4.2", + "babel-jest": "^27.4.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.2", - "jest-environment-jsdom": "^27.4.2", - "jest-environment-node": "^27.4.2", + "jest-circus": "^27.4.4", + "jest-environment-jsdom": "^27.4.4", + "jest-environment-node": "^27.4.4", "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.2", + "jest-jasmine2": "^27.4.4", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-runner": "^27.4.2", + "jest-resolve": "^27.4.4", + "jest-runner": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "micromatch": "^4.0.4", @@ -9894,15 +9851,14 @@ } }, "jest-environment-jsdom": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.2.tgz", - "integrity": "sha512-L0dV4oq4+Ll7hZ8QCGvSELn8uOr938/QKOg6o70kMHiZOpWOjAqSf7fMVAtGhG/BVSvk1GTzhGJNOWsxtH5KbQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.4.tgz", + "integrity": "sha512-cYR3ndNfHBqQgFvS1RL7dNqSvD//K56j/q1s2ygNHcfTCAp12zfIromO1w3COmXrxS8hWAh7+CmZmGCIoqGcGA==", "dev": true, "requires": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/fake-timers": "^27.4.2", "@jest/types": "^27.4.2", - "@types/jsdom": "^16.2.4", "@types/node": "*", "jest-mock": "^27.4.2", "jest-util": "^27.4.2", @@ -9910,12 +9866,12 @@ } }, "jest-environment-node": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.2.tgz", - "integrity": "sha512-nzTZ5nJ+FabuZPH2YVci7SZIHpvtNRHPt8+vipLkCnAgXGjVzHm7XJWdnNqXbAkExIgiKeVEkVMNZOZE/LeiIg==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.4.tgz", + "integrity": "sha512-D+v3lbJ2GjQTQR23TK0kY3vFVmSeea05giInI41HHOaJnAwOnmUHTZgUaZL+VxUB43pIzoa7PMwWtCVlIUoVoA==", "dev": true, "requires": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/fake-timers": "^27.4.2", "@jest/types": "^27.4.2", "@types/node": "*", @@ -9930,9 +9886,9 @@ "dev": true }, "jest-haste-map": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.2.tgz", - "integrity": "sha512-foiyAEePORUN2eeJnOtcM1y8qW0ShEd9kTjWVL4sVaMcuCJM6gtHegvYPBRT0mpI/bs4ueThM90+Eoj2ncoNsA==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.4.tgz", + "integrity": "sha512-kvspmHmgPIZoDaqUsvsJFTaspuxhATvdO6wsFNGNSi8kfdiOCEEvECNbht8xG+eE5Ol88JyJmp2D7RF4dYo85Q==", "dev": true, "requires": { "@jest/types": "^27.4.2", @@ -9945,19 +9901,19 @@ "jest-regex-util": "^27.4.0", "jest-serializer": "^27.4.0", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.4", "micromatch": "^4.0.4", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.2.tgz", - "integrity": "sha512-VO/fyAJSH9u0THjbteFiL8qc93ufU+yW+bdieDc8tzTCWwlWzO53UHS5nFK1qmE8izb5Smkn+XHlVt6/l06MKQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.4.tgz", + "integrity": "sha512-ygk2tUgtLeN3ouj4KEYw9p81GLI1EKrnvourPULN5gdgB482PH5op9gqaRG0IenbJhBbbRwiSvh5NoBoQZSqdA==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/source-map": "^27.4.0", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", @@ -9969,8 +9925,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-runtime": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "throat": "^6.0.1" @@ -10039,15 +9995,15 @@ "dev": true }, "jest-resolve": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.2.tgz", - "integrity": "sha512-d/zqPjxCzMqHlOdRTg8cTpO9jY+1/T74KazT8Ws/LwmwxV5sRMWOkiLjmzUCDj/5IqA5XHNK4Hkmlq9Kdpb9Sg==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.4.tgz", + "integrity": "sha512-Yh5jK3PBmDbm01Rc8pT0XqpBlTPEGwWp7cN61ijJuwony/tR2Taof3TLy6yfNiuRS8ucUOPO7NBYm3ei38kkcg==", "dev": true, "requires": { "@jest/types": "^27.4.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", @@ -10057,26 +10013,26 @@ } }, "jest-resolve-dependencies": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.2.tgz", - "integrity": "sha512-hb++cTpqvOWfU49MCP/JQkxmnrhKoAVqXWFjgYXswRSVGk8Q6bDTSvhbCeYXDtXaymY0y7WrrSIlKogClcKJuw==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.4.tgz", + "integrity": "sha512-iAnpCXh81sd9nbyqySvm5/aV9X6JZKE0dQyFXTC8tptXcdrgS0vjPFy+mEgzPHxXw+tq4TQupuTa0n8OXwRIxw==", "dev": true, "requires": { "@jest/types": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.2" + "jest-snapshot": "^27.4.4" } }, "jest-runner": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.2.tgz", - "integrity": "sha512-YsgbYKk8V7J5BQPINXhdzNLoqIwUWrJkV9h6/ccsn6fbmC3n3ax1K5cDWzAU9qXyaQhetwFqPpHmAHIACscRKQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.4.tgz", + "integrity": "sha512-AXv/8Q0Xf1puWnDf52m7oLrK7sXcv6re0V/kItwTSVHJbX7Oebm07oGFQqGmq0R0mhO1zpmB3OpqRuaCN2elPA==", "dev": true, "requires": { "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -10084,31 +10040,31 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-docblock": "^27.4.0", - "jest-environment-jsdom": "^27.4.2", - "jest-environment-node": "^27.4.2", - "jest-haste-map": "^27.4.2", + "jest-environment-jsdom": "^27.4.4", + "jest-environment-node": "^27.4.4", + "jest-haste-map": "^27.4.4", "jest-leak-detector": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.2", - "jest-runtime": "^27.4.2", + "jest-resolve": "^27.4.4", + "jest-runtime": "^27.4.4", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.4", "source-map-support": "^0.5.6", "throat": "^6.0.1" } }, "jest-runtime": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.2.tgz", - "integrity": "sha512-eqPgcBaUNaw6j8T5M+dnfAEh6MIrh2YmtskCr9sl50QYpD22Sg+QqHw3J3nmaLzVMbBtOMHFFxLF0Qx8MsZVFQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.4.tgz", + "integrity": "sha512-tZGay6P6vXJq8t4jVFAUzYHx+lzIHXjz+rj1XBk6mAR1Lwtf5kz0Uun7qNuU+oqpZu4+hhuxpUfXb6j30bEPqA==", "dev": true, "requires": { "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.2", - "@jest/globals": "^27.4.2", + "@jest/environment": "^27.4.4", + "@jest/globals": "^27.4.4", "@jest/source-map": "^27.4.0", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", @@ -10118,12 +10074,12 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-message-util": "^27.4.2", "jest-mock": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-resolve": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "slash": "^3.0.0", @@ -10159,9 +10115,9 @@ } }, "jest-snapshot": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.2.tgz", - "integrity": "sha512-DI7lJlNIu6WSQ+esqhnJzEzU70+dV+cNjoF1c+j5FagWEd3KtOyZvVliAH0RWNQ6KSnAAnKSU0qxJ8UXOOhuUQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.4.tgz", + "integrity": "sha512-yy+rpCvYMOjTl7IMuaMI9OP9WT229zi8BhdNHm6e6mttAOIzvIiCxFoZ6yRxaV3HDPPgMryi+ReX2b8+IQJdPA==", "dev": true, "requires": { "@babel/core": "^7.7.2", @@ -10170,7 +10126,7 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", @@ -10180,10 +10136,10 @@ "graceful-fs": "^4.2.4", "jest-diff": "^27.4.2", "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.2", + "jest-resolve": "^27.4.4", "jest-util": "^27.4.2", "natural-compare": "^1.4.0", "pretty-format": "^27.4.2", @@ -10242,9 +10198,9 @@ } }, "jest-worker": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz", - "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", + "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", "dev": true, "requires": { "@types/node": "*", @@ -11016,9 +10972,9 @@ "dev": true }, "prettier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", - "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", "dev": true }, "pretty-format": { @@ -11684,9 +11640,9 @@ "dev": true }, "ts-jest": { - "version": "27.0.7", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.7.tgz", - "integrity": "sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.1.tgz", + "integrity": "sha512-Ds0VkB+cB+8g2JUmP/GKWndeZcCKrbe6jzolGrVWdqVUFByY/2KDHqxJ7yBSon7hDB1TA4PXxjfZ+JjzJisvgA==", "dev": true, "requires": { "bs-logger": "0.x", @@ -11767,9 +11723,9 @@ } }, "typescript": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", - "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.3.tgz", + "integrity": "sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ==", "dev": true }, "universalify": { diff --git a/package.json b/package.json index 5813f85..7c3f364 100644 --- a/package.json +++ b/package.json @@ -25,16 +25,16 @@ "devDependencies": { "@commitlint/cli": "15.0.0", "@commitlint/config-angular": "15.0.0", - "@nordicsemiconductor/asset-tracker-cloud-code-style": "9.2.26", + "@nordicsemiconductor/asset-tracker-cloud-code-style": "9.2.31", "@types/jest": "27.0.3", - "@types/node": "16.11.11", - "eslint": "8.3.0", + "@types/node": "16.11.12", + "eslint": "8.4.1", "husky": "7.0.4", - "jest": "27.4.2", + "jest": "27.4.4", "lint-staged": "12.1.2", - "prettier": "2.5.0", - "ts-jest": "27.0.7", - "typescript": "4.5.2" + "prettier": "2.5.1", + "ts-jest": "27.1.1", + "typescript": "4.5.3" }, "lint-staged": { "*.ts": [ From 4e354459814c74f30d0f253725e94a7c9bb91538 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sun, 12 Dec 2021 09:10:09 +0100 Subject: [PATCH 089/110] test: remove console.log --- day05/solution.spec.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/day05/solution.spec.ts b/day05/solution.spec.ts index ffaeb80..9e1ead8 100644 --- a/day05/solution.spec.ts +++ b/day05/solution.spec.ts @@ -3,7 +3,6 @@ import { drawDiagram } from './drawDiagram' import { drawLines } from './drawLines' import { Line, toLine } from './line' import { linesOverlap } from './linesOverlap' -import { render } from './render' const onlyHorizontal = ([[x1, y1], [x2, y2]]: Line): boolean => x1 === x2 || y1 === y2 @@ -33,7 +32,6 @@ describe('Day 5: Hydrothermal Venture', () => { it('should solve the example', () => { const lines = drawLines(examplePart1) const diagram = drawDiagram(lines) - console.log(render(diagram)) const overlaps = linesOverlap(2, diagram) expect(overlaps).toHaveLength(5) }) @@ -48,7 +46,6 @@ describe('Day 5: Hydrothermal Venture', () => { it('should solve the example', () => { const lines = drawLines(example) const diagram = drawDiagram(lines) - console.log(render(diagram)) const overlaps = linesOverlap(2, diagram) expect(overlaps).toHaveLength(12) }) From 0afe804fc89b7b6ae3c789e04e2bee4cc10c68d6 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sun, 12 Dec 2021 10:27:29 +0100 Subject: [PATCH 090/110] feat(day12): part 1 --- day12/caveNavigator.ts | 77 ++++++++++++++++++++++++++ day12/isBigCave.spec.ts | 12 ++++ day12/isBigCave.ts | 1 + day12/solution.spec.ts | 118 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 208 insertions(+) create mode 100644 day12/caveNavigator.ts create mode 100644 day12/isBigCave.spec.ts create mode 100644 day12/isBigCave.ts create mode 100644 day12/solution.spec.ts diff --git a/day12/caveNavigator.ts b/day12/caveNavigator.ts new file mode 100644 index 0000000..986edfc --- /dev/null +++ b/day12/caveNavigator.ts @@ -0,0 +1,77 @@ +import { isBigCave } from './isBigCave' + +type Connection = { + from: string + to: string +} + +type Route = string[] + +export const parseMap = (connections: string[]): Connection[] => + connections.map((connection) => { + const [from, to] = connection.split('-') + return { + from, + to, + } + }) + +const routeToString = (route: Route): string => route.join(',') + +const wasVisited = + (path: Route) => + (target: string): boolean => { + if (isBigCave(target)) return true + return path.find((visited) => visited === target) === undefined + } + +const navigateCaves = ( + connections: Connection[], + path: Route, + onEnd: (_: Route) => void, +) => { + const current = path[path.length - 1] + const forward = connections // Forward connections + .filter(({ from }) => from === current) + .map(({ to }) => to) + // Can't go back to start + .filter((target) => target !== 'start') + // Cant' revisit small cages + .filter(wasVisited(path)) + const backward = connections + .filter(({ to }) => to === current) + .map(({ from }) => from) + // Can't go back to start + .filter((target) => target !== 'start') + // Cant' revisit small cages + .filter(wasVisited(path)) + + const nextConnections: string[] = [...forward, ...backward] + for (const connection of nextConnections) { + // End reached + if (connection === 'end') { + const routeToEnd = [...path, connection] + onEnd(routeToEnd) + continue + } + navigateCaves(connections, [...path, connection], onEnd) + } + // Dead end +} + +export const findPathes = (connections: Connection[]): string[] => { + const starts = [ + ...connections.filter(({ from }) => from === 'start').map(({ to }) => to), + ...connections.filter(({ to }) => to === 'start').map(({ from }) => from), + ] + const pathes: Route[] = [] + for (const start of starts) { + navigateCaves(connections, ['start', start], (route) => { + pathes.push(route) + }) + } + return pathes.map(routeToString) +} + +const example = ['start-A', 'start-b', 'A-c', 'A-b', 'b-d', 'A-end', 'b-end'] +findPathes(parseMap(example)) diff --git a/day12/isBigCave.spec.ts b/day12/isBigCave.spec.ts new file mode 100644 index 0000000..a29ff13 --- /dev/null +++ b/day12/isBigCave.spec.ts @@ -0,0 +1,12 @@ +import { isBigCave } from './isBigCave' + +describe('isBigCave', () => { + it.each([ + ['start', false], + ['A', true], + ['Abc', false], + ['ABC', true], + ])('should determine cave %s as big: %b', (name, expected) => + expect(isBigCave(name)).toEqual(expected), + ) +}) diff --git a/day12/isBigCave.ts b/day12/isBigCave.ts new file mode 100644 index 0000000..7eae2a6 --- /dev/null +++ b/day12/isBigCave.ts @@ -0,0 +1 @@ +export const isBigCave = (name: string): boolean => /^[A-Z]+$/.test(name) diff --git a/day12/solution.spec.ts b/day12/solution.spec.ts new file mode 100644 index 0000000..b356a17 --- /dev/null +++ b/day12/solution.spec.ts @@ -0,0 +1,118 @@ +import { findPathes, parseMap } from './caveNavigator' + +const example1 = ['start-A', 'start-b', 'A-c', 'A-b', 'b-d', 'A-end', 'b-end'] +const example2 = [ + 'dc-end', + 'HN-start', + 'start-kj', + 'dc-start', + 'dc-HN', + 'LN-dc', + 'HN-end', + 'kj-sa', + 'kj-HN', + 'kj-dc', +] +const example3 = [ + 'fs-end', + 'he-DX', + 'fs-he', + 'start-DX', + 'pj-DX', + 'end-zg', + 'zg-sl', + 'zg-pj', + 'pj-he', + 'RW-he', + 'fs-DX', + 'pj-RW', + 'zg-RW', + 'start-pj', + 'he-WI', + 'zg-he', + 'pj-fs', + 'start-RW', +] + +const input = [ + 'GC-zi', + 'end-zv', + 'lk-ca', + 'lk-zi', + 'GC-ky', + 'zi-ca', + 'end-FU', + 'iv-FU', + 'lk-iv', + 'lk-FU', + 'GC-end', + 'ca-zv', + 'lk-GC', + 'GC-zv', + 'start-iv', + 'zv-QQ', + 'ca-GC', + 'ca-FU', + 'iv-ca', + 'start-lk', + 'zv-FU', + 'start-zi', +] + +describe('Day 12: Passage Pathing', () => { + describe('Part 1', () => { + it('should solve the first example', () => { + const pathes = findPathes(parseMap(example1)) + expect(pathes).toHaveLength(10) + expect(pathes.sort((a, b) => a.localeCompare(b))).toEqual( + [ + 'start,A,b,A,c,A,end', + 'start,A,b,A,end', + 'start,A,b,end', + 'start,A,c,A,b,A,end', + 'start,A,c,A,b,end', + 'start,A,c,A,end', + 'start,A,end', + 'start,b,A,c,A,end', + 'start,b,A,end', + 'start,b,end', + ].sort((a, b) => a.localeCompare(b)), + ) + }) + it('should solve the second example', () => { + const pathes = findPathes(parseMap(example2)) + expect(pathes).toHaveLength(19) + expect(pathes.sort((a, b) => a.localeCompare(b))).toEqual( + [ + 'start,HN,dc,HN,end', + 'start,HN,dc,HN,kj,HN,end', + 'start,HN,dc,end', + 'start,HN,dc,kj,HN,end', + 'start,HN,end', + 'start,HN,kj,HN,dc,HN,end', + 'start,HN,kj,HN,dc,end', + 'start,HN,kj,HN,end', + 'start,HN,kj,dc,HN,end', + 'start,HN,kj,dc,end', + 'start,dc,HN,end', + 'start,dc,HN,kj,HN,end', + 'start,dc,end', + 'start,dc,kj,HN,end', + 'start,kj,HN,dc,HN,end', + 'start,kj,HN,dc,end', + 'start,kj,HN,end', + 'start,kj,dc,HN,end', + 'start,kj,dc,end', + ].sort((a, b) => a.localeCompare(b)), + ) + }) + it('should solve the third example', () => { + const pathes = findPathes(parseMap(example3)) + expect(pathes).toHaveLength(226) + }) + it('should solve the puzzle', () => { + const pathes = findPathes(parseMap(input)) + expect(pathes).toHaveLength(5252) + }) + }) +}) From d29e546077fd63c3f54b021b8023ad0688a0a189 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sun, 12 Dec 2021 11:56:45 +0100 Subject: [PATCH 091/110] feat(day12): part 2 --- day12/caveNavigator.ts | 54 ++++++++++++++++++++++++++------ day12/solution.spec.ts | 70 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 105 insertions(+), 19 deletions(-) diff --git a/day12/caveNavigator.ts b/day12/caveNavigator.ts index 986edfc..03e337e 100644 --- a/day12/caveNavigator.ts +++ b/day12/caveNavigator.ts @@ -18,17 +18,43 @@ export const parseMap = (connections: string[]): Connection[] => const routeToString = (route: Route): string => route.join(',') -const wasVisited = - (path: Route) => +const canVisit = + (path: Route, options?: NavigateOptions) => (target: string): boolean => { if (isBigCave(target)) return true - return path.find((visited) => visited === target) === undefined + + const allowOneSmallCaveTwice = options?.allowOneSmallCaveTwice ?? false + if (!allowOneSmallCaveTwice) + return path.find((visited) => visited === target) === undefined + + const visitedBefore = + path.filter((visited) => visited === target) !== undefined + if (!visitedBefore) return true + // Collect the visits per small cage + const visits = path.reduce((visitorCount, p) => { + if (isBigCave(p)) return visitorCount + return { + ...visitorCount, + [p]: (visitorCount[p] ?? 0) + 1, + } + }, {} as Record) + // Make sure we haven't visited the target already twice + if ((visits[target] ?? 0) > 1) { + return false + } + // Make sure we haven't visited any other small cave twice + const doubleVisits = Object.values(visits).filter((v) => v > 1) + const canVisit = doubleVisits.length <= 1 + return canVisit } +type NavigateOptions = { allowOneSmallCaveTwice: boolean } + const navigateCaves = ( connections: Connection[], path: Route, onEnd: (_: Route) => void, + options?: NavigateOptions, ) => { const current = path[path.length - 1] const forward = connections // Forward connections @@ -37,14 +63,14 @@ const navigateCaves = ( // Can't go back to start .filter((target) => target !== 'start') // Cant' revisit small cages - .filter(wasVisited(path)) + .filter(canVisit(path, options)) const backward = connections .filter(({ to }) => to === current) .map(({ from }) => from) // Can't go back to start .filter((target) => target !== 'start') // Cant' revisit small cages - .filter(wasVisited(path)) + .filter(canVisit(path, options)) const nextConnections: string[] = [...forward, ...backward] for (const connection of nextConnections) { @@ -54,21 +80,29 @@ const navigateCaves = ( onEnd(routeToEnd) continue } - navigateCaves(connections, [...path, connection], onEnd) + navigateCaves(connections, [...path, connection], onEnd, options) } // Dead end } -export const findPathes = (connections: Connection[]): string[] => { +export const findPathes = ( + connections: Connection[], + options?: NavigateOptions, +): string[] => { const starts = [ ...connections.filter(({ from }) => from === 'start').map(({ to }) => to), ...connections.filter(({ to }) => to === 'start').map(({ from }) => from), ] const pathes: Route[] = [] for (const start of starts) { - navigateCaves(connections, ['start', start], (route) => { - pathes.push(route) - }) + navigateCaves( + connections, + ['start', start], + (route) => { + pathes.push(route) + }, + options, + ) } return pathes.map(routeToString) } diff --git a/day12/solution.spec.ts b/day12/solution.spec.ts index b356a17..7440225 100644 --- a/day12/solution.spec.ts +++ b/day12/solution.spec.ts @@ -1,6 +1,7 @@ import { findPathes, parseMap } from './caveNavigator' const example1 = ['start-A', 'start-b', 'A-c', 'A-b', 'b-d', 'A-end', 'b-end'] + const example2 = [ 'dc-end', 'HN-start', @@ -63,7 +64,7 @@ describe('Day 12: Passage Pathing', () => { describe('Part 1', () => { it('should solve the first example', () => { const pathes = findPathes(parseMap(example1)) - expect(pathes).toHaveLength(10) + expect(pathes.length).toEqual(10) expect(pathes.sort((a, b) => a.localeCompare(b))).toEqual( [ 'start,A,b,A,c,A,end', @@ -81,7 +82,7 @@ describe('Day 12: Passage Pathing', () => { }) it('should solve the second example', () => { const pathes = findPathes(parseMap(example2)) - expect(pathes).toHaveLength(19) + expect(pathes.length).toEqual(19) expect(pathes.sort((a, b) => a.localeCompare(b))).toEqual( [ 'start,HN,dc,HN,end', @@ -106,13 +107,64 @@ describe('Day 12: Passage Pathing', () => { ].sort((a, b) => a.localeCompare(b)), ) }) - it('should solve the third example', () => { - const pathes = findPathes(parseMap(example3)) - expect(pathes).toHaveLength(226) - }) - it('should solve the puzzle', () => { - const pathes = findPathes(parseMap(input)) - expect(pathes).toHaveLength(5252) + it('should solve the third example', () => + expect(findPathes(parseMap(example3)).length).toEqual(226)) + it('should solve the puzzle', () => + expect(findPathes(parseMap(input)).length).toEqual(5252)) + }) + describe('Part 2', () => { + const options = { + allowOneSmallCaveTwice: true, + } + it('should solve the first example', () => { + const pathes = findPathes(parseMap(example1), options) + expect(pathes.length).toEqual(36) + expect(pathes.sort((a, b) => a.localeCompare(b))).toEqual( + [ + 'start,A,b,A,b,A,c,A,end', + 'start,A,b,A,b,A,end', + 'start,A,b,A,b,end', + 'start,A,b,A,c,A,b,A,end', + 'start,A,b,A,c,A,b,end', + 'start,A,b,A,c,A,c,A,end', + 'start,A,b,A,c,A,end', + 'start,A,b,A,end', + 'start,A,b,d,b,A,c,A,end', + 'start,A,b,d,b,A,end', + 'start,A,b,d,b,end', + 'start,A,b,end', + 'start,A,c,A,b,A,b,A,end', + 'start,A,c,A,b,A,b,end', + 'start,A,c,A,b,A,c,A,end', + 'start,A,c,A,b,A,end', + 'start,A,c,A,b,d,b,A,end', + 'start,A,c,A,b,d,b,end', + 'start,A,c,A,b,end', + 'start,A,c,A,c,A,b,A,end', + 'start,A,c,A,c,A,b,end', + 'start,A,c,A,c,A,end', + 'start,A,c,A,end', + 'start,A,end', + 'start,b,A,b,A,c,A,end', + 'start,b,A,b,A,end', + 'start,b,A,b,end', + 'start,b,A,c,A,b,A,end', + 'start,b,A,c,A,b,end', + 'start,b,A,c,A,c,A,end', + 'start,b,A,c,A,end', + 'start,b,A,end', + 'start,b,d,b,A,c,A,end', + 'start,b,d,b,A,end', + 'start,b,d,b,end', + 'start,b,end', + ].sort((a, b) => a.localeCompare(b)), + ) }) + it('should solve the second example', () => + expect(findPathes(parseMap(example2), options).length).toEqual(103)) + it('should solve the third example', () => + expect(findPathes(parseMap(example3), options).length).toEqual(3509)) + it('should solve the puzzle', () => + expect(findPathes(parseMap(input), options).length).toEqual(147784)) }) }) From 587009eba9f224b24eaa45b6a199cbda6a586072 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Mon, 13 Dec 2021 08:53:00 +0100 Subject: [PATCH 092/110] WIP --- day13/solution.spec.ts | 158 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 day13/solution.spec.ts diff --git a/day13/solution.spec.ts b/day13/solution.spec.ts new file mode 100644 index 0000000..d46e1c4 --- /dev/null +++ b/day13/solution.spec.ts @@ -0,0 +1,158 @@ +const example = [ + '6,10', + '0,14', + '9,10', + '0,3', + '10,4', + '4,11', + '6,0', + '6,12', + '4,1', + '0,13', + '10,12', + '3,4', + '3,0', + '8,4', + '1,10', + '2,14', + '8,10', + '9,0', + '', + 'fold along y=7', + 'fold along x=5', +] + +type Position = [x: number, y: number] +type Fold = { x: number } | { y: number } +const parseInstructions = ( + input: string[], +): { + coordinates: Position[] + folds: Fold[] +} => { + const coordinates: Position[] = [] + const folds: Fold[] = [] + for (const line of input.filter((s) => s.length > 0)) { + if (line.startsWith('fold along')) { + const res = line.match(/fold along (x|y)=([0-9]+)/) + const amount = parseInt(res?.[2] ?? '', 10) + if (res?.[1] === 'x') { + folds.push({ x: amount }) + } else { + folds.push({ y: amount }) + } + } else { + const [x, y] = line.split(',').map((s) => parseInt(s, 10)) + coordinates.push([x, y]) + } + } + return { + coordinates, + folds, + } +} + +/** + * . 0 + * . . + * . . + * - > + * . . + * . . + * 5 . + */ +const flip = (pos: number, flipPos: number): number => { + const delta = pos - flipPos + if (delta === 0) return pos + const flipped = pos - delta * 2 + if (flipped < 0) throw new Error(`Failed to flip ${pos} at ${flipPos}`) + return flipped +} + +describe('flip()', () => { + it.each([ + [14, 7, 0], + [13, 7, 1], + [8, 7, 6], + [7, 7, 7], + ])('should flip position %d folded at %d to %d', (n, flipPos, expected) => { + expect(flip(n, flipPos)).toEqual(expected) + }) +}) + +const fold = (coordinates: Position[], fold: Fold): Position[] => { + const folded: Position[] = [] + // const maxX = coordinates.reduce((maxX, [x]) => (x > maxX ? x : maxX), 0) + //const maxY = coordinates.reduce((maxY, [, y]) => (y > maxY ? y : maxY), 0) + // Horizontal fold + if ('y' in fold) { + // Copy all points above y + folded.push(...coordinates.filter(([, y]) => y <= fold.y)) + // Flip y for all points on and below + folded.push( + ...coordinates + .filter(([, y]) => y > fold.y) + .map(([x, y]) => [x, flip(y, fold.y)] as Position), + ) + } + return folded +} + +const render = (coordinates: Position[]): string => { + const maxX = coordinates.reduce((maxX, [x]) => (x > maxX ? x : maxX), 0) + const maxY = coordinates.reduce((maxY, [, y]) => (y > maxY ? y : maxY), 0) + const dots: string[][] = [] + for (let y = 0; y < maxY; y++) { + dots[y] = [] + for (let x = 0; x < maxX; x++) { + const dot = coordinates.find(([dotX, dotY]) => dotX === x && dotY === y) + if (dot === undefined) { + dots[y][x] = '.' + } else { + dots[y][x] = '#' + } + } + } + return dots.map((s) => s.join('')).join('\n') +} + +describe('parseInstructions()', () => { + it('should parse instructions', () => { + const { coordinates, folds } = parseInstructions(example) + expect(coordinates).toHaveLength(18) + expect(coordinates).toContainEqual([10, 12]) + expect(folds).toEqual([{ y: 7 }, { x: 5 }]) + console.log(render(coordinates)) + expect(render(coordinates)).toEqual( + [ + '...#..#..#.', + '....#......', + '...........', + '#..........', + '...#....#.#', + '...........', + '...........', + '...........', + '...........', + '...........', + '.#....#.##.', + '....#......', + '......#...#', + '#..........', + '#.#........', + ].join('\n'), + ) + }) +}) + +describe('Day 13: Transparent Origami', () => { + describe('Part 1', () => { + it('should solve the example', () => { + const { coordinates, folds } = parseInstructions(example) + expect(coordinates).toHaveLength(18) + const folded = fold(coordinates, folds[0]) + // expect(folded).toHaveLength(17) + console.log(render(folded)) + }) + }) +}) From 4740bdc5b414716173b4fa60737b62b088e21331 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Mon, 13 Dec 2021 09:16:42 +0100 Subject: [PATCH 093/110] feat(day13): part 1 --- day13/flip.spec.ts | 12 + day13/flip.ts | 16 + day13/fold.ts | 69 ++++ day13/input.txt | 809 +++++++++++++++++++++++++++++++++++++ day13/parseInstructions.ts | 29 ++ day13/render.ts | 27 ++ day13/solution.spec.ts | 129 ++---- 7 files changed, 993 insertions(+), 98 deletions(-) create mode 100644 day13/flip.spec.ts create mode 100644 day13/flip.ts create mode 100644 day13/fold.ts create mode 100644 day13/input.txt create mode 100644 day13/parseInstructions.ts create mode 100644 day13/render.ts diff --git a/day13/flip.spec.ts b/day13/flip.spec.ts new file mode 100644 index 0000000..98a3fe9 --- /dev/null +++ b/day13/flip.spec.ts @@ -0,0 +1,12 @@ +import { flip } from './flip' + +describe('flip()', () => { + it.each([ + [14, 7, 0], + [13, 7, 1], + [8, 7, 6], + [7, 7, 7], + ])('should flip position %d folded at %d to %d', (n, flipPos, expected) => { + expect(flip(n, flipPos)).toEqual(expected) + }) +}) diff --git a/day13/flip.ts b/day13/flip.ts new file mode 100644 index 0000000..1ea4028 --- /dev/null +++ b/day13/flip.ts @@ -0,0 +1,16 @@ +/** + * . 0 + * . . + * . . + * - > + * . . + * . . + * 5 . + */ +export const flip = (pos: number, flipPos: number): number => { + const delta = pos - flipPos + if (delta === 0) return pos + const flipped = pos - delta * 2 + if (flipped < 0) throw new Error(`Failed to flip ${pos} at ${flipPos}`) + return flipped +} diff --git a/day13/fold.ts b/day13/fold.ts new file mode 100644 index 0000000..80bff76 --- /dev/null +++ b/day13/fold.ts @@ -0,0 +1,69 @@ +import { flip } from './flip' +import { Fold, Position } from './parseInstructions' + +export const fold = ( + { + coordinates, + maxX, + maxY, + }: { + coordinates: Position[] + maxX?: number + maxY?: number + }, + fold: Fold, +): { + coordinates: Position[] + maxX: number + maxY: number +} => { + const folded: Position[] = [] + maxX = maxX ?? coordinates.reduce((maxX, [x]) => (x > maxX ? x : maxX), 0) + maxY = maxY ?? coordinates.reduce((maxY, [, y]) => (y > maxY ? y : maxY), 0) + // Horizontal fold + if ('y' in fold) { + // Copy all points above y + folded.push(...coordinates.filter(([, y]) => y <= fold.y)) + // Flip y for all points on and below + folded.push( + ...coordinates + .filter(([, y]) => y > fold.y) + .map(([x, y]) => [x, flip(y, fold.y)] as Position), + ) + return { + coordinates: removeDupes(folded), + maxX, + maxY: fold.y - 1, + } + } + // Vertical fold + // Copy all points left of x + folded.push(...coordinates.filter(([x]) => x <= fold.x)) + // Flip y for all points on and below + folded.push( + ...coordinates + .filter(([x]) => x > fold.x) + .map(([x, y]) => [flip(x, fold.x), y] as Position), + ) + return { + coordinates: removeDupes(folded), + maxX: fold.x - 1, + maxY, + } +} + +const removeDupes = (coordinates: Position[]): Position[] => { + const uniquePoints: Position[] = [] + const dotMap = coordinates.reduce((dotMap, [x, y]) => { + if (dotMap[y] === undefined) dotMap[y] = [] + dotMap[y][x] = true + return dotMap + }, [] as boolean[][]) + for (let y = 0; y < dotMap.length; y++) { + for (let x = 0; x < dotMap[y]?.length ?? 0; x++) { + const level = dotMap[y][x] + if (level !== undefined) uniquePoints.push([x, y]) + } + } + return uniquePoints +} diff --git a/day13/input.txt b/day13/input.txt new file mode 100644 index 0000000..7f69cf1 --- /dev/null +++ b/day13/input.txt @@ -0,0 +1,809 @@ +1053,618 +966,812 +363,813 +663,488 +582,93 +112,175 +887,158 +647,406 +1049,281 +820,632 +828,429 +1208,203 +604,15 +308,721 +790,380 +1007,665 +60,456 +460,507 +192,639 +45,180 +192,626 +627,604 +458,435 +683,738 +1121,745 +435,285 +902,74 +246,522 +734,609 +1005,861 +776,610 +910,491 +189,745 +216,362 +559,427 +8,465 +551,229 +855,163 +875,609 +658,203 +1243,270 +853,859 +10,457 +1012,471 +587,320 +666,94 +1205,543 +646,599 +619,305 +862,473 +73,630 +228,406 +850,410 +720,339 +338,273 +1300,273 +728,93 +915,432 +390,599 +460,484 +589,522 +721,837 +557,298 +402,497 +1130,40 +908,497 +646,156 +872,466 +1161,674 +470,728 +751,736 +549,385 +633,33 +1012,423 +858,98 +490,878 +276,351 +999,665 +216,87 +892,603 +915,574 +236,295 +328,225 +1273,287 +768,127 +1169,661 +1079,288 +902,820 +768,623 +797,833 +524,429 +1123,812 +1002,721 +460,36 +574,746 +139,588 +965,143 +711,810 +1230,605 +910,28 +395,574 +1176,514 +438,807 +932,787 +489,735 +144,779 +940,193 +867,364 +920,508 +438,700 +7,635 +284,473 +98,700 +443,28 +1156,74 +1138,429 +716,75 +164,508 +701,714 +311,437 +256,432 +268,642 +271,733 +229,540 +180,376 +323,134 +1029,42 +400,476 +633,161 +733,883 +723,208 +355,626 +482,380 +793,386 +326,396 +1186,477 +1210,752 +261,165 +1111,778 +1265,714 +58,231 +1302,429 +95,427 +974,771 +378,787 +246,466 +187,812 +892,155 +378,15 +472,115 +1300,173 +627,380 +1278,571 +653,735 +1192,707 +1066,788 +445,403 +440,127 +431,765 +599,597 +98,787 +920,386 +559,19 +189,644 +291,276 +346,511 +291,813 +785,35 +1205,285 +214,91 +589,837 +310,812 +1044,19 +622,771 +1046,162 +418,333 +920,732 +805,674 +1289,801 +547,642 +1246,530 +706,15 +8,429 +1161,628 +1074,295 +124,513 +502,661 +945,63 +720,555 +432,511 +154,372 +1169,233 +555,639 +160,651 +377,310 +75,792 +448,421 +850,403 +366,381 +90,291 +180,40 +489,287 +1211,255 +822,460 +795,812 +1046,508 +984,498 +1170,686 +691,500 +669,283 +939,679 +27,626 +1289,462 +723,110 +146,588 +651,760 +634,411 +492,673 +341,163 +435,609 +1121,834 +1302,795 +835,213 +604,799 +228,854 +177,668 +482,429 +8,123 +1042,63 +982,669 +1283,156 +622,323 +10,621 +638,418 +373,852 +244,445 +515,82 +472,563 +966,628 +774,259 +391,93 +604,719 +633,733 +735,838 +458,877 +214,543 +638,266 +982,673 +879,681 +490,262 +900,445 +572,746 +964,487 +261,829 +408,820 +805,611 +129,523 +443,364 +118,707 +1123,306 +482,17 +964,511 +765,892 +612,193 +790,514 +115,28 +452,641 +301,467 +785,859 +18,855 +604,787 +472,775 +788,822 +969,163 +653,159 +736,652 +1212,194 +166,236 +515,677 +73,182 +1163,380 +624,598 +882,80 +677,733 +845,250 +1081,354 +134,380 +556,283 +524,465 +59,457 +236,519 +1150,651 +268,63 +923,217 +147,661 +1143,760 +507,787 +1307,358 +595,437 +688,323 +109,178 +852,17 +400,866 +70,333 +371,679 +646,74 +1158,240 +388,19 +815,358 +1310,221 +440,543 +957,427 +281,42 +850,627 +294,515 +266,539 +124,477 +1171,217 +723,494 +664,156 +52,585 +482,465 +172,148 +992,17 +1130,376 +1138,17 +336,323 +1297,434 +1033,534 +733,746 +1139,747 +622,547 +754,642 +1044,355 +711,532 +684,91 +212,219 +236,71 +1220,561 +735,56 +397,276 +918,331 +261,513 +105,543 +890,208 +875,698 +616,434 +672,364 +149,674 +21,462 +351,229 +1252,7 +892,333 +1251,457 +572,148 +343,885 +1260,767 +164,430 +922,427 +753,130 +1278,323 +1203,226 +723,574 +1049,596 +693,159 +187,306 +587,574 +1215,467 +360,801 +1213,130 +882,528 +1019,276 +1046,60 +1163,661 +242,609 +1302,205 +457,859 +1245,221 +1304,889 +721,372 +664,771 +219,698 +494,651 +589,57 +465,508 +927,795 +912,14 +505,348 +504,234 +1213,382 +462,639 +460,851 +545,674 +360,93 +77,746 +427,490 +1267,887 +134,541 +3,11 +1181,523 +581,630 +460,450 +248,285 +1116,627 +144,567 +21,541 +216,700 +1158,512 +124,829 +944,513 +574,652 +460,387 +199,163 +678,84 +72,829 +67,574 +135,738 +363,842 +519,514 +1005,33 +107,642 +507,339 +882,823 +1243,208 +940,682 +738,746 +961,661 +1129,723 +8,795 +590,555 +438,585 +870,35 +431,385 +1173,358 +277,534 +1212,700 +16,563 +174,382 +73,488 +239,232 +308,621 +102,243 +25,770 +736,893 +149,416 +1146,669 +646,820 +1243,574 +1123,588 +356,249 +392,107 +956,234 +527,330 +330,467 +947,842 +987,459 +664,599 +477,220 +1074,71 +648,453 +1029,337 +82,596 +828,514 +1131,213 +508,854 +848,639 +910,39 +346,63 +1000,194 +3,883 +1146,386 +8,596 +1304,5 +1129,815 +253,264 +759,665 +803,380 +684,697 +878,511 +761,543 +887,736 +513,833 +753,298 +149,266 +278,624 +654,673 +1047,801 +323,459 +341,64 +592,162 +460,15 +1171,588 +870,91 +828,140 +1258,540 +733,148 +388,355 +7,406 +622,541 +1051,494 +10,437 +1161,283 +1123,229 +100,752 +751,467 +284,193 +858,253 +117,333 +1158,437 +377,86 +127,703 +127,731 +10,273 +32,291 +828,380 +945,287 +199,283 +915,880 +43,7 +1222,397 +641,283 +714,439 +761,509 +305,681 +1118,178 +980,82 +1289,353 +97,764 +1240,113 +408,18 +1288,810 +795,588 +638,630 +448,473 +206,381 +177,674 +694,434 +92,878 +867,418 +646,295 +443,866 +902,893 +211,866 +30,408 +1064,820 +672,630 +187,229 +1220,337 +555,353 +305,33 +1303,635 +1042,700 +164,669 +1165,611 +6,889 +806,234 +944,381 +1118,255 +239,326 +725,394 +961,317 +395,763 +393,729 +1294,530 +797,681 +1203,668 +1091,698 +1084,375 +1302,596 +37,287 +149,628 +619,788 +1108,684 +223,681 +984,669 +987,134 +1171,431 +761,161 +902,746 +477,347 +1146,262 +257,618 +875,61 +350,84 +8,298 +1096,543 +192,66 +790,541 +1166,263 +1002,611 +1042,252 +102,691 +1123,431 +579,792 +1186,829 +823,760 +217,892 +688,771 +765,674 +2,691 +937,785 +211,418 +440,35 +836,376 +982,213 +562,128 +1094,700 +1258,585 +268,194 +377,584 +990,5 +915,131 +1213,512 +21,161 +556,194 +1049,829 +1192,187 +902,18 +257,276 +937,42 +513,61 +194,851 +1000,264 +67,270 +365,63 +358,710 +402,397 +124,417 +1237,264 +820,508 +542,127 +1033,808 +387,217 +683,380 +850,387 +818,262 +90,561 +264,60 +850,2 +677,353 +647,488 +1104,645 +761,385 +440,803 +1091,509 +937,852 +308,273 +1026,421 +202,641 +1260,127 +1079,606 +171,747 +853,404 +55,362 +790,353 +284,421 +1278,291 +323,211 +842,432 +577,148 +271,347 +964,831 +1094,428 +912,432 +1044,539 +803,9 +566,397 +1260,719 +400,418 +289,831 +1116,374 +758,299 +944,12 +1273,735 +1278,123 +267,229 +612,701 +708,802 +672,418 +267,677 +1161,546 +1016,877 +617,287 +1138,148 +659,760 +408,74 +626,803 +223,213 +545,892 +55,810 +918,563 +50,767 +947,529 +488,236 +460,520 +666,437 +1228,669 +1111,163 +803,555 +139,463 +10,9 +1042,194 +964,407 +172,435 +843,351 +388,539 +366,12 +154,74 +797,61 +505,674 +79,390 +525,859 +1230,746 +786,205 +132,822 +50,175 +974,323 +984,396 +848,252 +1304,441 +1250,691 +530,381 +552,651 +960,810 +1176,828 +965,751 +795,82 +202,458 +141,61 +351,665 +21,93 +1146,878 +16,630 +513,661 +900,876 +147,787 +604,879 +1116,491 +992,746 +1116,851 +276,787 +984,449 +733,235 +402,49 +227,703 +721,737 +883,191 +1231,504 +1282,803 +472,331 +445,340 +349,661 +972,416 +974,604 +192,642 +1278,347 +795,351 +833,347 +187,82 +1047,93 +1208,651 +452,884 +288,65 +32,795 +1034,614 +1064,466 +808,64 +465,250 +754,194 +902,690 +1091,385 +366,513 +855,778 +1021,63 +599,810 +964,273 +487,760 +587,624 +1133,674 +390,732 +599,362 +838,563 +882,814 +432,164 +912,462 +1026,212 +708,92 +520,380 +1260,787 +875,644 +189,149 +408,596 +726,113 +259,91 +1051,91 +259,168 + +fold along x=655 +fold along y=447 +fold along x=327 +fold along y=223 +fold along x=163 +fold along y=111 +fold along x=81 +fold along y=55 +fold along x=40 +fold along y=27 +fold along y=13 +fold along y=6 \ No newline at end of file diff --git a/day13/parseInstructions.ts b/day13/parseInstructions.ts new file mode 100644 index 0000000..299c0fb --- /dev/null +++ b/day13/parseInstructions.ts @@ -0,0 +1,29 @@ +export type Position = [x: number, y: number] +export type Fold = { x: number } | { y: number } +export const parseInstructions = ( + input: string[], +): { + coordinates: Position[] + folds: Fold[] +} => { + const coordinates: Position[] = [] + const folds: Fold[] = [] + for (const line of input.filter((s) => s.length > 0)) { + if (line.startsWith('fold along')) { + const res = /fold along (x|y)=([0-9]+)/.exec(line) + const amount = parseInt(res?.[2] ?? '', 10) + if (res?.[1] === 'x') { + folds.push({ x: amount }) + } else { + folds.push({ y: amount }) + } + } else { + const [x, y] = line.split(',').map((s) => parseInt(s, 10)) + coordinates.push([x, y]) + } + } + return { + coordinates, + folds, + } +} diff --git a/day13/render.ts b/day13/render.ts new file mode 100644 index 0000000..261ce80 --- /dev/null +++ b/day13/render.ts @@ -0,0 +1,27 @@ +import { Position } from './parseInstructions' + +export const render = ({ + coordinates, + maxX, + maxY, +}: { + coordinates: Position[] + maxX?: number + maxY?: number +}): string => { + maxX = maxX ?? coordinates.reduce((maxX, [x]) => (x > maxX ? x : maxX), 0) + maxY = maxY ?? coordinates.reduce((maxY, [, y]) => (y > maxY ? y : maxY), 0) + const dots: string[][] = [] + for (let y = 0; y <= maxY; y++) { + dots[y] = [] + for (let x = 0; x <= maxX; x++) { + const dot = coordinates.find(([dotX, dotY]) => dotX === x && dotY === y) + if (dot === undefined) { + dots[y][x] = '.' + } else { + dots[y][x] = '#' + } + } + } + return dots.map((s) => s.join('')).join('\n') +} diff --git a/day13/solution.spec.ts b/day13/solution.spec.ts index d46e1c4..ab092b6 100644 --- a/day13/solution.spec.ts +++ b/day13/solution.spec.ts @@ -1,3 +1,8 @@ +import { loader } from '../lib/loader' +import { fold } from './fold' +import { parseInstructions } from './parseInstructions' +import { render } from './render' + const example = [ '6,10', '0,14', @@ -22,99 +27,7 @@ const example = [ 'fold along x=5', ] -type Position = [x: number, y: number] -type Fold = { x: number } | { y: number } -const parseInstructions = ( - input: string[], -): { - coordinates: Position[] - folds: Fold[] -} => { - const coordinates: Position[] = [] - const folds: Fold[] = [] - for (const line of input.filter((s) => s.length > 0)) { - if (line.startsWith('fold along')) { - const res = line.match(/fold along (x|y)=([0-9]+)/) - const amount = parseInt(res?.[2] ?? '', 10) - if (res?.[1] === 'x') { - folds.push({ x: amount }) - } else { - folds.push({ y: amount }) - } - } else { - const [x, y] = line.split(',').map((s) => parseInt(s, 10)) - coordinates.push([x, y]) - } - } - return { - coordinates, - folds, - } -} - -/** - * . 0 - * . . - * . . - * - > - * . . - * . . - * 5 . - */ -const flip = (pos: number, flipPos: number): number => { - const delta = pos - flipPos - if (delta === 0) return pos - const flipped = pos - delta * 2 - if (flipped < 0) throw new Error(`Failed to flip ${pos} at ${flipPos}`) - return flipped -} - -describe('flip()', () => { - it.each([ - [14, 7, 0], - [13, 7, 1], - [8, 7, 6], - [7, 7, 7], - ])('should flip position %d folded at %d to %d', (n, flipPos, expected) => { - expect(flip(n, flipPos)).toEqual(expected) - }) -}) - -const fold = (coordinates: Position[], fold: Fold): Position[] => { - const folded: Position[] = [] - // const maxX = coordinates.reduce((maxX, [x]) => (x > maxX ? x : maxX), 0) - //const maxY = coordinates.reduce((maxY, [, y]) => (y > maxY ? y : maxY), 0) - // Horizontal fold - if ('y' in fold) { - // Copy all points above y - folded.push(...coordinates.filter(([, y]) => y <= fold.y)) - // Flip y for all points on and below - folded.push( - ...coordinates - .filter(([, y]) => y > fold.y) - .map(([x, y]) => [x, flip(y, fold.y)] as Position), - ) - } - return folded -} - -const render = (coordinates: Position[]): string => { - const maxX = coordinates.reduce((maxX, [x]) => (x > maxX ? x : maxX), 0) - const maxY = coordinates.reduce((maxY, [, y]) => (y > maxY ? y : maxY), 0) - const dots: string[][] = [] - for (let y = 0; y < maxY; y++) { - dots[y] = [] - for (let x = 0; x < maxX; x++) { - const dot = coordinates.find(([dotX, dotY]) => dotX === x && dotY === y) - if (dot === undefined) { - dots[y][x] = '.' - } else { - dots[y][x] = '#' - } - } - } - return dots.map((s) => s.join('')).join('\n') -} +const input = parseInstructions(loader(13)('input')) describe('parseInstructions()', () => { it('should parse instructions', () => { @@ -122,8 +35,7 @@ describe('parseInstructions()', () => { expect(coordinates).toHaveLength(18) expect(coordinates).toContainEqual([10, 12]) expect(folds).toEqual([{ y: 7 }, { x: 5 }]) - console.log(render(coordinates)) - expect(render(coordinates)).toEqual( + expect(render({ coordinates })).toEqual( [ '...#..#..#.', '....#......', @@ -150,9 +62,30 @@ describe('Day 13: Transparent Origami', () => { it('should solve the example', () => { const { coordinates, folds } = parseInstructions(example) expect(coordinates).toHaveLength(18) - const folded = fold(coordinates, folds[0]) - // expect(folded).toHaveLength(17) - console.log(render(folded)) + const folded1 = fold({ coordinates }, folds[0]) + expect(folded1.coordinates).toHaveLength(17) + expect(render(folded1)).toEqual( + [ + '#.##..#..#.', + '#...#......', + '......#...#', + '#...#......', + '.#.#..#.###', + '...........', + '...........', + ].join('\n'), + ) + const folded2 = fold(folded1, folds[1]) + expect(folded2.coordinates).toHaveLength(16) + expect(render(folded2)).toEqual( + ['#####', '#...#', '#...#', '#...#', '#####', '.....', '.....'].join( + '\n', + ), + ) + }) + it('should solve the puzzle', () => { + const folded = fold({ coordinates: input.coordinates }, input.folds[0]) + expect(folded.coordinates).toHaveLength(666) }) }) }) From a8be7581ba2f04e01d853472af7cb9495c40dcba Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Mon, 13 Dec 2021 09:21:47 +0100 Subject: [PATCH 094/110] feat(day13): part 2 --- day13/fold.ts | 12 +++++++----- day13/solution.spec.ts | 12 +++++++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/day13/fold.ts b/day13/fold.ts index 80bff76..a97bfa7 100644 --- a/day13/fold.ts +++ b/day13/fold.ts @@ -1,6 +1,12 @@ import { flip } from './flip' import { Fold, Position } from './parseInstructions' +export type Sheet = { + coordinates: Position[] + maxX: number + maxY: number +} + export const fold = ( { coordinates, @@ -12,11 +18,7 @@ export const fold = ( maxY?: number }, fold: Fold, -): { - coordinates: Position[] - maxX: number - maxY: number -} => { +): Sheet => { const folded: Position[] = [] maxX = maxX ?? coordinates.reduce((maxX, [x]) => (x > maxX ? x : maxX), 0) maxY = maxY ?? coordinates.reduce((maxY, [, y]) => (y > maxY ? y : maxY), 0) diff --git a/day13/solution.spec.ts b/day13/solution.spec.ts index ab092b6..feb1ad7 100644 --- a/day13/solution.spec.ts +++ b/day13/solution.spec.ts @@ -1,5 +1,5 @@ import { loader } from '../lib/loader' -import { fold } from './fold' +import { fold, Sheet } from './fold' import { parseInstructions } from './parseInstructions' import { render } from './render' @@ -88,4 +88,14 @@ describe('Day 13: Transparent Origami', () => { expect(folded.coordinates).toHaveLength(666) }) }) + describe('Part 2', () => { + it('should solve the puzzle', () => { + let folded: Sheet | undefined = undefined + for (const foldstep of input.folds) { + folded = fold(folded ?? { coordinates: input.coordinates }, foldstep) + } + console.log(render(folded as Sheet)) // CJHAZHKU + expect(folded?.coordinates).toHaveLength(97) + }) + }) }) From 526e72acc008f289d973e675d957f710bdcfb38b Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Mon, 13 Dec 2021 09:24:01 +0100 Subject: [PATCH 095/110] feat(day13): allow to customize render --- day13/render.ts | 23 +++++++++++++---------- day13/solution.spec.ts | 2 +- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/day13/render.ts b/day13/render.ts index 261ce80..de1ad0c 100644 --- a/day13/render.ts +++ b/day13/render.ts @@ -1,14 +1,17 @@ import { Position } from './parseInstructions' -export const render = ({ - coordinates, - maxX, - maxY, -}: { - coordinates: Position[] - maxX?: number - maxY?: number -}): string => { +export const render = ( + { + coordinates, + maxX, + maxY, + }: { + coordinates: Position[] + maxX?: number + maxY?: number + }, + blank?: string, +): string => { maxX = maxX ?? coordinates.reduce((maxX, [x]) => (x > maxX ? x : maxX), 0) maxY = maxY ?? coordinates.reduce((maxY, [, y]) => (y > maxY ? y : maxY), 0) const dots: string[][] = [] @@ -17,7 +20,7 @@ export const render = ({ for (let x = 0; x <= maxX; x++) { const dot = coordinates.find(([dotX, dotY]) => dotX === x && dotY === y) if (dot === undefined) { - dots[y][x] = '.' + dots[y][x] = blank ?? '.' } else { dots[y][x] = '#' } diff --git a/day13/solution.spec.ts b/day13/solution.spec.ts index feb1ad7..c8b0a54 100644 --- a/day13/solution.spec.ts +++ b/day13/solution.spec.ts @@ -94,7 +94,7 @@ describe('Day 13: Transparent Origami', () => { for (const foldstep of input.folds) { folded = fold(folded ?? { coordinates: input.coordinates }, foldstep) } - console.log(render(folded as Sheet)) // CJHAZHKU + console.log(render(folded as Sheet, ' ')) // CJHAZHKU expect(folded?.coordinates).toHaveLength(97) }) }) From 5f88bbb2521dd995bfb818a05e6e0f73bd931c17 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Tue, 14 Dec 2021 19:28:16 +0100 Subject: [PATCH 096/110] feat: day14 --- day14/countPairs.spec.ts | 32 +++++++++ day14/countPairs.ts | 17 +++++ day14/countingPairInsertion.spec.ts | 36 ++++++++++ day14/countingPairInsertion.ts | 34 ++++++++++ day14/pairInsertion.spec.ts | 36 ++++++++++ day14/pairInsertion.ts | 21 ++++++ day14/parseRule.ts | 6 ++ day14/rules.txt | 100 ++++++++++++++++++++++++++++ day14/solution.spec.ts | 91 +++++++++++++++++++++++++ 9 files changed, 373 insertions(+) create mode 100644 day14/countPairs.spec.ts create mode 100644 day14/countPairs.ts create mode 100644 day14/countingPairInsertion.spec.ts create mode 100644 day14/countingPairInsertion.ts create mode 100644 day14/pairInsertion.spec.ts create mode 100644 day14/pairInsertion.ts create mode 100644 day14/parseRule.ts create mode 100644 day14/rules.txt create mode 100644 day14/solution.spec.ts diff --git a/day14/countPairs.spec.ts b/day14/countPairs.spec.ts new file mode 100644 index 0000000..8598dd3 --- /dev/null +++ b/day14/countPairs.spec.ts @@ -0,0 +1,32 @@ +import { countPairs } from './countPairs' + +describe('countPairs()', () => { + it('should count pairs in a string', () => + expect(countPairs('NNCB').pairs).toEqual({ + NN: 1, + NC: 1, + CB: 1, + })) + it('should count pairs in a string', () => + expect(countPairs('NCNBCHB').pairs).toEqual({ + NC: 1, + CN: 1, + NB: 1, + BC: 1, + CH: 1, + HB: 1, + })) + it('should count elements from pairs', () => + expect(countPairs('NNCB').elements).toEqual({ + N: 2, + C: 1, + B: 1, + })) + it('should count elements from pairs', () => + expect(countPairs('NCNBCHB').elements).toEqual({ + N: 2, + C: 2, + B: 2, + H: 1, + })) +}) diff --git a/day14/countPairs.ts b/day14/countPairs.ts new file mode 100644 index 0000000..d2a86e7 --- /dev/null +++ b/day14/countPairs.ts @@ -0,0 +1,17 @@ +/** + * Turns a sequence into a count of pairs and elements + */ +export const countPairs = ( + sequence: string, +): { pairs: Record; elements: Record } => { + const pairCount: Record = {} + const elementCount: Record = {} + for (let i = 1; i < sequence.length; i++) { + const pair = `${sequence[i - 1]}${sequence[i]}` + pairCount[pair] = (pairCount[pair] ?? 0) + 1 + } + for (const element of sequence) { + elementCount[element] = (elementCount[element] ?? 0) + 1 + } + return { pairs: pairCount, elements: elementCount } +} diff --git a/day14/countingPairInsertion.spec.ts b/day14/countingPairInsertion.spec.ts new file mode 100644 index 0000000..8e46de5 --- /dev/null +++ b/day14/countingPairInsertion.spec.ts @@ -0,0 +1,36 @@ +import { countingPairInsertion } from './countingPairInsertion' +import { countPairs } from './countPairs' +import { parseRule } from './parseRule' + +describe('countingPairInsertion()', () => { + it('should insert a new pair', () => { + expect( + countingPairInsertion( + { + pairs: { + NN: 1, + }, + elements: { + N: 2, + }, + }, + [['NN', 'C']], + ), + ).toMatchObject({ + pairs: { + NC: 1, + CN: 1, + }, + }) + }) + it('should solve the example', () => { + const count = countPairs(`NNCB`) + expect(count.pairs).toEqual({ + NN: 1, + NC: 1, + CB: 1, + }) + const rules = ['NN -> C', 'NC -> B', 'CB -> H'].map(parseRule) + expect(countingPairInsertion(count, rules)).toEqual(countPairs('NCNBCHB')) + }) +}) diff --git a/day14/countingPairInsertion.ts b/day14/countingPairInsertion.ts new file mode 100644 index 0000000..d00dc3e --- /dev/null +++ b/day14/countingPairInsertion.ts @@ -0,0 +1,34 @@ +import { Rule } from './parseRule' + +/** + * This implementation tracks pairs and element count and does not rely on concatenating a long string. + */ +export const countingPairInsertion = ( + { + pairs, + elements, + }: { pairs: Record; elements: Record }, + rules: Rule[], +): { pairs: Record; elements: Record } => { + const newPairs = { ...pairs } + const newElements = { ...elements } + for (const [pair, insertion] of rules) { + const pairCount = pairs[pair] + // The rule applies to a pair which does not exist + if (pairCount === undefined) continue + // Increment the counts for the two new resulting pairs + const [left, right] = pair + const leftPair = `${left}${insertion}` + const rightPair = `${insertion}${right}` + newPairs[leftPair] = (newPairs[leftPair] ?? 0) + pairCount + newPairs[rightPair] = (newPairs[rightPair] ?? 0) + pairCount + + // Remove replaced pairs (pairs are "split" in a left and a right pair, therefore they dissapear) + newPairs[pair] = (newPairs[pair] ?? 0) - pairCount + if (newPairs[pair] === 0) delete newPairs[pair] + + // Increase the count for the inserted element + newElements[insertion] = (newElements[insertion] ?? 0) + pairCount + } + return { pairs: newPairs, elements: newElements } +} diff --git a/day14/pairInsertion.spec.ts b/day14/pairInsertion.spec.ts new file mode 100644 index 0000000..e2b3710 --- /dev/null +++ b/day14/pairInsertion.spec.ts @@ -0,0 +1,36 @@ +import { pairInsertion } from './pairInsertion' +import { parseRule } from './parseRule' + +const exampleRules = [ + 'CH -> B', + 'HH -> N', + 'CB -> H', + 'NH -> C', + 'HB -> C', + 'HC -> B', + 'HN -> C', + 'NN -> C', + 'BH -> H', + 'NC -> B', + 'NB -> B', + 'BN -> B', + 'BB -> N', + 'BC -> B', + 'CC -> N', + 'CN -> C', +].map(parseRule) + +const exampleTemplate = `NNCB` + +describe('pairInsertion()', () => { + let input = exampleTemplate + it.each([ + ['NCNBCHB'], + ['NBCCNBBBCBHCB'], + ['NBBBCNCCNBBNBNBBCHBHHBCHB'], + ['NBBNBNBBCCNBCNCCNBBNBBNBBBNBBNBBCBHCBHHNHCBBCBHCB'], + ])('should turn pair into %s', (expected) => { + input = pairInsertion(input, exampleRules) + return expect(input).toEqual(expected) + }) +}) diff --git a/day14/pairInsertion.ts b/day14/pairInsertion.ts new file mode 100644 index 0000000..37216df --- /dev/null +++ b/day14/pairInsertion.ts @@ -0,0 +1,21 @@ +import { Rule } from './parseRule' + +/** + * Naive implementation: + * go through the template string and insert the element between every matching pair. + * + * @deprecated Memory intensive. Use {@link countingPairInsertion}. + */ +export const pairInsertion = (template: string, rules: Rule[]): string => { + const result: string[] = [] + for (let i = 0; i < template.length; i++) { + const pair = `${template[i - 1] ?? ''}${template[i]}` + const matchingRule = rules.find(([rulePair]) => rulePair === pair) + if (matchingRule !== undefined) { + // Insert the element before the current half pair + result.push(matchingRule[1]) + } + result.push(template[i]) + } + return result.join('') +} diff --git a/day14/parseRule.ts b/day14/parseRule.ts new file mode 100644 index 0000000..3250c1d --- /dev/null +++ b/day14/parseRule.ts @@ -0,0 +1,6 @@ +export type Rule = [pair: string, insertion: string] + +export const parseRule = (rule: string): Rule => { + const [pair, , insertion] = rule.split(' ') + return [pair, insertion] +} diff --git a/day14/rules.txt b/day14/rules.txt new file mode 100644 index 0000000..7b4106e --- /dev/null +++ b/day14/rules.txt @@ -0,0 +1,100 @@ +SV -> C +SF -> P +BP -> V +HC -> B +PK -> B +NF -> C +SN -> N +PF -> S +ON -> S +FC -> C +PN -> P +SC -> B +KS -> V +OS -> S +NC -> C +VH -> N +OH -> C +BB -> H +KV -> V +HP -> S +CP -> H +SO -> F +KK -> N +OO -> C +SH -> O +PB -> S +KP -> H +OC -> K +BN -> F +HH -> S +CH -> B +PC -> V +SB -> N +KO -> H +BH -> B +SK -> K +KF -> S +NH -> O +HN -> V +VN -> F +BC -> V +VP -> C +KN -> H +PV -> S +HB -> V +VV -> O +PO -> B +FN -> H +PP -> B +BF -> S +CB -> S +NK -> F +NO -> B +CC -> S +OF -> C +HS -> H +SP -> C +VB -> V +BK -> S +CO -> O +NS -> K +PH -> O +BV -> B +CK -> F +VC -> S +HK -> B +BO -> K +HV -> F +KC -> V +CN -> H +FS -> V +VS -> N +CF -> K +VO -> F +FH -> H +NB -> N +PS -> P +OK -> N +CV -> O +CS -> K +HO -> C +KB -> P +NN -> V +KH -> C +OB -> V +BS -> O +FB -> H +FF -> K +HF -> P +FO -> F +VF -> F +OP -> S +VK -> K +OV -> N +FK -> H +FP -> H +NV -> H +NP -> N +SS -> C +FV -> N \ No newline at end of file diff --git a/day14/solution.spec.ts b/day14/solution.spec.ts new file mode 100644 index 0000000..a9e5e94 --- /dev/null +++ b/day14/solution.spec.ts @@ -0,0 +1,91 @@ +import { loader } from '../lib/loader' +import { countingPairInsertion } from './countingPairInsertion' +import { countPairs } from './countPairs' +import { pairInsertion } from './pairInsertion' +import { parseRule } from './parseRule' + +const exampleRules = [ + 'CH -> B', + 'HH -> N', + 'CB -> H', + 'NH -> C', + 'HB -> C', + 'HC -> B', + 'HN -> C', + 'NN -> C', + 'BH -> H', + 'NC -> B', + 'NB -> B', + 'BN -> B', + 'BB -> N', + 'BC -> B', + 'CC -> N', + 'CN -> C', +].map(parseRule) + +const exampleTemplate = `NNCB` + +const rules = loader(14)('rules').map(parseRule) +const template = `VNVVKSNNFPBBBVSCVBBC` + +describe('Day 14: Extended Polymerization', () => { + describe('Part 1', () => { + const countElements = (sequence: string): Record => + sequence.split('').reduce( + (count, el) => ({ + ...count, + [el]: (count?.[el] ?? 0) + 1, + }), + {} as Record, + ) + + it('should solve the example', () => { + let input = exampleTemplate + for (let step = 0; step < 10; step++) { + input = pairInsertion(input, exampleRules) + } + const count = countElements(input) + expect(count['B']).toEqual(1749) + expect(count['C']).toEqual(298) + expect(count['H']).toEqual(161) + expect(count['N']).toEqual(865) + }) + it('should solve the puzzle', () => { + let input = template + for (let step = 0; step < 10; step++) { + input = pairInsertion(input, rules) + } + const count = countElements(input) + const sorted = Object.entries(count).sort(([, c1], [, c2]) => c2 - c1) + expect(sorted[0][1] - sorted[sorted.length - 1][1]).toEqual(2621) + }) + }) + + /** + * Part 2 no longer works with the implementation from part 1, because of + * the exponential growth, so I switched to an implementation that keeps + * track of the number of pairs and elements instead. + */ + describe('Part 2', () => { + it('should solve the puzzle', () => { + let input = countPairs(exampleTemplate) + for (let step = 0; step < 10; step++) { + input = countingPairInsertion(input, exampleRules) + } + const count = input.elements + expect(count['B']).toEqual(1749) + expect(count['C']).toEqual(298) + expect(count['H']).toEqual(161) + expect(count['N']).toEqual(865) + }) + it('should solve the puzzle', () => { + let input = countPairs(template) + for (let step = 0; step < 40; step++) { + input = countingPairInsertion(input, rules) + } + const count = input.elements + const sorted = Object.entries(count).sort(([, c1], [, c2]) => c2 - c1) + expect(sorted[0][1] - sorted[sorted.length - 1][1]).toEqual(2843834241366) + }) + }) +}) From 0ebdf3a7c9d229d5d60e891cab7ca4e45b565304 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 15 Dec 2021 12:33:19 +0100 Subject: [PATCH 097/110] feat(day15): attempt one First naive attempt which calculates the distance for all positions over and over again. Already too slow for part 1 of the puzzle. --- day15/input.txt | 100 +++++++++++++++++++++++++++++++++++++++++ day15/navigateCave.ts | 93 ++++++++++++++++++++++++++++++++++++++ day15/solution.spec.ts | 28 ++++++++++++ 3 files changed, 221 insertions(+) create mode 100644 day15/input.txt create mode 100644 day15/navigateCave.ts create mode 100644 day15/solution.spec.ts diff --git a/day15/input.txt b/day15/input.txt new file mode 100644 index 0000000..4d9ce88 --- /dev/null +++ b/day15/input.txt @@ -0,0 +1,100 @@ +9288988799169797672494749255119669898996573999583986189239999598984799822348965745856766795499834649 +9336897879889887886178547878932383343897969375528317888596414912984889899896681582897852799987698919 +1897778869898975348195967299799218929299986987238888983439837668176288929486984281998883997689928399 +9929379596989975588919354989848824879259338981764649316939699414591798996277899778297863349896687529 +9299536973198975989668639599981992969988798261739729688719716614897359549861961677579672523167986511 +7987961623297525864967191899298165876452579892878669981979557529983329311935283984796198899331498766 +9933188395912993489929878928979164799949214314685899999949959978164816779811128692799288826655771954 +9879411158118811985997999759791869896995299827179998882766687888891885997982991692167933582892854156 +9998631525957988118287969721874572682352527971791899771898918585995689953667683999169491381879997972 +9148272678595823589879662996981998894898844679741994169298499959867934999532187299167299186241998292 +8967886285928969877498814378999894469497368728914983178727691699718399654813956289713487981828996297 +2999393515291995229979897899399596921679288483969795189979696985897255988985689416376934128997218299 +7817696897253996999651997969929981349899123948992659879897887667199775989882958778899293892998989276 +9638635592568249933748715589514111329963291898199473693991698996362848147964599284195681914957329467 +4958169729641951781983588759859969499895795879488199984497178298368899238979649719927899818641998489 +9975869369989998759115433978632495978793749977511549989984223394977735997142889411977899995898137993 +9459965977995489288474399895689998695961956993692699421769614323193479393955974793991182999979389958 +8994981918488815875941366194919798679996477924993929237972119998926286352895291999868513555622933869 +9978788955499954429538318136599937492729898626382799896379749839156697643991476929999443913972759281 +9789326441993961917529769129211514818927459529999665126819834992573899989577699452197919499789111899 +5645266999796592329963869997412285981628471859718122319982899417968932949924886989359739949384198886 +4151433899456957966682999728989743799492988668799291189825989779923276699886797988429994794438971668 +7192698711984233938996888119995889991972929159599994289919539966249787249972571194978959978992687611 +2188999661989826988581693997894588683797868679171937998388999529486952918189269993969428519963791967 +9861892485895498492212599425976855994975985912626678899459997129997798893717498885748998996987987997 +6362488549459179788479968499975364362547921271989899979997419937987319622952986237496986284699314297 +5497988785661358759985368549985499987879978818164923953194687168865459988799882727999431919418957792 +8921689612499495196716939839129969948877994484939159896618549595749671852996979999898289792879849397 +9117892818987897191767559599815947974867469568839917771471898394159117985171699936812298616598548579 +9499687172935737495154289999572674963694459699667979694997258367529924396919185817635144899393296999 +9359917393876189496794996228496429878984488199998998519969886192894999822998691883882855832938745789 +5991899864977697724629999715775227413957489939767875967492379866938689479737899737238139929793229691 +8773773941114912996998195388691327897589927937565864699875956954763217688963799581693978929456769918 +3789413727298922758699481168799996951192669889822813961131496997515599269239941498598558992664989219 +6593995867928869718437459956978746861975998936541855894996991791844649276462868699996942599192789759 +1993341135872935287172387257312453769899771419861468869997994169176169949614122255777814279818269918 +2969135998691189572857989199653891178966992543799975499874487811962496191967999489743499839598884687 +9787789572211797194337999256191563897691817781945298867986284396979988791729938633187393569589869918 +2299959163318689978729376684584292391777894958897598287996132978169997894991998998599977549738278923 +3691949798949888798168941149915567331911818129929718518938167387689939299824771197638987817379892989 +9749785619856999652449487875688981561193591826594362649994939666967979778512799696341955711919984978 +9881927664728581359934177289639895786194274231975664274195899997999687929598893691365837899273425129 +9919419886679822926611867726862553187195651759289168197679985899689947964717915885111276899888197966 +9231598837249477616689995515695824792669591942461898459897688991749911988958996929699359978565275725 +2892658244889159188897479599898949898749977971288388998787787997948558944985976998979898962172685897 +9979588759684339829796553677828895958589919229599989589392589747761568985977998861579949161187997233 +6287215915683729958932894699999247639399978989597899848299991995847221899992518166862818775179559971 +2799894917998999998874784789594789858417957771571473748859999329599135947687373576896989993589961874 +5921848262785779887771299979768834439798859747883569786946978457756498658975779671982998713657998999 +9997786782929186285839956198479977866697199917635186717999819821816856594838498858245992265954264934 +9954997215627599265929978387691134766992481123697456499693917895998289479717119612991968988158439691 +9916272332984989918199969936999599699155379896778714667674586619938853681649448451872845859999239829 +1256399471117548567985989955892899689887699697686297558119846998699918385686487875399995279928741588 +7177168446299683823212949816929791389289577545289534897191769788823948882469977935993994579671821187 +6979892421886929946739955799883719139893871273491387787287522865999759437718571283535249569138967648 +4145997935994642989996771886889569927531998999268917912388818819496782276477165999995719866649747764 +8898899748735667899752999477989593963868993879144929617748885292969974337666618879885768988931287698 +9196988991448764896467189989479747838137156849499359959399476958168494834619648549898691614999879739 +7925876418947885867316298842933587498796372993949569174199698294898468184868798782855986566997769253 +5999995536941691894699798926989158981998299942565537791869569799989677238748115794415979948626971297 +8896561829785751826769983485679999991699195576827934937515391627992938198466316849988998981931463975 +1678992985845917991999559999398498659179639589116974399879277638914599511895856993791955948698936769 +8723555973519986597726497991769996916871959668366828894199899193915299198488937535299891992439299937 +9859879779999559469859989149991235571476226458448738485449684831869569129983688918615773979995919197 +1762274915495299837161988958831218291579987895596819387889529513259546684889197517888399895193724779 +2329987489878172595959982221592989791917892847896794565689456987698924854979316862189958639879898937 +7711657684176742515913464892986549152966165389597999969269518687598991498112999894982942789276718458 +9989179928937989827799268436844255995598521878597942899959459198973751659286887993912795839916999399 +4567145965886799947748995493953341996258925919999689739976496999948828257798971787719678969851996746 +8553979659889688912787934849749991288998219549994188353936124999195218388671689915579964878413489665 +2458758981536446277157958999192653841815897922998795986691787998661699134582798739519913786926595735 +9233467899499484399916213919898118589935927969443759859978699389889676999696349897998592979919998299 +1621957847935871765819681398937934599688352958522142283796985527189865829779968678199997198567691768 +9673864188986737727887346587481936992239789665514689835781751549838861996989972756948968698623688959 +7897146188799288444495998299966977488868899799997994924917119827858775911816351681497482299111997691 +2568718799789199779398689847783149889479969577949265239141878557193889688765334449955197999914987965 +6939937695943799169928279532995937199758313658599658967819433777451979789913959439926566929189199369 +5999854888947964889779299422517269958222959149218639862111399697889988998988495479874922759149779792 +8898165192853343774932725119999895929144898798828668998787399878577998661677495889352267795135479958 +9578193578475986498984689899679398178897882619949696877398898259198963869894573999782235189917995779 +9614779614699666248931887454849181959988389121797844916823925964183788999781794279997178499292189339 +7154633697899892718176319474169673818225779991699839667193959375999134917851861694489619849782799983 +7616913966129714997489291681867995117771128927779449285994725191838843376673798698999374745869928979 +9818776583846956356779687821191959633714565781299649977899949519971939492224983479969178589787741359 +8699924979993138798977989952516599159628999129974189852977567885894191476728992769469629699859245899 +9913371369899982359888716676984987479626245958159698436779975279878971677837387679871384371297934939 +8599771948779192996924339399766946995298899149959179412988741928283199591227819893228869673194965697 +8489944889371697897296993939299713849254969988799792753882795824818789664812129936966999988791751921 +6976789988678861958199499445892799332971227632999989936177688529771589699899882978971429758899779998 +5968497692829128995138725999979828117911719698428448259968286871278658929934846599584982263818912698 +8958452959267676424741399686862372997728797445179742993896977988979989612483887199299999714618977759 +4999382992857889814779859518559958458978116999689569869899929626199925858874989715889286699966189192 +6821852498859387994787881789359711946699741427195989164226682888818389599911297889796498646148759263 +9985999614831878291177496865999896852915236956397629682728379999748678194954611317891917837599992421 +1898728946843198193289979889889991686685685399948883227849222754865945897392179762979369894261974859 +8239479653435399988579899419849928235496516187895769626582993984392699899597869988769889562986328589 +2749999498518999696779743457991992199779379529978126229362411788511691877869319879963998164177714684 +5499969865189779991198556392918514799593899919672411987351966179399942999818128941959596331883477879 +4719866799939881495699681785999974276299998443822677143998839821795639964258984499989679929197977689 +6994796719999998996693827884457853594797687747694968116959893999957898943799975585881539179956768118 \ No newline at end of file diff --git a/day15/navigateCave.ts b/day15/navigateCave.ts new file mode 100644 index 0000000..bf233d9 --- /dev/null +++ b/day15/navigateCave.ts @@ -0,0 +1,93 @@ +const diagonalPath = ([targetX, targetY]: [x: number, y: number]): [ + x: number, + y: number, +][] => { + const path: [x: number, y: number][] = [] + let x = 0 + let y = 0 + let xDist = targetX + let yDist = targetY + + while (xDist > 0 && yDist > 0) { + if (xDist > yDist) { + x++ + xDist-- + } else { + y++ + yDist-- + } + path.push([x, y]) + } + path.push([targetX, targetY]) + return path +} + +const navigateCave = ( + cave: number[][], + lowestRisk: () => number, + onPath: (_: number) => void, + y = 0, + x = 0, + risk = 0, +): void => { + // Reach the end (bottom right) + if (y === cave.length - 1 && x === cave[y].length - 1) { + onPath(risk) + } + // Follow the lowest risk path + // Don't move up or left + const down = cave[y + 1]?.[x] + const right = cave[y]?.[x + 1] + if (down !== undefined) { + if (risk + down < lowestRisk()) { + navigateCave(cave, lowestRisk, onPath, y + 1, x, risk + down) + } + } + if (right !== undefined) { + if (risk + right < lowestRisk()) { + navigateCave(cave, lowestRisk, onPath, y, x + 1, risk + right) + } + } +} + +export const lowestRiskPath = (cave: number[][]): number => { + // Create a baseline risk: a diagonal line + const line = diagonalPath([cave[cave.length - 1].length - 1, cave.length - 1]) + const lineRisk = line.reduce((risk, [x, y]) => risk + cave[y][x], 0) + let bestPath = lineRisk + console.log(bestPath) + navigateCave( + cave, + () => bestPath, + (risk) => { + if (risk < bestPath) { + console.log(`new best path`, risk) + bestPath = risk + } + }, + ) + return bestPath +} + +/* +import { loader } from '../lib/loader.js' +const input = loader(15)('input').map((s) => + s.split('').map((s) => parseInt(s, 10)), +) + +*/ + +const input = [ + '1163751742', + '1381373672', + '2136511328', + '3694931569', + '7463417111', + '1319128137', + '1359912421', + '3125421639', + '1293138521', + '2311944581', +].map((s) => s.split('').map((s) => parseInt(s, 10))) + +console.log(lowestRiskPath(input)) diff --git a/day15/solution.spec.ts b/day15/solution.spec.ts new file mode 100644 index 0000000..b8260ce --- /dev/null +++ b/day15/solution.spec.ts @@ -0,0 +1,28 @@ +import { loader } from '../lib/loader' +import { lowestRiskPath } from './navigateCave' + +const example = [ + '1163751742', + '1381373672', + '2136511328', + '3694931569', + '7463417111', + '1319128137', + '1359912421', + '3125421639', + '1293138521', + '2311944581', +].map((s) => s.split('').map((s) => parseInt(s, 10))) + +const input = loader(15)('input').map((s) => + s.split('').map((s) => parseInt(s, 10)), +) + +describe('Day 15: Chiton', () => { + describe('Part 1', () => { + it('should solve the example', () => + expect(lowestRiskPath(example)).toEqual(40)) + it.skip('should solve the puzzle', () => + expect(lowestRiskPath(input)).toEqual(40)) + }) +}) From 3ae3706fb5b7e014bbd049719f83f15532610765 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 15 Dec 2021 14:43:09 +0100 Subject: [PATCH 098/110] feat(day15): part 1 in where I remembered Dijkstra's algorithm. --- day15/navigateCave.ts | 143 +++++++++++++++++------------------------ day15/solution.spec.ts | 7 +- 2 files changed, 63 insertions(+), 87 deletions(-) diff --git a/day15/navigateCave.ts b/day15/navigateCave.ts index bf233d9..873355e 100644 --- a/day15/navigateCave.ts +++ b/day15/navigateCave.ts @@ -1,93 +1,70 @@ -const diagonalPath = ([targetX, targetY]: [x: number, y: number]): [ - x: number, - y: number, -][] => { - const path: [x: number, y: number][] = [] - let x = 0 - let y = 0 - let xDist = targetX - let yDist = targetY - - while (xDist > 0 && yDist > 0) { - if (xDist > yDist) { - x++ - xDist-- - } else { - y++ - yDist-- - } - path.push([x, y]) - } - path.push([targetX, targetY]) - return path -} - +/** + * Implements Dijkstra's algorithm to search cave + * + * @see https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm + */ const navigateCave = ( cave: number[][], - lowestRisk: () => number, - onPath: (_: number) => void, - y = 0, - x = 0, - risk = 0, + onEnd: (distance: number) => void, ): void => { - // Reach the end (bottom right) - if (y === cave.length - 1 && x === cave[y].length - 1) { - onPath(risk) - } - // Follow the lowest risk path - // Don't move up or left - const down = cave[y + 1]?.[x] - const right = cave[y]?.[x + 1] - if (down !== undefined) { - if (risk + down < lowestRisk()) { - navigateCave(cave, lowestRisk, onPath, y + 1, x, risk + down) + const unvisited: boolean[][] = [] + const distance: number[][] = [] + for (let y = 0; y < cave.length; y++) { + unvisited[y] = [] + distance[y] = [] + for (let x = 0; x < cave[y].length; x++) { + unvisited[y][x] = true + distance[y][x] = Number.MAX_SAFE_INTEGER } } - if (right !== undefined) { - if (risk + right < lowestRisk()) { - navigateCave(cave, lowestRisk, onPath, y, x + 1, risk + right) + distance[0][0] = 0 + let current: [x: number, y: number] | undefined = [0, 0] + while (current !== undefined) { + const [x, y] = current + const currentDistance = distance[y][x] + + if (cave[y - 1]?.[x] !== undefined && unvisited[y - 1][x]) { + const upDistance = cave[y - 1][x] + currentDistance + distance[y - 1][x] = Math.min(upDistance, distance[y - 1][x]) } - } -} + if (cave[y + 1]?.[x] !== undefined && unvisited[y + 1][x]) { + const downDistance = cave[y + 1][x] + currentDistance + distance[y + 1][x] = Math.min(downDistance, distance[y + 1][x]) + } + if (cave[y][x - 1] !== undefined && unvisited[y][x - 1]) { + const leftDistance = cave[y][x - 1] + currentDistance + distance[y][x - 1] = Math.min(distance[y][x - 1], leftDistance) + } + if (cave[y][x + 1] !== undefined && unvisited[y][x + 1]) { + const rightDistance = cave[y][x + 1] + currentDistance + distance[y][x + 1] = Math.min(distance[y][x + 1], rightDistance) + } + unvisited[y][x] = false -export const lowestRiskPath = (cave: number[][]): number => { - // Create a baseline risk: a diagonal line - const line = diagonalPath([cave[cave.length - 1].length - 1, cave.length - 1]) - const lineRisk = line.reduce((risk, [x, y]) => risk + cave[y][x], 0) - let bestPath = lineRisk - console.log(bestPath) - navigateCave( - cave, - () => bestPath, - (risk) => { - if (risk < bestPath) { - console.log(`new best path`, risk) - bestPath = risk + if (y === cave.length - 1 && x === cave[y].length - 1) { + onEnd(currentDistance) + } + + const caveDistances = [] + for (let y = 0; y < cave.length; y++) { + for (let x = 0; x < cave[y].length; x++) { + if (unvisited[y][x]) + caveDistances.push({ + position: [x, y] as [x: number, y: number], + distance: distance[y][x], + }) } - }, - ) - return bestPath + } + current = caveDistances + .sort(({ distance: d1 }, { distance: d2 }) => d2 - d1) + .pop()?.position + } } -/* -import { loader } from '../lib/loader.js' -const input = loader(15)('input').map((s) => - s.split('').map((s) => parseInt(s, 10)), -) - -*/ - -const input = [ - '1163751742', - '1381373672', - '2136511328', - '3694931569', - '7463417111', - '1319128137', - '1359912421', - '3125421639', - '1293138521', - '2311944581', -].map((s) => s.split('').map((s) => parseInt(s, 10))) - -console.log(lowestRiskPath(input)) +export const lowestRisk = (cave: number[][]): number => { + let lowestRisk = Number.MAX_SAFE_INTEGER + navigateCave(cave, (distance) => { + lowestRisk = distance + }) + return lowestRisk +} diff --git a/day15/solution.spec.ts b/day15/solution.spec.ts index b8260ce..78f89e4 100644 --- a/day15/solution.spec.ts +++ b/day15/solution.spec.ts @@ -1,5 +1,5 @@ import { loader } from '../lib/loader' -import { lowestRiskPath } from './navigateCave' +import { lowestRisk } from './navigateCave' const example = [ '1163751742', @@ -21,8 +21,7 @@ const input = loader(15)('input').map((s) => describe('Day 15: Chiton', () => { describe('Part 1', () => { it('should solve the example', () => - expect(lowestRiskPath(example)).toEqual(40)) - it.skip('should solve the puzzle', () => - expect(lowestRiskPath(input)).toEqual(40)) + expect(lowestRisk(example)).toEqual(40)) + it('should solve the puzzle', () => expect(lowestRisk(input)).toEqual(748)) }) }) From cb72ef1e3baf8ff4c10bc1c35719cadbd6e8854f Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 15 Dec 2021 19:33:21 +0100 Subject: [PATCH 099/110] feat(day15): part 2 It takes 70 minutes to solve part 2, so I should look into ways to optimize it even further, for example by establishing a reference total risk by using a diagonal line as an upper limit? --- day15/part2.ts | 7 ++++++ day15/solution.spec.ts | 16 +++++++++---- day15/toMap.ts | 2 ++ day15/wrap.spec.ts | 21 +++++++++++++++++ day15/wrap.ts | 18 +++++++++++++++ day15/wrappedExample.txt | 50 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 day15/part2.ts create mode 100644 day15/toMap.ts create mode 100644 day15/wrap.spec.ts create mode 100644 day15/wrap.ts create mode 100644 day15/wrappedExample.txt diff --git a/day15/part2.ts b/day15/part2.ts new file mode 100644 index 0000000..d701496 --- /dev/null +++ b/day15/part2.ts @@ -0,0 +1,7 @@ +import { loader } from '../lib/loader.js' +import { lowestRisk } from './navigateCave.js' +import { toMap } from './toMap.js' +import { wrap } from './wrap.js' + +const input = toMap(loader(15)('input')) +console.log(lowestRisk(wrap(input))) // 3045 diff --git a/day15/solution.spec.ts b/day15/solution.spec.ts index 78f89e4..25766b7 100644 --- a/day15/solution.spec.ts +++ b/day15/solution.spec.ts @@ -1,7 +1,9 @@ import { loader } from '../lib/loader' import { lowestRisk } from './navigateCave' +import { toMap } from './toMap' +import { wrap } from './wrap' -const example = [ +const example = toMap([ '1163751742', '1381373672', '2136511328', @@ -12,11 +14,9 @@ const example = [ '3125421639', '1293138521', '2311944581', -].map((s) => s.split('').map((s) => parseInt(s, 10))) +]) -const input = loader(15)('input').map((s) => - s.split('').map((s) => parseInt(s, 10)), -) +const input = toMap(loader(15)('input')) describe('Day 15: Chiton', () => { describe('Part 1', () => { @@ -24,4 +24,10 @@ describe('Day 15: Chiton', () => { expect(lowestRisk(example)).toEqual(40)) it('should solve the puzzle', () => expect(lowestRisk(input)).toEqual(748)) }) + describe('Part 2', () => { + it('should solve the example', () => + expect(lowestRisk(wrap(example))).toEqual(315)) + it.skip('should solve the puzzle', () => + expect(lowestRisk(wrap(input))).toEqual(3045)) + }) }) diff --git a/day15/toMap.ts b/day15/toMap.ts new file mode 100644 index 0000000..5e31101 --- /dev/null +++ b/day15/toMap.ts @@ -0,0 +1,2 @@ +export const toMap = (map: string[]): number[][] => + map.map((s) => s.split('').map((s) => parseInt(s, 10))) diff --git a/day15/wrap.spec.ts b/day15/wrap.spec.ts new file mode 100644 index 0000000..e7bcec6 --- /dev/null +++ b/day15/wrap.spec.ts @@ -0,0 +1,21 @@ +import { loader } from '../lib/loader' +import { toMap } from './toMap' +import { wrap } from './wrap' + +const example = toMap([ + '1163751742', + '1381373672', + '2136511328', + '3694931569', + '7463417111', + '1319128137', + '1359912421', + '3125421639', + '1293138521', + '2311944581', +]) + +describe('wrap()', () => { + it('should wrap the map', () => + expect(wrap(example)).toEqual(toMap(loader(15)('wrappedExample')))) +}) diff --git a/day15/wrap.ts b/day15/wrap.ts new file mode 100644 index 0000000..ba73e7f --- /dev/null +++ b/day15/wrap.ts @@ -0,0 +1,18 @@ +export const wrap = (map: number[][], wrap = 5): number[][] => { + const wrapped: number[][] = [] + for (let wrapY = 0; wrapY < wrap; wrapY++) { + for (let y = 0; y < map.length; y++) { + const yOffset = y + wrapY * map.length + for (let wrapX = 0; wrapX < wrap; wrapX++) { + for (let x = 0; x < map[y].length; x++) { + const xOffset = x + wrapX * map[y].length + let v = map[y][x] + wrapY + wrapX + if (v > 9) v = v - 9 + if (wrapped[yOffset] === undefined) wrapped[yOffset] = [] + wrapped[yOffset][xOffset] = v + } + } + } + } + return wrapped +} diff --git a/day15/wrappedExample.txt b/day15/wrappedExample.txt new file mode 100644 index 0000000..441a362 --- /dev/null +++ b/day15/wrappedExample.txt @@ -0,0 +1,50 @@ +11637517422274862853338597396444961841755517295286 +13813736722492484783351359589446246169155735727126 +21365113283247622439435873354154698446526571955763 +36949315694715142671582625378269373648937148475914 +74634171118574528222968563933317967414442817852555 +13191281372421239248353234135946434524615754563572 +13599124212461123532357223464346833457545794456865 +31254216394236532741534764385264587549637569865174 +12931385212314249632342535174345364628545647573965 +23119445813422155692453326671356443778246755488935 +22748628533385973964449618417555172952866628316397 +24924847833513595894462461691557357271266846838237 +32476224394358733541546984465265719557637682166874 +47151426715826253782693736489371484759148259586125 +85745282229685639333179674144428178525553928963666 +24212392483532341359464345246157545635726865674683 +24611235323572234643468334575457944568656815567976 +42365327415347643852645875496375698651748671976285 +23142496323425351743453646285456475739656758684176 +34221556924533266713564437782467554889357866599146 +33859739644496184175551729528666283163977739427418 +35135958944624616915573572712668468382377957949348 +43587335415469844652657195576376821668748793277985 +58262537826937364893714847591482595861259361697236 +96856393331796741444281785255539289636664139174777 +35323413594643452461575456357268656746837976785794 +35722346434683345754579445686568155679767926678187 +53476438526458754963756986517486719762859782187396 +34253517434536462854564757396567586841767869795287 +45332667135644377824675548893578665991468977611257 +44961841755517295286662831639777394274188841538529 +46246169155735727126684683823779579493488168151459 +54698446526571955763768216687487932779859814388196 +69373648937148475914825958612593616972361472718347 +17967414442817852555392896366641391747775241285888 +46434524615754563572686567468379767857948187896815 +46833457545794456865681556797679266781878137789298 +64587549637569865174867197628597821873961893298417 +45364628545647573965675868417678697952878971816398 +56443778246755488935786659914689776112579188722368 +55172952866628316397773942741888415385299952649631 +57357271266846838237795794934881681514599279262561 +65719557637682166874879327798598143881961925499217 +71484759148259586125936169723614727183472583829458 +28178525553928963666413917477752412858886352396999 +57545635726865674683797678579481878968159298917926 +57944568656815567976792667818781377892989248891319 +75698651748671976285978218739618932984172914319528 +56475739656758684176786979528789718163989182927419 +67554889357866599146897761125791887223681299833479 \ No newline at end of file From a7072ba8873955208c0d21e3154bedd6ed9bf4c4 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 15 Dec 2021 21:02:55 +0100 Subject: [PATCH 100/110] fix: update dependencies --- package-lock.json | 620 +++++++++++++++++++++++----------------------- package.json | 8 +- 2 files changed, 314 insertions(+), 314 deletions(-) diff --git a/package-lock.json b/package-lock.json index a32d676..ba84344 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,16 +12,16 @@ "devDependencies": { "@commitlint/cli": "15.0.0", "@commitlint/config-angular": "15.0.0", - "@nordicsemiconductor/asset-tracker-cloud-code-style": "9.2.31", + "@nordicsemiconductor/asset-tracker-cloud-code-style": "9.2.33", "@types/jest": "27.0.3", - "@types/node": "16.11.12", + "@types/node": "16.11.13", "eslint": "8.4.1", "husky": "7.0.4", - "jest": "27.4.4", + "jest": "27.4.5", "lint-staged": "12.1.2", "prettier": "2.5.1", "ts-jest": "27.1.1", - "typescript": "4.5.3" + "typescript": "4.5.4" }, "engines": { "node": ">=16.0.0", @@ -241,9 +241,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -565,12 +565,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz", - "integrity": "sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.5.tgz", + "integrity": "sha512-/d4//lZ1Vqb4mZ5xTep3dDK888j7BGM/iKqBmndBaoYAFPlPKrGU608VVBz5JeyAb6YQDjRu1UKqj86UhwWVgw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1054,15 +1054,15 @@ } }, "node_modules/@jest/core": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.4.tgz", - "integrity": "sha512-xBNPVqYAdAiAMXnb4ugx9Cdmr0S52lBsLbQMR/sGBRO0810VSPKiuSDtuup6qdkK1e9vxbv3KK3IAP1QFAp8mw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.5.tgz", + "integrity": "sha512-3tm/Pevmi8bDsgvo73nX8p/WPng6KWlCyScW10FPEoN1HU4pwI83tJ3TsFvi1FfzsjwUlMNEPowgb/rPau/LTQ==", "dev": true, "dependencies": { "@jest/console": "^27.4.2", - "@jest/reporters": "^27.4.4", + "@jest/reporters": "^27.4.5", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1071,15 +1071,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.4", - "jest-haste-map": "^27.4.4", + "jest-config": "^27.4.5", + "jest-haste-map": "^27.4.5", "jest-message-util": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.4", - "jest-resolve-dependencies": "^27.4.4", - "jest-runner": "^27.4.4", - "jest-runtime": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-resolve-dependencies": "^27.4.5", + "jest-runner": "^27.4.5", + "jest-runtime": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "jest-watcher": "^27.4.2", @@ -1147,15 +1147,15 @@ } }, "node_modules/@jest/reporters": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.4.tgz", - "integrity": "sha512-ssyJSw9B9Awb1QaxDhIPSs4de1b7SE2kv7tqFehQL13xpn5HUkMYZK/ufTOXiCAnXFOZS+XDl1GaQ/LmJAzI1A==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.5.tgz", + "integrity": "sha512-3orsG4vi8zXuBqEoy2LbnC1kuvkg1KQUgqNxmxpQgIOQEPeV0onvZu+qDQnEoX8qTQErtqn/xzcnbpeTuOLSiA==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.4.2", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -1168,10 +1168,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.4.4", - "jest-resolve": "^27.4.4", + "jest-haste-map": "^27.4.5", + "jest-resolve": "^27.4.5", "jest-util": "^27.4.2", - "jest-worker": "^27.4.4", + "jest-worker": "^27.4.5", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -1220,24 +1220,24 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.4.tgz", - "integrity": "sha512-mCh+d4JTGTtX7vr13d7q2GHJy33nAobEwtEJ8X3u7R8+0ImVO2eAsQzsLfX8lyvdYHBxYABhqbYuaUNo42/pQw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.5.tgz", + "integrity": "sha512-n5woIn/1v+FT+9hniymHPARA9upYUmfi5Pw9ewVwXCDlK4F5/Gkees9v8vdjGdAIJ2MPHLHodiajLpZZanWzEQ==", "dev": true, "dependencies": { "@jest/test-result": "^27.4.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", - "jest-runtime": "^27.4.4" + "jest-haste-map": "^27.4.5", + "jest-runtime": "^27.4.5" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.4.tgz", - "integrity": "sha512-7U/nDSrGsGzL7+X8ScNFV71w8u8knJQWSa9C2xsrrKLMOgb+rWuCG4VAyWke/53BU96GnT+Ka81xCAHA5gk6zA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.5.tgz", + "integrity": "sha512-PuMet2UlZtlGzwc6L+aZmR3I7CEBpqadO03pU40l2RNY2fFJ191b9/ITB44LNOhVtsyykx0OZvj0PCyuLm7Eew==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", @@ -1247,7 +1247,7 @@ "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-regex-util": "^27.4.0", "jest-util": "^27.4.2", "micromatch": "^4.0.4", @@ -1312,20 +1312,20 @@ } }, "node_modules/@nordicsemiconductor/asset-tracker-cloud-code-style": { - "version": "9.2.31", - "resolved": "https://registry.npmjs.org/@nordicsemiconductor/asset-tracker-cloud-code-style/-/asset-tracker-cloud-code-style-9.2.31.tgz", - "integrity": "sha512-143DyHKqz1Yq/A7i1JzfrYQorS10K3m+3gJd84AtcnEMRxNrAbnf8hQwifswyyIe3v+YWoGlqM78Gfkby6/mYA==", + "version": "9.2.33", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/asset-tracker-cloud-code-style/-/asset-tracker-cloud-code-style-9.2.33.tgz", + "integrity": "sha512-NjVQiOGyCTi0owOmNicsatMoqz0Dye9Efaokt0iogQ3SzUr2+YwHGwCqRNVHvEI4CbxkqzdlU/PdHhn6AlK67A==", "dev": true, "dependencies": { "@commitlint/cli": "15.0.0", "@commitlint/config-angular": "15.0.0", - "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": "8.1.18", + "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": "8.1.19", "eslint": "8.4.1", "husky": "7.0.4", "lint-staged": "12.1.2", "pinst": "2.1.6", "prettier": "2.5.1", - "typescript": "4.5.3" + "typescript": "4.5.4" }, "engines": { "node": ">=14", @@ -1333,12 +1333,12 @@ } }, "node_modules/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": { - "version": "8.1.18", - "resolved": "https://registry.npmjs.org/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript/-/eslint-config-asset-tracker-cloud-typescript-8.1.18.tgz", - "integrity": "sha512-OAkXxX1Ia9QLSh2Oayzwb48e2hqH1QbLbfKSwSpLdOmEUnvGK6pBx8jfmQzI3fZZkljlkIGUfOs+uU5HjMLSVA==", + "version": "8.1.19", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript/-/eslint-config-asset-tracker-cloud-typescript-8.1.19.tgz", + "integrity": "sha512-lL9bB/DxocHWqXtcqQi2GaEcUVdvhDJXA3CQUfjU69AorKwYkRRfkCLlWvbLb7429MuFa05FiMwkVGnnrLjU+Q==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "5.6.0", + "@typescript-eslint/eslint-plugin": "5.7.0", "eslint-config-prettier": "8.3.0" }, "engines": { @@ -1470,9 +1470,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==", + "version": "16.11.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.13.tgz", + "integrity": "sha512-eUXZzHLHoZqj1frtUetNkUetYoJ6X55UmrVnFD4DMhVeAmwLjniZhtBmsRiemQh4uq4G3vUra/Ws/hs9vEvL3Q==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -1515,13 +1515,13 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.6.0.tgz", - "integrity": "sha512-MIbeMy5qfLqtgs1hWd088k1hOuRsN9JrHUPwVVKCD99EOUqScd7SrwoZl4Gso05EAP9w1kvLWUVGJOVpRPkDPA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.7.0.tgz", + "integrity": "sha512-8RTGBpNn5a9M628wBPrCbJ+v3YTEOE2qeZb7TDkGKTDXSj36KGRg92SpFFaR/0S3rSXQxM0Og/kV9EyadsYSBg==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "5.6.0", - "@typescript-eslint/scope-manager": "5.6.0", + "@typescript-eslint/experimental-utils": "5.7.0", + "@typescript-eslint/scope-manager": "5.7.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -1547,15 +1547,15 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.6.0.tgz", - "integrity": "sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.7.0.tgz", + "integrity": "sha512-u57eZ5FbEpzN5kSjmVrSesovWslH2ZyNPnaXQMXWgH57d5+EVHEt76W75vVuI9qKZ5BMDKNfRN+pxcPEjQjb2A==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.6.0", - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/typescript-estree": "5.6.0", + "@typescript-eslint/scope-manager": "5.7.0", + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/typescript-estree": "5.7.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -1571,15 +1571,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.6.0.tgz", - "integrity": "sha512-YVK49NgdUPQ8SpCZaOpiq1kLkYRPMv9U5gcMrywzI8brtwZjr/tG3sZpuHyODt76W/A0SufNjYt9ZOgrC4tLIQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.7.0.tgz", + "integrity": "sha512-m/gWCCcS4jXw6vkrPQ1BjZ1vomP01PArgzvauBqzsoZ3urLbsRChexB8/YV8z9HwE3qlJM35FxfKZ1nfP/4x8g==", "dev": true, "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.6.0", - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/typescript-estree": "5.6.0", + "@typescript-eslint/scope-manager": "5.7.0", + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/typescript-estree": "5.7.0", "debug": "^4.3.2" }, "engines": { @@ -1599,13 +1599,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.6.0.tgz", - "integrity": "sha512-1U1G77Hw2jsGWVsO2w6eVCbOg0HZ5WxL/cozVSTfqnL/eB9muhb8THsP0G3w+BB5xAHv9KptwdfYFAUfzcIh4A==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.7.0.tgz", + "integrity": "sha512-7mxR520DGq5F7sSSgM0HSSMJ+TFUymOeFRMfUfGFAVBv8BR+Jv1vHgAouYUvWRZeszVBJlLcc9fDdktxb5kmxA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/visitor-keys": "5.6.0" + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/visitor-keys": "5.7.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1616,9 +1616,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.6.0.tgz", - "integrity": "sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.7.0.tgz", + "integrity": "sha512-5AeYIF5p2kAneIpnLFve8g50VyAjq7udM7ApZZ9JYjdPjkz0LvODfuSHIDUVnIuUoxafoWzpFyU7Sqbxgi79mA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1629,13 +1629,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.6.0.tgz", - "integrity": "sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.7.0.tgz", + "integrity": "sha512-aO1Ql+izMrTnPj5aFFlEJkpD4jRqC4Gwhygu2oHK2wfVQpmOPbyDSveJ+r/NQo+PWV43M6uEAeLVbTi09dFLhg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/visitor-keys": "5.6.0", + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/visitor-keys": "5.7.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -1656,12 +1656,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.6.0.tgz", - "integrity": "sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.7.0.tgz", + "integrity": "sha512-hdohahZ4lTFcglZSJ3DGdzxQHBSxsLVqHzkiOmKi7xVAWC4y2c1bIMKmPJSrA4aOEoRUPOKQ87Y/taC7yVHpFg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/types": "5.7.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -1896,12 +1896,12 @@ "dev": true }, "node_modules/babel-jest": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.4.tgz", - "integrity": "sha512-+6RVutZxOQgJkt4svgTHPFtOQlVe9dUg3wrimIAM38pY6hL/nsL8glfFSUjD9jNVjaVjzkCzj6loFFecrjr9Qw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.5.tgz", + "integrity": "sha512-3uuUTjXbgtODmSv/DXO9nZfD52IyC2OYTFaXGRzL0kpykzroaquCrD5+lZNafTvZlnNqZHt5pb0M08qVBZnsnA==", "dev": true, "dependencies": { - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", @@ -3799,14 +3799,14 @@ } }, "node_modules/jest": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.4.tgz", - "integrity": "sha512-AXwEIFa58Uf1Jno3/KSo5HZZ0/2Xwqvfrz0/3bmTwImkFlbOvz5vARAW9nTrxRLkojjkitaZ1KNKAtw3JRFAaA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.5.tgz", + "integrity": "sha512-uT5MiVN3Jppt314kidCk47MYIRilJjA/l2mxwiuzzxGUeJIvA8/pDaJOAX5KWvjAo7SCydcW0/4WEtgbLMiJkg==", "dev": true, "dependencies": { - "@jest/core": "^27.4.4", + "@jest/core": "^27.4.5", "import-local": "^3.0.2", - "jest-cli": "^27.4.4" + "jest-cli": "^27.4.5" }, "bin": { "jest": "bin/jest.js" @@ -3838,9 +3838,9 @@ } }, "node_modules/jest-circus": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.4.tgz", - "integrity": "sha512-4DWhvQerDq5X4GaqhEUoZiBhuNdKDGr0geW0iJwarbDljAmGaGOErKQG+z2PBr0vgN05z7tsGSY51mdWr8E4xg==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.5.tgz", + "integrity": "sha512-eTNWa9wsvBwPykhMMShheafbwyakcdHZaEYh5iRrQ0PFJxkDP/e3U/FvzGuKWu2WpwUA3C3hPlfpuzvOdTVqnw==", "dev": true, "dependencies": { "@jest/environment": "^27.4.4", @@ -3855,8 +3855,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-runtime": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "slash": "^3.0.0", @@ -3868,19 +3868,19 @@ } }, "node_modules/jest-cli": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.4.tgz", - "integrity": "sha512-+MfsHnZPUOBigCBURuQFRpgYoPCgmIFkICkqt4SrramZCUp/UAuWcst4pMZb84O3VU8JyKJmnpGG4qH8ClQloA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.5.tgz", + "integrity": "sha512-hrky3DSgE0u7sQxaCL7bdebEPHx5QzYmrGuUjaPLmPE8jx5adtvGuOlRspvMoVLTTDOHRnZDoRLYJuA+VCI7Hg==", "dev": true, "dependencies": { - "@jest/core": "^27.4.4", + "@jest/core": "^27.4.5", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.4.4", + "jest-config": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "prompts": "^2.0.1", @@ -3920,28 +3920,28 @@ } }, "node_modules/jest-config": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.4.tgz", - "integrity": "sha512-6lxg0ugO6KS2zKEbpdDwBzu1IT0Xg4/VhxXMuBu+z/5FvBjLCEMTaWQm3bCaGCZUR9j9FK4DzUIxyhIgn6kVEg==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.5.tgz", + "integrity": "sha512-t+STVJtPt+fpqQ8GBw850NtSQbnDOw/UzdPfzDaHQ48/AylQlW7LHj3dH+ndxhC1UxJ0Q3qkq7IH+nM1skwTwA==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.4.4", + "@jest/test-sequencer": "^27.4.5", "@jest/types": "^27.4.2", - "babel-jest": "^27.4.4", + "babel-jest": "^27.4.5", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.4", + "jest-circus": "^27.4.5", "jest-environment-jsdom": "^27.4.4", "jest-environment-node": "^27.4.4", "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.4", + "jest-jasmine2": "^27.4.5", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.4", - "jest-runner": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-runner": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "micromatch": "^4.0.4", @@ -4048,9 +4048,9 @@ } }, "node_modules/jest-haste-map": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.4.tgz", - "integrity": "sha512-kvspmHmgPIZoDaqUsvsJFTaspuxhATvdO6wsFNGNSi8kfdiOCEEvECNbht8xG+eE5Ol88JyJmp2D7RF4dYo85Q==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.5.tgz", + "integrity": "sha512-oJm1b5qhhPs78K24EDGifWS0dELYxnoBiDhatT/FThgB9yxqUm5F6li3Pv+Q+apMBmmPNzOBnZ7ZxWMB1Leq1Q==", "dev": true, "dependencies": { "@jest/types": "^27.4.2", @@ -4062,7 +4062,7 @@ "jest-regex-util": "^27.4.0", "jest-serializer": "^27.4.0", "jest-util": "^27.4.2", - "jest-worker": "^27.4.4", + "jest-worker": "^27.4.5", "micromatch": "^4.0.4", "walker": "^1.0.7" }, @@ -4074,9 +4074,9 @@ } }, "node_modules/jest-jasmine2": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.4.tgz", - "integrity": "sha512-ygk2tUgtLeN3ouj4KEYw9p81GLI1EKrnvourPULN5gdgB482PH5op9gqaRG0IenbJhBbbRwiSvh5NoBoQZSqdA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.5.tgz", + "integrity": "sha512-oUnvwhJDj2LhOiUB1kdnJjkx8C5PwgUZQb9urF77mELH9DGR4e2GqpWQKBOYXWs5+uTN9BGDqRz3Aeg5Wts7aw==", "dev": true, "dependencies": { "@babel/traverse": "^7.1.0", @@ -4092,8 +4092,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-runtime": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "throat": "^6.0.1" @@ -4190,15 +4190,15 @@ } }, "node_modules/jest-resolve": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.4.tgz", - "integrity": "sha512-Yh5jK3PBmDbm01Rc8pT0XqpBlTPEGwWp7cN61ijJuwony/tR2Taof3TLy6yfNiuRS8ucUOPO7NBYm3ei38kkcg==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.5.tgz", + "integrity": "sha512-xU3z1BuOz/hUhVUL+918KqUgK+skqOuUsAi7A+iwoUldK6/+PW+utK8l8cxIWT9AW7IAhGNXjSAh1UYmjULZZw==", "dev": true, "dependencies": { "@jest/types": "^27.4.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", @@ -4211,29 +4211,29 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.4.tgz", - "integrity": "sha512-iAnpCXh81sd9nbyqySvm5/aV9X6JZKE0dQyFXTC8tptXcdrgS0vjPFy+mEgzPHxXw+tq4TQupuTa0n8OXwRIxw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.5.tgz", + "integrity": "sha512-elEVvkvRK51y037NshtEkEnukMBWvlPzZHiL847OrIljJ8yIsujD2GXRPqDXC4rEVKbcdsy7W0FxoZb4WmEs7w==", "dev": true, "dependencies": { "@jest/types": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.4" + "jest-snapshot": "^27.4.5" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-runner": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.4.tgz", - "integrity": "sha512-AXv/8Q0Xf1puWnDf52m7oLrK7sXcv6re0V/kItwTSVHJbX7Oebm07oGFQqGmq0R0mhO1zpmB3OpqRuaCN2elPA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.5.tgz", + "integrity": "sha512-/irauncTfmY1WkTaRQGRWcyQLzK1g98GYG/8QvIPviHgO1Fqz1JYeEIsSfF+9mc/UTA6S+IIHFgKyvUrtiBIZg==", "dev": true, "dependencies": { "@jest/console": "^27.4.2", "@jest/environment": "^27.4.4", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -4243,13 +4243,13 @@ "jest-docblock": "^27.4.0", "jest-environment-jsdom": "^27.4.4", "jest-environment-node": "^27.4.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-leak-detector": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.4", - "jest-runtime": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-runtime": "^27.4.5", "jest-util": "^27.4.2", - "jest-worker": "^27.4.4", + "jest-worker": "^27.4.5", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -4258,9 +4258,9 @@ } }, "node_modules/jest-runtime": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.4.tgz", - "integrity": "sha512-tZGay6P6vXJq8t4jVFAUzYHx+lzIHXjz+rj1XBk6mAR1Lwtf5kz0Uun7qNuU+oqpZu4+hhuxpUfXb6j30bEPqA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.5.tgz", + "integrity": "sha512-CIYqwuJQXHQtPd/idgrx4zgJ6iCb6uBjQq1RSAGQrw2S8XifDmoM1Ot8NRd80ooAm+ZNdHVwsktIMGlA1F1FAQ==", "dev": true, "dependencies": { "@jest/console": "^27.4.2", @@ -4268,7 +4268,7 @@ "@jest/globals": "^27.4.4", "@jest/source-map": "^27.4.0", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", @@ -4278,12 +4278,12 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-message-util": "^27.4.2", "jest-mock": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "slash": "^3.0.0", @@ -4326,9 +4326,9 @@ } }, "node_modules/jest-snapshot": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.4.tgz", - "integrity": "sha512-yy+rpCvYMOjTl7IMuaMI9OP9WT229zi8BhdNHm6e6mttAOIzvIiCxFoZ6yRxaV3HDPPgMryi+ReX2b8+IQJdPA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.5.tgz", + "integrity": "sha512-eCi/iM1YJFrJWiT9de4+RpWWWBqsHiYxFG9V9o/n0WXs6GpW4lUt4FAHAgFPTLPqCUVzrMQmSmTZSgQzwqR7IQ==", "dev": true, "dependencies": { "@babel/core": "^7.7.2", @@ -4337,7 +4337,7 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", @@ -4347,10 +4347,10 @@ "graceful-fs": "^4.2.4", "jest-diff": "^27.4.2", "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.4", + "jest-resolve": "^27.4.5", "jest-util": "^27.4.2", "natural-compare": "^1.4.0", "pretty-format": "^27.4.2", @@ -4425,9 +4425,9 @@ } }, "node_modules/jest-worker": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", - "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", + "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", "dev": true, "dependencies": { "@types/node": "*", @@ -6530,9 +6530,9 @@ } }, "node_modules/typescript": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.3.tgz", - "integrity": "sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -7003,9 +7003,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", "dev": true }, "@babel/helper-replace-supers": { @@ -7245,12 +7245,12 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz", - "integrity": "sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.5.tgz", + "integrity": "sha512-/d4//lZ1Vqb4mZ5xTep3dDK888j7BGM/iKqBmndBaoYAFPlPKrGU608VVBz5JeyAb6YQDjRu1UKqj86UhwWVgw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/template": { @@ -7626,15 +7626,15 @@ } }, "@jest/core": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.4.tgz", - "integrity": "sha512-xBNPVqYAdAiAMXnb4ugx9Cdmr0S52lBsLbQMR/sGBRO0810VSPKiuSDtuup6qdkK1e9vxbv3KK3IAP1QFAp8mw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.5.tgz", + "integrity": "sha512-3tm/Pevmi8bDsgvo73nX8p/WPng6KWlCyScW10FPEoN1HU4pwI83tJ3TsFvi1FfzsjwUlMNEPowgb/rPau/LTQ==", "dev": true, "requires": { "@jest/console": "^27.4.2", - "@jest/reporters": "^27.4.4", + "@jest/reporters": "^27.4.5", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -7643,15 +7643,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.4", - "jest-haste-map": "^27.4.4", + "jest-config": "^27.4.5", + "jest-haste-map": "^27.4.5", "jest-message-util": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.4", - "jest-resolve-dependencies": "^27.4.4", - "jest-runner": "^27.4.4", - "jest-runtime": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-resolve-dependencies": "^27.4.5", + "jest-runner": "^27.4.5", + "jest-runtime": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "jest-watcher": "^27.4.2", @@ -7699,15 +7699,15 @@ } }, "@jest/reporters": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.4.tgz", - "integrity": "sha512-ssyJSw9B9Awb1QaxDhIPSs4de1b7SE2kv7tqFehQL13xpn5HUkMYZK/ufTOXiCAnXFOZS+XDl1GaQ/LmJAzI1A==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.5.tgz", + "integrity": "sha512-3orsG4vi8zXuBqEoy2LbnC1kuvkg1KQUgqNxmxpQgIOQEPeV0onvZu+qDQnEoX8qTQErtqn/xzcnbpeTuOLSiA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.4.2", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -7720,10 +7720,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.4.4", - "jest-resolve": "^27.4.4", + "jest-haste-map": "^27.4.5", + "jest-resolve": "^27.4.5", "jest-util": "^27.4.2", - "jest-worker": "^27.4.4", + "jest-worker": "^27.4.5", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -7755,21 +7755,21 @@ } }, "@jest/test-sequencer": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.4.tgz", - "integrity": "sha512-mCh+d4JTGTtX7vr13d7q2GHJy33nAobEwtEJ8X3u7R8+0ImVO2eAsQzsLfX8lyvdYHBxYABhqbYuaUNo42/pQw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.5.tgz", + "integrity": "sha512-n5woIn/1v+FT+9hniymHPARA9upYUmfi5Pw9ewVwXCDlK4F5/Gkees9v8vdjGdAIJ2MPHLHodiajLpZZanWzEQ==", "dev": true, "requires": { "@jest/test-result": "^27.4.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", - "jest-runtime": "^27.4.4" + "jest-haste-map": "^27.4.5", + "jest-runtime": "^27.4.5" } }, "@jest/transform": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.4.tgz", - "integrity": "sha512-7U/nDSrGsGzL7+X8ScNFV71w8u8knJQWSa9C2xsrrKLMOgb+rWuCG4VAyWke/53BU96GnT+Ka81xCAHA5gk6zA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.5.tgz", + "integrity": "sha512-PuMet2UlZtlGzwc6L+aZmR3I7CEBpqadO03pU40l2RNY2fFJ191b9/ITB44LNOhVtsyykx0OZvj0PCyuLm7Eew==", "dev": true, "requires": { "@babel/core": "^7.1.0", @@ -7779,7 +7779,7 @@ "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-regex-util": "^27.4.0", "jest-util": "^27.4.2", "micromatch": "^4.0.4", @@ -7829,29 +7829,29 @@ } }, "@nordicsemiconductor/asset-tracker-cloud-code-style": { - "version": "9.2.31", - "resolved": "https://registry.npmjs.org/@nordicsemiconductor/asset-tracker-cloud-code-style/-/asset-tracker-cloud-code-style-9.2.31.tgz", - "integrity": "sha512-143DyHKqz1Yq/A7i1JzfrYQorS10K3m+3gJd84AtcnEMRxNrAbnf8hQwifswyyIe3v+YWoGlqM78Gfkby6/mYA==", + "version": "9.2.33", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/asset-tracker-cloud-code-style/-/asset-tracker-cloud-code-style-9.2.33.tgz", + "integrity": "sha512-NjVQiOGyCTi0owOmNicsatMoqz0Dye9Efaokt0iogQ3SzUr2+YwHGwCqRNVHvEI4CbxkqzdlU/PdHhn6AlK67A==", "dev": true, "requires": { "@commitlint/cli": "15.0.0", "@commitlint/config-angular": "15.0.0", - "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": "8.1.18", + "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": "8.1.19", "eslint": "8.4.1", "husky": "7.0.4", "lint-staged": "12.1.2", "pinst": "2.1.6", "prettier": "2.5.1", - "typescript": "4.5.3" + "typescript": "4.5.4" } }, "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": { - "version": "8.1.18", - "resolved": "https://registry.npmjs.org/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript/-/eslint-config-asset-tracker-cloud-typescript-8.1.18.tgz", - "integrity": "sha512-OAkXxX1Ia9QLSh2Oayzwb48e2hqH1QbLbfKSwSpLdOmEUnvGK6pBx8jfmQzI3fZZkljlkIGUfOs+uU5HjMLSVA==", + "version": "8.1.19", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript/-/eslint-config-asset-tracker-cloud-typescript-8.1.19.tgz", + "integrity": "sha512-lL9bB/DxocHWqXtcqQi2GaEcUVdvhDJXA3CQUfjU69AorKwYkRRfkCLlWvbLb7429MuFa05FiMwkVGnnrLjU+Q==", "dev": true, "requires": { - "@typescript-eslint/eslint-plugin": "5.6.0", + "@typescript-eslint/eslint-plugin": "5.7.0", "eslint-config-prettier": "8.3.0" } }, @@ -7976,9 +7976,9 @@ "dev": true }, "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==", + "version": "16.11.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.13.tgz", + "integrity": "sha512-eUXZzHLHoZqj1frtUetNkUetYoJ6X55UmrVnFD4DMhVeAmwLjniZhtBmsRiemQh4uq4G3vUra/Ws/hs9vEvL3Q==", "dev": true }, "@types/normalize-package-data": { @@ -8021,13 +8021,13 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.6.0.tgz", - "integrity": "sha512-MIbeMy5qfLqtgs1hWd088k1hOuRsN9JrHUPwVVKCD99EOUqScd7SrwoZl4Gso05EAP9w1kvLWUVGJOVpRPkDPA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.7.0.tgz", + "integrity": "sha512-8RTGBpNn5a9M628wBPrCbJ+v3YTEOE2qeZb7TDkGKTDXSj36KGRg92SpFFaR/0S3rSXQxM0Og/kV9EyadsYSBg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.6.0", - "@typescript-eslint/scope-manager": "5.6.0", + "@typescript-eslint/experimental-utils": "5.7.0", + "@typescript-eslint/scope-manager": "5.7.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -8037,56 +8037,56 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.6.0.tgz", - "integrity": "sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.7.0.tgz", + "integrity": "sha512-u57eZ5FbEpzN5kSjmVrSesovWslH2ZyNPnaXQMXWgH57d5+EVHEt76W75vVuI9qKZ5BMDKNfRN+pxcPEjQjb2A==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.6.0", - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/typescript-estree": "5.6.0", + "@typescript-eslint/scope-manager": "5.7.0", + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/typescript-estree": "5.7.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.6.0.tgz", - "integrity": "sha512-YVK49NgdUPQ8SpCZaOpiq1kLkYRPMv9U5gcMrywzI8brtwZjr/tG3sZpuHyODt76W/A0SufNjYt9ZOgrC4tLIQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.7.0.tgz", + "integrity": "sha512-m/gWCCcS4jXw6vkrPQ1BjZ1vomP01PArgzvauBqzsoZ3urLbsRChexB8/YV8z9HwE3qlJM35FxfKZ1nfP/4x8g==", "dev": true, "peer": true, "requires": { - "@typescript-eslint/scope-manager": "5.6.0", - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/typescript-estree": "5.6.0", + "@typescript-eslint/scope-manager": "5.7.0", + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/typescript-estree": "5.7.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.6.0.tgz", - "integrity": "sha512-1U1G77Hw2jsGWVsO2w6eVCbOg0HZ5WxL/cozVSTfqnL/eB9muhb8THsP0G3w+BB5xAHv9KptwdfYFAUfzcIh4A==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.7.0.tgz", + "integrity": "sha512-7mxR520DGq5F7sSSgM0HSSMJ+TFUymOeFRMfUfGFAVBv8BR+Jv1vHgAouYUvWRZeszVBJlLcc9fDdktxb5kmxA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/visitor-keys": "5.6.0" + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/visitor-keys": "5.7.0" } }, "@typescript-eslint/types": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.6.0.tgz", - "integrity": "sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.7.0.tgz", + "integrity": "sha512-5AeYIF5p2kAneIpnLFve8g50VyAjq7udM7ApZZ9JYjdPjkz0LvODfuSHIDUVnIuUoxafoWzpFyU7Sqbxgi79mA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.6.0.tgz", - "integrity": "sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.7.0.tgz", + "integrity": "sha512-aO1Ql+izMrTnPj5aFFlEJkpD4jRqC4Gwhygu2oHK2wfVQpmOPbyDSveJ+r/NQo+PWV43M6uEAeLVbTi09dFLhg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/visitor-keys": "5.6.0", + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/visitor-keys": "5.7.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -8095,12 +8095,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.6.0.tgz", - "integrity": "sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.7.0.tgz", + "integrity": "sha512-hdohahZ4lTFcglZSJ3DGdzxQHBSxsLVqHzkiOmKi7xVAWC4y2c1bIMKmPJSrA4aOEoRUPOKQ87Y/taC7yVHpFg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/types": "5.7.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -8269,12 +8269,12 @@ "dev": true }, "babel-jest": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.4.tgz", - "integrity": "sha512-+6RVutZxOQgJkt4svgTHPFtOQlVe9dUg3wrimIAM38pY6hL/nsL8glfFSUjD9jNVjaVjzkCzj6loFFecrjr9Qw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.5.tgz", + "integrity": "sha512-3uuUTjXbgtODmSv/DXO9nZfD52IyC2OYTFaXGRzL0kpykzroaquCrD5+lZNafTvZlnNqZHt5pb0M08qVBZnsnA==", "dev": true, "requires": { - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", @@ -9701,14 +9701,14 @@ } }, "jest": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.4.tgz", - "integrity": "sha512-AXwEIFa58Uf1Jno3/KSo5HZZ0/2Xwqvfrz0/3bmTwImkFlbOvz5vARAW9nTrxRLkojjkitaZ1KNKAtw3JRFAaA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.5.tgz", + "integrity": "sha512-uT5MiVN3Jppt314kidCk47MYIRilJjA/l2mxwiuzzxGUeJIvA8/pDaJOAX5KWvjAo7SCydcW0/4WEtgbLMiJkg==", "dev": true, "requires": { - "@jest/core": "^27.4.4", + "@jest/core": "^27.4.5", "import-local": "^3.0.2", - "jest-cli": "^27.4.4" + "jest-cli": "^27.4.5" } }, "jest-changed-files": { @@ -9723,9 +9723,9 @@ } }, "jest-circus": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.4.tgz", - "integrity": "sha512-4DWhvQerDq5X4GaqhEUoZiBhuNdKDGr0geW0iJwarbDljAmGaGOErKQG+z2PBr0vgN05z7tsGSY51mdWr8E4xg==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.5.tgz", + "integrity": "sha512-eTNWa9wsvBwPykhMMShheafbwyakcdHZaEYh5iRrQ0PFJxkDP/e3U/FvzGuKWu2WpwUA3C3hPlfpuzvOdTVqnw==", "dev": true, "requires": { "@jest/environment": "^27.4.4", @@ -9740,8 +9740,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-runtime": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "slash": "^3.0.0", @@ -9750,19 +9750,19 @@ } }, "jest-cli": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.4.tgz", - "integrity": "sha512-+MfsHnZPUOBigCBURuQFRpgYoPCgmIFkICkqt4SrramZCUp/UAuWcst4pMZb84O3VU8JyKJmnpGG4qH8ClQloA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.5.tgz", + "integrity": "sha512-hrky3DSgE0u7sQxaCL7bdebEPHx5QzYmrGuUjaPLmPE8jx5adtvGuOlRspvMoVLTTDOHRnZDoRLYJuA+VCI7Hg==", "dev": true, "requires": { - "@jest/core": "^27.4.4", + "@jest/core": "^27.4.5", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.4.4", + "jest-config": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "prompts": "^2.0.1", @@ -9787,28 +9787,28 @@ } }, "jest-config": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.4.tgz", - "integrity": "sha512-6lxg0ugO6KS2zKEbpdDwBzu1IT0Xg4/VhxXMuBu+z/5FvBjLCEMTaWQm3bCaGCZUR9j9FK4DzUIxyhIgn6kVEg==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.5.tgz", + "integrity": "sha512-t+STVJtPt+fpqQ8GBw850NtSQbnDOw/UzdPfzDaHQ48/AylQlW7LHj3dH+ndxhC1UxJ0Q3qkq7IH+nM1skwTwA==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.4.4", + "@jest/test-sequencer": "^27.4.5", "@jest/types": "^27.4.2", - "babel-jest": "^27.4.4", + "babel-jest": "^27.4.5", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.4", + "jest-circus": "^27.4.5", "jest-environment-jsdom": "^27.4.4", "jest-environment-node": "^27.4.4", "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.4", + "jest-jasmine2": "^27.4.5", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.4", - "jest-runner": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-runner": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "micromatch": "^4.0.4", @@ -9886,9 +9886,9 @@ "dev": true }, "jest-haste-map": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.4.tgz", - "integrity": "sha512-kvspmHmgPIZoDaqUsvsJFTaspuxhATvdO6wsFNGNSi8kfdiOCEEvECNbht8xG+eE5Ol88JyJmp2D7RF4dYo85Q==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.5.tgz", + "integrity": "sha512-oJm1b5qhhPs78K24EDGifWS0dELYxnoBiDhatT/FThgB9yxqUm5F6li3Pv+Q+apMBmmPNzOBnZ7ZxWMB1Leq1Q==", "dev": true, "requires": { "@jest/types": "^27.4.2", @@ -9901,15 +9901,15 @@ "jest-regex-util": "^27.4.0", "jest-serializer": "^27.4.0", "jest-util": "^27.4.2", - "jest-worker": "^27.4.4", + "jest-worker": "^27.4.5", "micromatch": "^4.0.4", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.4.tgz", - "integrity": "sha512-ygk2tUgtLeN3ouj4KEYw9p81GLI1EKrnvourPULN5gdgB482PH5op9gqaRG0IenbJhBbbRwiSvh5NoBoQZSqdA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.5.tgz", + "integrity": "sha512-oUnvwhJDj2LhOiUB1kdnJjkx8C5PwgUZQb9urF77mELH9DGR4e2GqpWQKBOYXWs5+uTN9BGDqRz3Aeg5Wts7aw==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", @@ -9925,8 +9925,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-runtime": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "throat": "^6.0.1" @@ -9995,15 +9995,15 @@ "dev": true }, "jest-resolve": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.4.tgz", - "integrity": "sha512-Yh5jK3PBmDbm01Rc8pT0XqpBlTPEGwWp7cN61ijJuwony/tR2Taof3TLy6yfNiuRS8ucUOPO7NBYm3ei38kkcg==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.5.tgz", + "integrity": "sha512-xU3z1BuOz/hUhVUL+918KqUgK+skqOuUsAi7A+iwoUldK6/+PW+utK8l8cxIWT9AW7IAhGNXjSAh1UYmjULZZw==", "dev": true, "requires": { "@jest/types": "^27.4.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", @@ -10013,26 +10013,26 @@ } }, "jest-resolve-dependencies": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.4.tgz", - "integrity": "sha512-iAnpCXh81sd9nbyqySvm5/aV9X6JZKE0dQyFXTC8tptXcdrgS0vjPFy+mEgzPHxXw+tq4TQupuTa0n8OXwRIxw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.5.tgz", + "integrity": "sha512-elEVvkvRK51y037NshtEkEnukMBWvlPzZHiL847OrIljJ8yIsujD2GXRPqDXC4rEVKbcdsy7W0FxoZb4WmEs7w==", "dev": true, "requires": { "@jest/types": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.4" + "jest-snapshot": "^27.4.5" } }, "jest-runner": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.4.tgz", - "integrity": "sha512-AXv/8Q0Xf1puWnDf52m7oLrK7sXcv6re0V/kItwTSVHJbX7Oebm07oGFQqGmq0R0mhO1zpmB3OpqRuaCN2elPA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.5.tgz", + "integrity": "sha512-/irauncTfmY1WkTaRQGRWcyQLzK1g98GYG/8QvIPviHgO1Fqz1JYeEIsSfF+9mc/UTA6S+IIHFgKyvUrtiBIZg==", "dev": true, "requires": { "@jest/console": "^27.4.2", "@jest/environment": "^27.4.4", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -10042,21 +10042,21 @@ "jest-docblock": "^27.4.0", "jest-environment-jsdom": "^27.4.4", "jest-environment-node": "^27.4.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-leak-detector": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.4", - "jest-runtime": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-runtime": "^27.4.5", "jest-util": "^27.4.2", - "jest-worker": "^27.4.4", + "jest-worker": "^27.4.5", "source-map-support": "^0.5.6", "throat": "^6.0.1" } }, "jest-runtime": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.4.tgz", - "integrity": "sha512-tZGay6P6vXJq8t4jVFAUzYHx+lzIHXjz+rj1XBk6mAR1Lwtf5kz0Uun7qNuU+oqpZu4+hhuxpUfXb6j30bEPqA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.5.tgz", + "integrity": "sha512-CIYqwuJQXHQtPd/idgrx4zgJ6iCb6uBjQq1RSAGQrw2S8XifDmoM1Ot8NRd80ooAm+ZNdHVwsktIMGlA1F1FAQ==", "dev": true, "requires": { "@jest/console": "^27.4.2", @@ -10064,7 +10064,7 @@ "@jest/globals": "^27.4.4", "@jest/source-map": "^27.4.0", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", @@ -10074,12 +10074,12 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-message-util": "^27.4.2", "jest-mock": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "slash": "^3.0.0", @@ -10115,9 +10115,9 @@ } }, "jest-snapshot": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.4.tgz", - "integrity": "sha512-yy+rpCvYMOjTl7IMuaMI9OP9WT229zi8BhdNHm6e6mttAOIzvIiCxFoZ6yRxaV3HDPPgMryi+ReX2b8+IQJdPA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.5.tgz", + "integrity": "sha512-eCi/iM1YJFrJWiT9de4+RpWWWBqsHiYxFG9V9o/n0WXs6GpW4lUt4FAHAgFPTLPqCUVzrMQmSmTZSgQzwqR7IQ==", "dev": true, "requires": { "@babel/core": "^7.7.2", @@ -10126,7 +10126,7 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", @@ -10136,10 +10136,10 @@ "graceful-fs": "^4.2.4", "jest-diff": "^27.4.2", "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.4", + "jest-resolve": "^27.4.5", "jest-util": "^27.4.2", "natural-compare": "^1.4.0", "pretty-format": "^27.4.2", @@ -10198,9 +10198,9 @@ } }, "jest-worker": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", - "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", + "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", "dev": true, "requires": { "@types/node": "*", @@ -11723,9 +11723,9 @@ } }, "typescript": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.3.tgz", - "integrity": "sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", "dev": true }, "universalify": { diff --git a/package.json b/package.json index 7c3f364..e071a54 100644 --- a/package.json +++ b/package.json @@ -25,16 +25,16 @@ "devDependencies": { "@commitlint/cli": "15.0.0", "@commitlint/config-angular": "15.0.0", - "@nordicsemiconductor/asset-tracker-cloud-code-style": "9.2.31", + "@nordicsemiconductor/asset-tracker-cloud-code-style": "9.2.33", "@types/jest": "27.0.3", - "@types/node": "16.11.12", + "@types/node": "16.11.13", "eslint": "8.4.1", "husky": "7.0.4", - "jest": "27.4.4", + "jest": "27.4.5", "lint-staged": "12.1.2", "prettier": "2.5.1", "ts-jest": "27.1.1", - "typescript": "4.5.3" + "typescript": "4.5.4" }, "lint-staged": { "*.ts": [ From 4c79e2aab3461e18018ddddc1f97043944c0a388 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 15 Dec 2021 21:57:40 +0100 Subject: [PATCH 101/110] refactor: loop over neighbors --- day15/navigateCave.ts | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/day15/navigateCave.ts b/day15/navigateCave.ts index 873355e..0555be4 100644 --- a/day15/navigateCave.ts +++ b/day15/navigateCave.ts @@ -23,21 +23,25 @@ const navigateCave = ( const [x, y] = current const currentDistance = distance[y][x] - if (cave[y - 1]?.[x] !== undefined && unvisited[y - 1][x]) { - const upDistance = cave[y - 1][x] + currentDistance - distance[y - 1][x] = Math.min(upDistance, distance[y - 1][x]) - } - if (cave[y + 1]?.[x] !== undefined && unvisited[y + 1][x]) { - const downDistance = cave[y + 1][x] + currentDistance - distance[y + 1][x] = Math.min(downDistance, distance[y + 1][x]) - } - if (cave[y][x - 1] !== undefined && unvisited[y][x - 1]) { - const leftDistance = cave[y][x - 1] + currentDistance - distance[y][x - 1] = Math.min(distance[y][x - 1], leftDistance) - } - if (cave[y][x + 1] !== undefined && unvisited[y][x + 1]) { - const rightDistance = cave[y][x + 1] + currentDistance - distance[y][x + 1] = Math.min(distance[y][x + 1], rightDistance) + const neighbors = [ + // up + [y - 1, x], + // down + [y + 1, x], + // right + [y, x - 1], + // left + [y, x + 1], + ] + for (const [nY, nX] of neighbors) { + if (cave[nY]?.[nX] !== undefined && unvisited[nY][nX]) { + const nDistance = cave[nY][nX] + currentDistance + if (nDistance < distance[nY][nX]) { + distance[nY][nX] = nDistance + // Add to queue, but punish using manhattan distance + queue.push([nX, nY, nDistance]) + } + } } unvisited[y][x] = false From b9c57830331f8669da34bbed83c6fb1ed457cdee Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Wed, 15 Dec 2021 21:58:43 +0100 Subject: [PATCH 102/110] refactor: improve runtime by using a queue --- day15/navigateCave.ts | 24 +++++++----------------- day15/solution.spec.ts | 2 +- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/day15/navigateCave.ts b/day15/navigateCave.ts index 0555be4..f4a5df7 100644 --- a/day15/navigateCave.ts +++ b/day15/navigateCave.ts @@ -18,8 +18,12 @@ const navigateCave = ( } } distance[0][0] = 0 - let current: [x: number, y: number] | undefined = [0, 0] - while (current !== undefined) { + + const queue: [x: number, y: number, prio: number][] = [[0, 0, 0]] + let current: [x: number, y: number, prio: number] | undefined = undefined + while ( + (current = queue.sort(([, , prio0], [, , prio1]) => prio1 - prio0).pop()) + ) { const [x, y] = current const currentDistance = distance[y][x] @@ -38,7 +42,7 @@ const navigateCave = ( const nDistance = cave[nY][nX] + currentDistance if (nDistance < distance[nY][nX]) { distance[nY][nX] = nDistance - // Add to queue, but punish using manhattan distance + // Add to queue, if a better distance was found queue.push([nX, nY, nDistance]) } } @@ -48,20 +52,6 @@ const navigateCave = ( if (y === cave.length - 1 && x === cave[y].length - 1) { onEnd(currentDistance) } - - const caveDistances = [] - for (let y = 0; y < cave.length; y++) { - for (let x = 0; x < cave[y].length; x++) { - if (unvisited[y][x]) - caveDistances.push({ - position: [x, y] as [x: number, y: number], - distance: distance[y][x], - }) - } - } - current = caveDistances - .sort(({ distance: d1 }, { distance: d2 }) => d2 - d1) - .pop()?.position } } diff --git a/day15/solution.spec.ts b/day15/solution.spec.ts index 25766b7..3c60839 100644 --- a/day15/solution.spec.ts +++ b/day15/solution.spec.ts @@ -27,7 +27,7 @@ describe('Day 15: Chiton', () => { describe('Part 2', () => { it('should solve the example', () => expect(lowestRisk(wrap(example))).toEqual(315)) - it.skip('should solve the puzzle', () => + it('should solve the puzzle', () => expect(lowestRisk(wrap(input))).toEqual(3045)) }) }) From 7c7cc9f5b97d7e834b09c329d86e1c93f4d654c4 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Thu, 16 Dec 2021 08:38:53 +0100 Subject: [PATCH 103/110] fix: update dependencies --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index ba84344..dc1c436 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@commitlint/config-angular": "15.0.0", "@nordicsemiconductor/asset-tracker-cloud-code-style": "9.2.33", "@types/jest": "27.0.3", - "@types/node": "16.11.13", + "@types/node": "17.0.0", "eslint": "8.4.1", "husky": "7.0.4", "jest": "27.4.5", @@ -1470,9 +1470,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.11.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.13.tgz", - "integrity": "sha512-eUXZzHLHoZqj1frtUetNkUetYoJ6X55UmrVnFD4DMhVeAmwLjniZhtBmsRiemQh4uq4G3vUra/Ws/hs9vEvL3Q==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", + "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -7976,9 +7976,9 @@ "dev": true }, "@types/node": { - "version": "16.11.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.13.tgz", - "integrity": "sha512-eUXZzHLHoZqj1frtUetNkUetYoJ6X55UmrVnFD4DMhVeAmwLjniZhtBmsRiemQh4uq4G3vUra/Ws/hs9vEvL3Q==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", + "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", "dev": true }, "@types/normalize-package-data": { diff --git a/package.json b/package.json index e071a54..7eb29a7 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@commitlint/config-angular": "15.0.0", "@nordicsemiconductor/asset-tracker-cloud-code-style": "9.2.33", "@types/jest": "27.0.3", - "@types/node": "16.11.13", + "@types/node": "17.0.0", "eslint": "8.4.1", "husky": "7.0.4", "jest": "27.4.5", From 374e60495f63676e3cef3e9ec473c963ded03c76 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Thu, 16 Dec 2021 09:17:21 +0100 Subject: [PATCH 104/110] feat(day16): parse literal --- day16/solution.spec.ts | 50 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 day16/solution.spec.ts diff --git a/day16/solution.spec.ts b/day16/solution.spec.ts new file mode 100644 index 0000000..08f0b01 --- /dev/null +++ b/day16/solution.spec.ts @@ -0,0 +1,50 @@ +const parseHex = (hex: string): string => parseInt(hex, 16).toString(2) + +describe('parseHex()', () => { + it('should convert hex to binary', () => + expect(parseHex('D2FE28')).toEqual('110100101111111000101000')) +}) + +const toNumber = (bits: string): number => parseInt(bits, 2) + +const chunk = (bits: string, length: number): string[] => { + const chunks: string[] = [] + for (let i = 0; i < bits.length; i += length) { + chunks.push(bits.slice(i, i + length)) + } + return chunks +} + +describe('Day 16: Packet Decoder', () => { + describe('Part 1', () => { + it('should parse literal values', () => { + const message = 'D2FE28' + // The first step of decoding the message is to convert the hexadecimal representation into binary. + const binary = parseHex(message) + // Every packet begins with a standard header: + // - the first three bits encode the packet version + const version = binary.slice(0, 3) + // - and the next three bits encode the packet type ID + const typeId = binary.slice(3, 6) + // These two values are numbers; all numbers encoded in any packet are represented as binary with the most significant bit first. + // For example, a version encoded as the binary sequence 100 represents the number 4. + expect(toNumber(version)).toEqual(6) + expect(toNumber(typeId)).toEqual(4) + // Packets with type ID 4 represent a literal value. + // Literal value packets encode a single binary number. + // To do this, the binary number is padded with leading zeroes until its length is a multiple of four bits, + const rest = binary.slice(6) + // and then it is broken into groups of four bits. + const groups = chunk(rest, 5) + expect(groups).toEqual(['10111', '11110', '00101', '000']) + // Each group is prefixed by a 1 bit except the last group, which is prefixed by a 0 bit. These groups of five bits immediately follow the packet header. + const literal = groups + .filter((g) => g.length === 5) + .map((b) => b.slice(1)) + .join('') + expect(literal).toEqual('011111100101') + const number = toNumber(literal) + expect(number).toEqual(2021) + }) + }) +}) From 9a53dcece1e8936d7443942c93ea587b3977a9c2 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 17 Dec 2021 00:59:21 +0100 Subject: [PATCH 105/110] feat(day16): parts of part 1 --- day16/solution.spec.ts | 168 +++++++++++++++++++++++++++++++++-------- 1 file changed, 137 insertions(+), 31 deletions(-) diff --git a/day16/solution.spec.ts b/day16/solution.spec.ts index 08f0b01..9a8396c 100644 --- a/day16/solution.spec.ts +++ b/day16/solution.spec.ts @@ -1,8 +1,13 @@ -const parseHex = (hex: string): string => parseInt(hex, 16).toString(2) +const parseHex = (hex: string): string => + parseInt(hex, 16) + .toString(2) + .padStart(hex.length * 4, '0') describe('parseHex()', () => { - it('should convert hex to binary', () => - expect(parseHex('D2FE28')).toEqual('110100101111111000101000')) + it.each([['D2FE28', '110100101111111000101000']])( + 'should convert hex %s to binary %s', + (hex, bin) => expect(parseHex(hex)).toEqual(bin), + ) }) const toNumber = (bits: string): number => parseInt(bits, 2) @@ -15,36 +20,137 @@ const chunk = (bits: string, length: number): string[] => { return chunks } +enum Type { + Literal = 4, + Operator = 9, +} + +const vt = (binary: string) => ({ + version: toNumber(binary.slice(0, 3)), + typeId: toNumber(binary.slice(3, 6)), +}) + +const parseTransmission = (binary: string, packets: any[] = [], pos = 0) => { + const parseVersion = () => { + const version = toNumber(binary.slice(pos, pos + 3)) + if (isNaN(version) || version === 0) return + pos += 3 + return version + } + + const parseTypeId = () => { + const typeId = toNumber(binary.slice(pos, pos + 3)) + if (isNaN(typeId) || typeId === 0) return + pos += 3 + return typeId + } + + const parseLiteral = () => { + let isLast = false + const literalBits = [] + do { + isLast = binary.slice(pos, pos + 1) === '0' + literalBits.push(binary.slice(pos + 1, pos + 5)) + pos = pos + 5 + } while (!isLast) + const literal = toNumber(literalBits.join('')) + return literal + } + + const parseLengthTypeId = () => { + const lengthTypeId = parseInt(binary.slice(pos, pos + 1)) + pos++ + return lengthTypeId + } + + const parseSubPacketLength = () => { + const subPacketLength = toNumber(binary.slice(pos, pos + 15)) + pos += 15 + return subPacketLength + } + + const parseSubPacketNumber = () => { + const subPacketNumber = toNumber(binary.slice(pos, pos + 11)) + pos += 11 + return subPacketNumber + } + + const parseSubPacketsByLength = (len: number) => { + const subPacket = binary.slice(pos, pos + len) + pos += len + return parseTransmission(subPacket, packets, 0) + } + + while (pos < binary.length) { + const version = parseVersion() + if (version === undefined) return pos + const typeId = parseTypeId() + if (typeId === undefined) return pos + // console.log({ version, typeId }) + if (typeId === 4) { + // Literal + packets.push({ literal: parseLiteral(), version, typeId }) + } else { + packets.push({ version, typeId }) + // Other types are operator packages + const lengthTypeId = parseLengthTypeId() + if (lengthTypeId === 0) { + // 15-bit number representing the number of bits in the sub-packets + const subPacketLength = parseSubPacketLength() + parseSubPacketsByLength(subPacketLength) + } else { + // length is a 11-bit number representing the number of sub-packets. + const subPacketNumber = parseSubPacketNumber() + for (let p = 0; p < subPacketNumber; p++) { + pos = parseTransmission(binary, packets, pos) + } + } + } + } + return pos +} + +describe('parseTransmission()', () => { + it('should parse a literal', () => { + const result: any[] = [] + parseTransmission(parseHex('D2FE28'), result) + expect(result).toMatchObject([{ literal: 2021 }]) + }) + it('should parse operations', () => { + const result: any[] = [] + parseTransmission(parseHex('38006F45291200'), result) + expect(result).toMatchObject([ + { version: 1, typeId: 6 }, + { literal: 10 }, + { literal: 20 }, + ]) + }) + it('should parse operations', () => { + const result: any[] = [] + parseTransmission(parseHex('EE00D40C823060'), result) + expect(result).toMatchObject([ + { version: 7, typeId: 3 }, + { literal: 1 }, + { literal: 2 }, + { literal: 3 }, + ]) + }) +}) + describe('Day 16: Packet Decoder', () => { describe('Part 1', () => { - it('should parse literal values', () => { - const message = 'D2FE28' - // The first step of decoding the message is to convert the hexadecimal representation into binary. - const binary = parseHex(message) - // Every packet begins with a standard header: - // - the first three bits encode the packet version - const version = binary.slice(0, 3) - // - and the next three bits encode the packet type ID - const typeId = binary.slice(3, 6) - // These two values are numbers; all numbers encoded in any packet are represented as binary with the most significant bit first. - // For example, a version encoded as the binary sequence 100 represents the number 4. - expect(toNumber(version)).toEqual(6) - expect(toNumber(typeId)).toEqual(4) - // Packets with type ID 4 represent a literal value. - // Literal value packets encode a single binary number. - // To do this, the binary number is padded with leading zeroes until its length is a multiple of four bits, - const rest = binary.slice(6) - // and then it is broken into groups of four bits. - const groups = chunk(rest, 5) - expect(groups).toEqual(['10111', '11110', '00101', '000']) - // Each group is prefixed by a 1 bit except the last group, which is prefixed by a 0 bit. These groups of five bits immediately follow the packet header. - const literal = groups - .filter((g) => g.length === 5) - .map((b) => b.slice(1)) - .join('') - expect(literal).toEqual('011111100101') - const number = toNumber(literal) - expect(number).toEqual(2021) + it.skip.each([ + ['8A004A801A8002F478', 16], + //['620080001611562C8802118E34', 12], + //['C0015000016115A2E0802F182340', 23], + //['A0016C880162017C3686B18A3D4780', 31], + ])('should solve the example', (hex, versionSum) => { + const result: any[] = [] + parseTransmission(parseHex(hex), result) + console.log(result) + expect(result.reduce((sum, { version }) => sum + version, 0)).toEqual( + versionSum, + ) }) }) }) From 46f4d64b81be945625d72126c944c5c51c4aa7d4 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Sat, 18 Dec 2021 00:38:42 +0100 Subject: [PATCH 106/110] feat: day17 --- day17/game.ts | 85 +++++++++++++++++++++++++++++++++++++++++ day17/probeLauncher.ts | 76 +++++++++++++++++++++++++++++++++++++ day17/solution.spec.ts | 24 ++++++++++++ day17/trickShot.ts | 86 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 271 insertions(+) create mode 100644 day17/game.ts create mode 100644 day17/probeLauncher.ts create mode 100644 day17/solution.spec.ts create mode 100644 day17/trickShot.ts diff --git a/day17/game.ts b/day17/game.ts new file mode 100644 index 0000000..f254238 --- /dev/null +++ b/day17/game.ts @@ -0,0 +1,85 @@ +import { Point, probeLauncher, Target } from './probeLauncher.js' + +let trajectory: Point = { x: 18, y: 1 } +const target: Target = { from: { x: 20, y: -10 }, to: { x: 30, y: -5 } } + +const render = () => { + process.stdout.write('\u001b[2J') // Clear screen + const { points, hit, highestY } = probeLauncher(target, trajectory) + const pointsYSorted = points.sort(({ y: y1 }, { y: y2 }) => y2 - y1) + const pointsMinY = pointsYSorted[0].y + const pointsMaxY = pointsYSorted[pointsYSorted.length - 1].y + const deltaY = pointsMaxY < 0 ? pointsMinY : pointsMaxY + + const pointsXSorted = points.sort(({ x: x1 }, { x: x2 }) => x2 - x1) + const pointsMinX = pointsXSorted[0].x + const pointsMaxX = pointsXSorted[pointsXSorted.length - 1].x + const deltaX = pointsMaxX < 0 ? pointsMinX : pointsMaxX + + const shifted = points.map((point) => ({ + ...point, + y: -point.y + deltaY, + x: point.x + deltaX, + })) + + const maxX = shifted.sort(({ x: x1 }, { x: x2 }) => x2 - x1)[0].x + const maxY = shifted.sort(({ y: y1 }, { y: y2 }) => y2 - y1)[0].y + const map: string[][] = [] + for (let y = 0; y <= maxY; y++) { + map[y] = [] + for (let x = 0; x <= maxX; x++) { + map[y][x] = ' ' + } + } + for (const { x, y, icon } of shifted) { + map[y][x] = icon + } + + console.log(map.map((s) => s.join('')).join('\n')) + console.log({ trajectory, hit, highestY }) +} + +render() + +const stdin = process.stdin + +// without this, we would only get streams once enter is pressed +stdin.setRawMode(true) + +// resume stdin in the parent process (node app won't quit all by itself +// unless an error or process.exit() happens) +stdin.resume() + +// i don't want binary, do you? +stdin.setEncoding('utf8') + +// on any data into stdin +stdin.on('data', (key) => { + // ctrl-c ( end of text ) + if (key.toString() === '\u0003') { + process.exit() + } + switch (key.toString()) { + case '\u0003': + process.exit() + break + case '\u001b[A': + trajectory = { ...trajectory, y: trajectory.y + 1 } + render() + break + case '\u001b[B': + trajectory = { ...trajectory, y: trajectory.y - 1 } + render() + break + case '\u001b[D': + trajectory = { ...trajectory, x: trajectory.x - 1 } + render() + break + case '\u001b[C': + trajectory = { ...trajectory, x: trajectory.x + 1 } + render() + break + } +}) + +render() diff --git a/day17/probeLauncher.ts b/day17/probeLauncher.ts new file mode 100644 index 0000000..35dff98 --- /dev/null +++ b/day17/probeLauncher.ts @@ -0,0 +1,76 @@ +export type Point = { x: number; y: number } +export type Target = { from: Point; to: Point } +export type Element = Point & { icon: 'S' | 'T' | '#' | 'X' } + +export const probeLauncher = ( + targetArea: Target, + trajectory: Point, +): { hit: boolean; points: Element[]; highestY: number } => { + const points: Element[] = [ + { x: 0, y: 0, icon: 'S' }, // ship + ] + + // Add target area + const targetStartY = Math.min(targetArea.from.y, targetArea.to.y) + const targetEndY = Math.max(targetArea.from.y, targetArea.to.y) + + const targetStartX = Math.min(targetArea.from.x, targetArea.to.x) + const targetEndX = Math.max(targetArea.from.x, targetArea.to.x) + + // Add probe proints + // The probe's x,y position starts at 0,0. Then, it will follow some trajectory by moving in steps. On each step, these changes occur in the following order: + // - The probe's x position increases by its x velocity. + // - The probe's y position increases by its y velocity. + // - Due to drag, the probe's x velocity changes by 1 toward the value 0; that is, it decreases by 1 if it is greater than 0, increases by 1 if it is less than 0, or does not change if it is already 0. + // - Due to gravity, the probe's y velocity decreases by 1. + const probePoints: Point[] = [] + let probeXVelocity = trajectory.x + let probeYVelocity = trajectory.y + let probeX = 0 + let probeY = 0 + let hit = false + let highestY = 0 + do { + probeX += probeXVelocity + probeY += probeYVelocity + if (probeXVelocity > 0) probeXVelocity-- + if (probeXVelocity < 0) probeXVelocity++ + probeYVelocity-- + probePoints.push({ + x: probeX, + y: probeY, + }) + if (!hit) { + if ( + probeX >= targetStartX && + probeX <= targetEndX && + probeY >= targetStartY && + probeY <= targetEndY + ) + hit = true + } + if (probeY > highestY) highestY = probeY + } while (targetStartY < probeY) + + // Add elements for target + for (let y = targetStartY; y <= targetEndY; y++) { + for (let x = targetStartX; x <= targetEndX; x++) { + points.push({ + x, + y, + icon: hit ? 'X' : 'T', + }) + } + } + + // Add elements for probe + points.push( + ...probePoints.map((point) => ({ ...point, icon: '#' } as Element)), + ) + + return { + points, + hit, + highestY, + } +} diff --git a/day17/solution.spec.ts b/day17/solution.spec.ts new file mode 100644 index 0000000..75f4df0 --- /dev/null +++ b/day17/solution.spec.ts @@ -0,0 +1,24 @@ +import { trickShot } from './trickShot' + +describe('Day 17: Trick Shot', () => { + describe('Part 1', () => { + it('should solve the puzzle', () => { + expect( + trickShot({ + from: { x: 138, y: -125 }, + to: { x: 184, y: -71 }, + }).highestY, + ).toEqual(7750) + }) + }) + describe('Part 2', () => { + it('should solve the puzzle', () => { + expect( + trickShot({ + from: { x: 138, y: -125 }, + to: { x: 184, y: -71 }, + }).hittingVelocities.length, + ).toEqual(4120) + }) + }) +}) diff --git a/day17/trickShot.ts b/day17/trickShot.ts new file mode 100644 index 0000000..8897f2a --- /dev/null +++ b/day17/trickShot.ts @@ -0,0 +1,86 @@ +import { Target, Point } from './probeLauncher' + +const shootAt = (targetArea: Target) => { + const targetStartY = Math.min(targetArea.from.y, targetArea.to.y) + const targetEndY = Math.max(targetArea.from.y, targetArea.to.y) + + const targetStartX = Math.min(targetArea.from.x, targetArea.to.x) + const targetEndX = Math.max(targetArea.from.x, targetArea.to.x) + + return ( + trajectory: Point, + ): { + hit: boolean + highestY: number + } => { + let hitOrMiss = false + let highestY = 0 + let yPos = 0 + let probeX = 0 + let probeY = 0 + let probeXVelocity = trajectory.x + let probeYVelocity = trajectory.y + while (!hitOrMiss) { + probeX += probeXVelocity + probeY += probeYVelocity + if (probeY > yPos) yPos = probeY + if (probeXVelocity > 0) probeXVelocity -= 1 + if (probeXVelocity < 0) probeXVelocity += 1 + probeYVelocity -= 1 + if ( + probeX >= targetStartX && + probeX <= targetEndX && + probeY >= targetStartY && + probeY <= targetEndY + ) { + hitOrMiss = true + if (yPos > highestY) highestY = yPos + return { + hit: true, + highestY, + } + } else if (probeX > targetEndX || probeY < targetStartY) { + hitOrMiss = true + return { + hit: false, + highestY, + } + } + } + return { + hit: false, + highestY, + } + } +} + +/** + * Brute-force all velocities with an upper limit + */ +export const trickShot = ({ + from, + to, +}: { + from: Point + to: Point +}): { + highestY: number + hittingVelocities: Point[] +} => { + const aim = shootAt({ from, to }) + let highestY = 0 + const hittingVelocities: Point[] = [] + for (let x = 1; x < 1000; x++) { + for (let y = -1000; y < 1000; y++) { + const { hit, highestY: maxY } = aim({ x, y }) + if (maxY > highestY) highestY = maxY + if (hit) { + hittingVelocities.push({ x, y }) + } + } + } + return { + hittingVelocities, + highestY, + } +} From cd071c0489d94daa0364f732be7454b355848d29 Mon Sep 17 00:00:00 2001 From: Markus Tacker Date: Fri, 24 Dec 2021 13:09:56 +0100 Subject: [PATCH 107/110] fix: update dependencies --- day02/solution.spec.ts | 3 +- day17/trickShot.ts | 2 +- lib/loader.ts | 22 +- package-lock.json | 780 +++++++++++++++++++++++------------------ package.json | 10 +- 5 files changed, 465 insertions(+), 352 deletions(-) diff --git a/day02/solution.spec.ts b/day02/solution.spec.ts index b8eadde..abb91c2 100644 --- a/day02/solution.spec.ts +++ b/day02/solution.spec.ts @@ -1,7 +1,6 @@ import { loader } from '../lib/loader' import { dive } from './dive' -import { AimedPosition } from './diveAim' -import { diveAim } from './diveAim' +import { AimedPosition, diveAim } from './diveAim' import { parseCommand } from './parseCommand' const course = loader(2)('course').map(parseCommand) diff --git a/day17/trickShot.ts b/day17/trickShot.ts index 8897f2a..1047680 100644 --- a/day17/trickShot.ts +++ b/day17/trickShot.ts @@ -1,4 +1,4 @@ -import { Target, Point } from './probeLauncher' +import { Point, Target } from './probeLauncher' const shootAt = (targetArea: Target) => { const targetStartY = Math.min(targetArea.from.y, targetArea.to.y) diff --git a/lib/loader.ts b/lib/loader.ts index 5378c92..615be9c 100644 --- a/lib/loader.ts +++ b/lib/loader.ts @@ -7,14 +7,16 @@ export const loadString = (s: string): string[] => .split('\n') .map((s) => s.trim()) -export const loader = (day: number) => (file: string): string[] => - loadString( - fs.readFileSync( - path.resolve( - process.cwd(), - `day${day.toString().padStart(2, '0')}`, - `${file}.txt`, +export const loader = + (day: number) => + (file: string): string[] => + loadString( + fs.readFileSync( + path.resolve( + process.cwd(), + `day${day.toString().padStart(2, '0')}`, + `${file}.txt`, + ), + 'utf-8', ), - 'utf-8', - ), - ) + ) diff --git a/package-lock.json b/package-lock.json index dc1c436..b0fef06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,15 +12,15 @@ "devDependencies": { "@commitlint/cli": "15.0.0", "@commitlint/config-angular": "15.0.0", - "@nordicsemiconductor/asset-tracker-cloud-code-style": "9.2.33", + "@nordicsemiconductor/asset-tracker-cloud-code-style": "10.0.0", "@types/jest": "27.0.3", - "@types/node": "17.0.0", - "eslint": "8.4.1", + "@types/node": "17.0.4", + "eslint": "8.5.0", "husky": "7.0.4", "jest": "27.4.5", - "lint-staged": "12.1.2", + "lint-staged": "12.1.4", "prettier": "2.5.1", - "ts-jest": "27.1.1", + "ts-jest": "27.1.2", "typescript": "4.5.4" }, "engines": { @@ -1312,19 +1312,20 @@ } }, "node_modules/@nordicsemiconductor/asset-tracker-cloud-code-style": { - "version": "9.2.33", - "resolved": "https://registry.npmjs.org/@nordicsemiconductor/asset-tracker-cloud-code-style/-/asset-tracker-cloud-code-style-9.2.33.tgz", - "integrity": "sha512-NjVQiOGyCTi0owOmNicsatMoqz0Dye9Efaokt0iogQ3SzUr2+YwHGwCqRNVHvEI4CbxkqzdlU/PdHhn6AlK67A==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/asset-tracker-cloud-code-style/-/asset-tracker-cloud-code-style-10.0.0.tgz", + "integrity": "sha512-t9/Ltx8D48+Dx5SbEKMWTX8fogEHutAq41otBTzXZFjAb0IANw35e68fi886a7i4lpTMkF7KjSXIJb73oUQNMA==", "dev": true, "dependencies": { "@commitlint/cli": "15.0.0", "@commitlint/config-angular": "15.0.0", - "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": "8.1.19", - "eslint": "8.4.1", + "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": "8.1.20", + "eslint": "8.5.0", "husky": "7.0.4", - "lint-staged": "12.1.2", + "lint-staged": "12.1.3", "pinst": "2.1.6", "prettier": "2.5.1", + "prettier-plugin-organize-imports": "2.3.4", "typescript": "4.5.4" }, "engines": { @@ -1332,13 +1333,55 @@ "npm": ">=7" } }, + "node_modules/@nordicsemiconductor/asset-tracker-cloud-code-style/node_modules/lint-staged": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.1.3.tgz", + "integrity": "sha512-ajapdkaFxx+MVhvq6xQRg9zCnCLz49iQLJZP7+w8XaA3U4B35Z9xJJGq9vxmWo73QTvJLG+N2NxhjWiSexbAWQ==", + "dev": true, + "dependencies": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.16", + "commander": "^8.3.0", + "debug": "^4.3.3", + "execa": "^5.1.1", + "lilconfig": "2.0.4", + "listr2": "^3.13.5", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "object-inspect": "^1.11.1", + "string-argv": "^0.3.1", + "supports-color": "^9.2.1", + "yaml": "^1.10.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/@nordicsemiconductor/asset-tracker-cloud-code-style/node_modules/supports-color": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.1.tgz", + "integrity": "sha512-Obv7ycoCTG51N7y175StI9BlAXrmgZrFhZOb0/PyjHBher/NmsdBgbbQ1Inhq+gIhz6+7Gb+jWF2Vqi7Mf1xnQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": { - "version": "8.1.19", - "resolved": "https://registry.npmjs.org/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript/-/eslint-config-asset-tracker-cloud-typescript-8.1.19.tgz", - "integrity": "sha512-lL9bB/DxocHWqXtcqQi2GaEcUVdvhDJXA3CQUfjU69AorKwYkRRfkCLlWvbLb7429MuFa05FiMwkVGnnrLjU+Q==", + "version": "8.1.20", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript/-/eslint-config-asset-tracker-cloud-typescript-8.1.20.tgz", + "integrity": "sha512-bdi5w17wx5eAetgzfqEpuWnoOCry9a6psu5dQrFijUt599b/HN5chCHbsaODXUIdnoohMQk2izmO+ZfIWsl1EA==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "5.7.0", + "@typescript-eslint/eslint-plugin": "5.8.0", "eslint-config-prettier": "8.3.0" }, "engines": { @@ -1470,9 +1513,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", - "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.4.tgz", + "integrity": "sha512-6xwbrW4JJiJLgF+zNypN5wr2ykM9/jHcL7rQ8fZe2vuftggjzZeRSM4OwRc6Xk8qWjwJ99qVHo/JgOGmomWRog==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -1515,13 +1558,13 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.7.0.tgz", - "integrity": "sha512-8RTGBpNn5a9M628wBPrCbJ+v3YTEOE2qeZb7TDkGKTDXSj36KGRg92SpFFaR/0S3rSXQxM0Og/kV9EyadsYSBg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.8.0.tgz", + "integrity": "sha512-spu1UW7QuBn0nJ6+psnfCc3iVoQAifjKORgBngKOmC8U/1tbe2YJMzYQqDGYB4JCss7L8+RM2kKLb1B1Aw9BNA==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "5.7.0", - "@typescript-eslint/scope-manager": "5.7.0", + "@typescript-eslint/experimental-utils": "5.8.0", + "@typescript-eslint/scope-manager": "5.8.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -1547,15 +1590,15 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.7.0.tgz", - "integrity": "sha512-u57eZ5FbEpzN5kSjmVrSesovWslH2ZyNPnaXQMXWgH57d5+EVHEt76W75vVuI9qKZ5BMDKNfRN+pxcPEjQjb2A==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.8.0.tgz", + "integrity": "sha512-KN5FvNH71bhZ8fKtL+lhW7bjm7cxs1nt+hrDZWIqb6ViCffQcWyLunGrgvISgkRojIDcXIsH+xlFfI4RCDA0xA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.7.0", - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/typescript-estree": "5.7.0", + "@typescript-eslint/scope-manager": "5.8.0", + "@typescript-eslint/types": "5.8.0", + "@typescript-eslint/typescript-estree": "5.8.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -1567,19 +1610,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.7.0.tgz", - "integrity": "sha512-m/gWCCcS4jXw6vkrPQ1BjZ1vomP01PArgzvauBqzsoZ3urLbsRChexB8/YV8z9HwE3qlJM35FxfKZ1nfP/4x8g==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.8.0.tgz", + "integrity": "sha512-Gleacp/ZhRtJRYs5/T8KQR3pAQjQI89Dn/k+OzyCKOsLiZH2/Vh60cFBTnFsHNI6WAD+lNUo/xGZ4NeA5u0Ipw==", "dev": true, "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.7.0", - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/typescript-estree": "5.7.0", + "@typescript-eslint/scope-manager": "5.8.0", + "@typescript-eslint/types": "5.8.0", + "@typescript-eslint/typescript-estree": "5.8.0", "debug": "^4.3.2" }, "engines": { @@ -1599,13 +1642,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.7.0.tgz", - "integrity": "sha512-7mxR520DGq5F7sSSgM0HSSMJ+TFUymOeFRMfUfGFAVBv8BR+Jv1vHgAouYUvWRZeszVBJlLcc9fDdktxb5kmxA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.8.0.tgz", + "integrity": "sha512-x82CYJsLOjPCDuFFEbS6e7K1QEWj7u5Wk1alw8A+gnJiYwNnDJk0ib6PCegbaPMjrfBvFKa7SxE3EOnnIQz2Gg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/visitor-keys": "5.7.0" + "@typescript-eslint/types": "5.8.0", + "@typescript-eslint/visitor-keys": "5.8.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1616,9 +1659,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.7.0.tgz", - "integrity": "sha512-5AeYIF5p2kAneIpnLFve8g50VyAjq7udM7ApZZ9JYjdPjkz0LvODfuSHIDUVnIuUoxafoWzpFyU7Sqbxgi79mA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.8.0.tgz", + "integrity": "sha512-LdCYOqeqZWqCMOmwFnum6YfW9F3nKuxJiR84CdIRN5nfHJ7gyvGpXWqL/AaW0k3Po0+wm93ARAsOdzlZDPCcXg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1629,13 +1672,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.7.0.tgz", - "integrity": "sha512-aO1Ql+izMrTnPj5aFFlEJkpD4jRqC4Gwhygu2oHK2wfVQpmOPbyDSveJ+r/NQo+PWV43M6uEAeLVbTi09dFLhg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.8.0.tgz", + "integrity": "sha512-srfeZ3URdEcUsSLbkOFqS7WoxOqn8JNil2NSLO9O+I2/Uyc85+UlfpEvQHIpj5dVts7KKOZnftoJD/Fdv0L7nQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/visitor-keys": "5.7.0", + "@typescript-eslint/types": "5.8.0", + "@typescript-eslint/visitor-keys": "5.8.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -1656,12 +1699,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.7.0.tgz", - "integrity": "sha512-hdohahZ4lTFcglZSJ3DGdzxQHBSxsLVqHzkiOmKi7xVAWC4y2c1bIMKmPJSrA4aOEoRUPOKQ87Y/taC7yVHpFg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.8.0.tgz", + "integrity": "sha512-+HDIGOEMnqbxdAHegxvnOqESUH6RWFRR2b8qxP1W9CZnnYh4Usz6MBL+2KMAgPk/P0o9c1HqnYtwzVH6GTIqug==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/types": "5.8.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -2200,21 +2243,83 @@ } }, "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.0.1.tgz", + "integrity": "sha512-5ohWO/M4//8lErlUUtrFy3b11GtNOuMOU0ysKCDXFcfXuuvUXu95akgj/i8ofmaGdN0hCqyl6uu9i8dS/mQp5g==", + "dev": true, + "dependencies": { + "emoji-regex": "^9.2.2", + "is-fullwidth-code-point": "^4.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -2745,9 +2850,9 @@ } }, "node_modules/eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-TxU/p7LB1KxQ6+7aztTnO7K0i+h0tDi81YRY9VzB6Id71kNz+fFYnf5HD5UOQmxkzcoa0TlVZf9dpMtUv0GpWg==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", + "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.0.5", @@ -3509,9 +3614,9 @@ } }, "node_modules/ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "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" @@ -4655,24 +4760,23 @@ "dev": true }, "node_modules/lint-staged": { - "version": "12.1.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.1.2.tgz", - "integrity": "sha512-bSMcQVqMW98HLLLR2c2tZ+vnDCnx4fd+0QJBQgN/4XkdspGRPc8DGp7UuOEBe1ApCfJ+wXXumYnJmU+wDo7j9A==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.1.4.tgz", + "integrity": "sha512-RgDz9nsFsE0/5eL9Vat0AvCuk0+j5mEuzBIVfrRH5FRtt5wibYe8zTjZs2nuqLFrLAGQGYnj8+HJxolcj08i/A==", "dev": true, "dependencies": { "cli-truncate": "^3.1.0", "colorette": "^2.0.16", "commander": "^8.3.0", - "debug": "^4.3.2", - "enquirer": "^2.3.6", + "debug": "^4.3.3", "execa": "^5.1.1", "lilconfig": "2.0.4", - "listr2": "^3.13.3", + "listr2": "^3.13.5", "micromatch": "^4.0.4", "normalize-path": "^3.0.0", - "object-inspect": "^1.11.0", + "object-inspect": "^1.11.1", "string-argv": "^0.3.1", - "supports-color": "^9.0.2", + "supports-color": "^9.2.1", "yaml": "^1.10.2" }, "bin": { @@ -4685,112 +4789,6 @@ "url": "https://opencollective.com/lint-staged" } }, - "node_modules/lint-staged/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/ansi-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", - "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/lint-staged/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/string-width": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.0.1.tgz", - "integrity": "sha512-5ohWO/M4//8lErlUUtrFy3b11GtNOuMOU0ysKCDXFcfXuuvUXu95akgj/i8ofmaGdN0hCqyl6uu9i8dS/mQp5g==", - "dev": true, - "dependencies": { - "emoji-regex": "^9.2.2", - "is-fullwidth-code-point": "^4.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/lint-staged/node_modules/supports-color": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.1.tgz", @@ -4830,6 +4828,36 @@ } } }, + "node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5193,9 +5221,9 @@ "dev": true }, "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5504,6 +5532,16 @@ "node": ">=10.13.0" } }, + "node_modules/prettier-plugin-organize-imports": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-2.3.4.tgz", + "integrity": "sha512-R8o23sf5iVL/U71h9SFUdhdOEPsi3nm42FD/oDYIZ2PQa4TNWWuWecxln6jlIQzpZTDMUeO1NicJP6lLn2TtRw==", + "dev": true, + "peerDependencies": { + "prettier": ">=2.0", + "typescript": ">=2.9" + } + }, "node_modules/pretty-format": { "version": "27.4.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.2.tgz", @@ -6003,17 +6041,43 @@ } }, "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/source-map": { @@ -6391,9 +6455,9 @@ } }, "node_modules/ts-jest": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.1.tgz", - "integrity": "sha512-Ds0VkB+cB+8g2JUmP/GKWndeZcCKrbe6jzolGrVWdqVUFByY/2KDHqxJ7yBSon7hDB1TA4PXxjfZ+JjzJisvgA==", + "version": "27.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.2.tgz", + "integrity": "sha512-eSOiJOWq6Hhs6Khzk5wKC5sgWIXgXqOCiIl1+3lfnearu58Hj4QpE5tUhQcA3xtZrELbcvAGCsd6HB8OsaVaTA==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -7829,29 +7893,59 @@ } }, "@nordicsemiconductor/asset-tracker-cloud-code-style": { - "version": "9.2.33", - "resolved": "https://registry.npmjs.org/@nordicsemiconductor/asset-tracker-cloud-code-style/-/asset-tracker-cloud-code-style-9.2.33.tgz", - "integrity": "sha512-NjVQiOGyCTi0owOmNicsatMoqz0Dye9Efaokt0iogQ3SzUr2+YwHGwCqRNVHvEI4CbxkqzdlU/PdHhn6AlK67A==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/asset-tracker-cloud-code-style/-/asset-tracker-cloud-code-style-10.0.0.tgz", + "integrity": "sha512-t9/Ltx8D48+Dx5SbEKMWTX8fogEHutAq41otBTzXZFjAb0IANw35e68fi886a7i4lpTMkF7KjSXIJb73oUQNMA==", "dev": true, "requires": { "@commitlint/cli": "15.0.0", "@commitlint/config-angular": "15.0.0", - "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": "8.1.19", - "eslint": "8.4.1", + "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": "8.1.20", + "eslint": "8.5.0", "husky": "7.0.4", - "lint-staged": "12.1.2", + "lint-staged": "12.1.3", "pinst": "2.1.6", "prettier": "2.5.1", + "prettier-plugin-organize-imports": "2.3.4", "typescript": "4.5.4" + }, + "dependencies": { + "lint-staged": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.1.3.tgz", + "integrity": "sha512-ajapdkaFxx+MVhvq6xQRg9zCnCLz49iQLJZP7+w8XaA3U4B35Z9xJJGq9vxmWo73QTvJLG+N2NxhjWiSexbAWQ==", + "dev": true, + "requires": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.16", + "commander": "^8.3.0", + "debug": "^4.3.3", + "execa": "^5.1.1", + "lilconfig": "2.0.4", + "listr2": "^3.13.5", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "object-inspect": "^1.11.1", + "string-argv": "^0.3.1", + "supports-color": "^9.2.1", + "yaml": "^1.10.2" + } + }, + "supports-color": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.1.tgz", + "integrity": "sha512-Obv7ycoCTG51N7y175StI9BlAXrmgZrFhZOb0/PyjHBher/NmsdBgbbQ1Inhq+gIhz6+7Gb+jWF2Vqi7Mf1xnQ==", + "dev": true + } } }, "@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript": { - "version": "8.1.19", - "resolved": "https://registry.npmjs.org/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript/-/eslint-config-asset-tracker-cloud-typescript-8.1.19.tgz", - "integrity": "sha512-lL9bB/DxocHWqXtcqQi2GaEcUVdvhDJXA3CQUfjU69AorKwYkRRfkCLlWvbLb7429MuFa05FiMwkVGnnrLjU+Q==", + "version": "8.1.20", + "resolved": "https://registry.npmjs.org/@nordicsemiconductor/eslint-config-asset-tracker-cloud-typescript/-/eslint-config-asset-tracker-cloud-typescript-8.1.20.tgz", + "integrity": "sha512-bdi5w17wx5eAetgzfqEpuWnoOCry9a6psu5dQrFijUt599b/HN5chCHbsaODXUIdnoohMQk2izmO+ZfIWsl1EA==", "dev": true, "requires": { - "@typescript-eslint/eslint-plugin": "5.7.0", + "@typescript-eslint/eslint-plugin": "5.8.0", "eslint-config-prettier": "8.3.0" } }, @@ -7976,9 +8070,9 @@ "dev": true }, "@types/node": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", - "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.4.tgz", + "integrity": "sha512-6xwbrW4JJiJLgF+zNypN5wr2ykM9/jHcL7rQ8fZe2vuftggjzZeRSM4OwRc6Xk8qWjwJ99qVHo/JgOGmomWRog==", "dev": true }, "@types/normalize-package-data": { @@ -8021,13 +8115,13 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.7.0.tgz", - "integrity": "sha512-8RTGBpNn5a9M628wBPrCbJ+v3YTEOE2qeZb7TDkGKTDXSj36KGRg92SpFFaR/0S3rSXQxM0Og/kV9EyadsYSBg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.8.0.tgz", + "integrity": "sha512-spu1UW7QuBn0nJ6+psnfCc3iVoQAifjKORgBngKOmC8U/1tbe2YJMzYQqDGYB4JCss7L8+RM2kKLb1B1Aw9BNA==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.7.0", - "@typescript-eslint/scope-manager": "5.7.0", + "@typescript-eslint/experimental-utils": "5.8.0", + "@typescript-eslint/scope-manager": "5.8.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -8037,56 +8131,56 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.7.0.tgz", - "integrity": "sha512-u57eZ5FbEpzN5kSjmVrSesovWslH2ZyNPnaXQMXWgH57d5+EVHEt76W75vVuI9qKZ5BMDKNfRN+pxcPEjQjb2A==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.8.0.tgz", + "integrity": "sha512-KN5FvNH71bhZ8fKtL+lhW7bjm7cxs1nt+hrDZWIqb6ViCffQcWyLunGrgvISgkRojIDcXIsH+xlFfI4RCDA0xA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.7.0", - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/typescript-estree": "5.7.0", + "@typescript-eslint/scope-manager": "5.8.0", + "@typescript-eslint/types": "5.8.0", + "@typescript-eslint/typescript-estree": "5.8.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.7.0.tgz", - "integrity": "sha512-m/gWCCcS4jXw6vkrPQ1BjZ1vomP01PArgzvauBqzsoZ3urLbsRChexB8/YV8z9HwE3qlJM35FxfKZ1nfP/4x8g==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.8.0.tgz", + "integrity": "sha512-Gleacp/ZhRtJRYs5/T8KQR3pAQjQI89Dn/k+OzyCKOsLiZH2/Vh60cFBTnFsHNI6WAD+lNUo/xGZ4NeA5u0Ipw==", "dev": true, "peer": true, "requires": { - "@typescript-eslint/scope-manager": "5.7.0", - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/typescript-estree": "5.7.0", + "@typescript-eslint/scope-manager": "5.8.0", + "@typescript-eslint/types": "5.8.0", + "@typescript-eslint/typescript-estree": "5.8.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.7.0.tgz", - "integrity": "sha512-7mxR520DGq5F7sSSgM0HSSMJ+TFUymOeFRMfUfGFAVBv8BR+Jv1vHgAouYUvWRZeszVBJlLcc9fDdktxb5kmxA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.8.0.tgz", + "integrity": "sha512-x82CYJsLOjPCDuFFEbS6e7K1QEWj7u5Wk1alw8A+gnJiYwNnDJk0ib6PCegbaPMjrfBvFKa7SxE3EOnnIQz2Gg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/visitor-keys": "5.7.0" + "@typescript-eslint/types": "5.8.0", + "@typescript-eslint/visitor-keys": "5.8.0" } }, "@typescript-eslint/types": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.7.0.tgz", - "integrity": "sha512-5AeYIF5p2kAneIpnLFve8g50VyAjq7udM7ApZZ9JYjdPjkz0LvODfuSHIDUVnIuUoxafoWzpFyU7Sqbxgi79mA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.8.0.tgz", + "integrity": "sha512-LdCYOqeqZWqCMOmwFnum6YfW9F3nKuxJiR84CdIRN5nfHJ7gyvGpXWqL/AaW0k3Po0+wm93ARAsOdzlZDPCcXg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.7.0.tgz", - "integrity": "sha512-aO1Ql+izMrTnPj5aFFlEJkpD4jRqC4Gwhygu2oHK2wfVQpmOPbyDSveJ+r/NQo+PWV43M6uEAeLVbTi09dFLhg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.8.0.tgz", + "integrity": "sha512-srfeZ3URdEcUsSLbkOFqS7WoxOqn8JNil2NSLO9O+I2/Uyc85+UlfpEvQHIpj5dVts7KKOZnftoJD/Fdv0L7nQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/visitor-keys": "5.7.0", + "@typescript-eslint/types": "5.8.0", + "@typescript-eslint/visitor-keys": "5.8.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -8095,12 +8189,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.7.0.tgz", - "integrity": "sha512-hdohahZ4lTFcglZSJ3DGdzxQHBSxsLVqHzkiOmKi7xVAWC4y2c1bIMKmPJSrA4aOEoRUPOKQ87Y/taC7yVHpFg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.8.0.tgz", + "integrity": "sha512-+HDIGOEMnqbxdAHegxvnOqESUH6RWFRR2b8qxP1W9CZnnYh4Usz6MBL+2KMAgPk/P0o9c1HqnYtwzVH6GTIqug==", "dev": true, "requires": { - "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/types": "5.8.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -8501,13 +8595,53 @@ } }, "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + }, + "string-width": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.0.1.tgz", + "integrity": "sha512-5ohWO/M4//8lErlUUtrFy3b11GtNOuMOU0ysKCDXFcfXuuvUXu95akgj/i8ofmaGdN0hCqyl6uu9i8dS/mQp5g==", + "dev": true, + "requires": { + "emoji-regex": "^9.2.2", + "is-fullwidth-code-point": "^4.0.0", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } } }, "cliui": { @@ -8922,9 +9056,9 @@ } }, "eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-TxU/p7LB1KxQ6+7aztTnO7K0i+h0tDi81YRY9VzB6Id71kNz+fFYnf5HD5UOQmxkzcoa0TlVZf9dpMtUv0GpWg==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", + "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", "dev": true, "requires": { "@eslint/eslintrc": "^1.0.5", @@ -9482,9 +9616,9 @@ } }, "ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "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": { @@ -10369,91 +10503,26 @@ "dev": true }, "lint-staged": { - "version": "12.1.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.1.2.tgz", - "integrity": "sha512-bSMcQVqMW98HLLLR2c2tZ+vnDCnx4fd+0QJBQgN/4XkdspGRPc8DGp7UuOEBe1ApCfJ+wXXumYnJmU+wDo7j9A==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.1.4.tgz", + "integrity": "sha512-RgDz9nsFsE0/5eL9Vat0AvCuk0+j5mEuzBIVfrRH5FRtt5wibYe8zTjZs2nuqLFrLAGQGYnj8+HJxolcj08i/A==", "dev": true, "requires": { "cli-truncate": "^3.1.0", "colorette": "^2.0.16", "commander": "^8.3.0", - "debug": "^4.3.2", - "enquirer": "^2.3.6", + "debug": "^4.3.3", "execa": "^5.1.1", "lilconfig": "2.0.4", - "listr2": "^3.13.3", + "listr2": "^3.13.5", "micromatch": "^4.0.4", "normalize-path": "^3.0.0", - "object-inspect": "^1.11.0", + "object-inspect": "^1.11.1", "string-argv": "^0.3.1", - "supports-color": "^9.0.2", + "supports-color": "^9.2.1", "yaml": "^1.10.2" }, "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", - "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", - "dev": true - }, - "cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "requires": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - } - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true - }, - "slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - } - }, - "string-width": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.0.1.tgz", - "integrity": "sha512-5ohWO/M4//8lErlUUtrFy3b11GtNOuMOU0ysKCDXFcfXuuvUXu95akgj/i8ofmaGdN0hCqyl6uu9i8dS/mQp5g==", - "dev": true, - "requires": { - "emoji-regex": "^9.2.2", - "is-fullwidth-code-point": "^4.0.0", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, "supports-color": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.1.tgz", @@ -10476,6 +10545,29 @@ "rxjs": "^7.4.0", "through": "^2.3.8", "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } } }, "locate-path": { @@ -10760,9 +10852,9 @@ "dev": true }, "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "dev": true }, "once": { @@ -10977,6 +11069,13 @@ "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", "dev": true }, + "prettier-plugin-organize-imports": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-2.3.4.tgz", + "integrity": "sha512-R8o23sf5iVL/U71h9SFUdhdOEPsi3nm42FD/oDYIZ2PQa4TNWWuWecxln6jlIQzpZTDMUeO1NicJP6lLn2TtRw==", + "dev": true, + "requires": {} + }, "pretty-format": { "version": "27.4.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.2.tgz", @@ -11335,14 +11434,27 @@ "dev": true }, "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + } } }, "source-map": { @@ -11640,9 +11752,9 @@ "dev": true }, "ts-jest": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.1.tgz", - "integrity": "sha512-Ds0VkB+cB+8g2JUmP/GKWndeZcCKrbe6jzolGrVWdqVUFByY/2KDHqxJ7yBSon7hDB1TA4PXxjfZ+JjzJisvgA==", + "version": "27.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.2.tgz", + "integrity": "sha512-eSOiJOWq6Hhs6Khzk5wKC5sgWIXgXqOCiIl1+3lfnearu58Hj4QpE5tUhQcA3xtZrELbcvAGCsd6HB8OsaVaTA==", "dev": true, "requires": { "bs-logger": "0.x", diff --git a/package.json b/package.json index 7eb29a7..ccf1e90 100644 --- a/package.json +++ b/package.json @@ -25,15 +25,15 @@ "devDependencies": { "@commitlint/cli": "15.0.0", "@commitlint/config-angular": "15.0.0", - "@nordicsemiconductor/asset-tracker-cloud-code-style": "9.2.33", + "@nordicsemiconductor/asset-tracker-cloud-code-style": "10.0.0", "@types/jest": "27.0.3", - "@types/node": "17.0.0", - "eslint": "8.4.1", + "@types/node": "17.0.4", + "eslint": "8.5.0", "husky": "7.0.4", "jest": "27.4.5", - "lint-staged": "12.1.2", + "lint-staged": "12.1.4", "prettier": "2.5.1", - "ts-jest": "27.1.1", + "ts-jest": "27.1.2", "typescript": "4.5.4" }, "lint-staged": { From 986ae3abccf91caa3e389369db9323bbde5f593f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 Apr 2022 21:37:16 +0000 Subject: [PATCH 108/110] build(deps): bump minimist from 1.2.5 to 1.2.6 Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b0fef06..584e47f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5126,9 +5126,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/minimist-options": { @@ -10772,9 +10772,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minimist-options": { From 941f4eaebeab06a88f619d975e0e4eb5aa92354c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 7 Jan 2023 04:00:34 +0000 Subject: [PATCH 109/110] build(deps): bump json5 from 2.2.0 to 2.2.3 Bumps [json5](https://github.com/json5/json5) from 2.2.0 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.2.0...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 32 +++++++------------------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 584e47f..c256a50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4653,13 +4653,10 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -5125,12 +5122,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, "node_modules/minimist-options": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", @@ -10428,13 +10419,10 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true }, "jsonfile": { "version": "6.1.0", @@ -10771,12 +10759,6 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, "minimist-options": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", From 0df0699d8e6085187ad11cd5630cadd77ee8101f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 7 Jan 2023 04:03:15 +0000 Subject: [PATCH 110/110] build(deps): bump minimatch from 3.0.4 to 3.1.2 Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.0.4 to 3.1.2. - [Release notes](https://github.com/isaacs/minimatch/releases) - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2) --- updated-dependencies: - dependency-name: minimatch dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index c256a50..e841896 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5111,9 +5111,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "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" @@ -10751,9 +10751,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "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"