diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000..9c1cf61
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,110 @@
+{
+ "env": {
+ "es2017": true,
+ "node": true,
+ "jest": true
+ },
+ "parser": "@typescript-eslint/parser",
+ "parserOptions": {
+ "project": "tsconfig.json",
+ "sourceType": "module"
+ },
+ "plugins": [
+ "jest",
+ "@typescript-eslint",
+ "eslint-plugin-tsdoc",
+ "import",
+ "import-newlines"
+ ],
+ "extends": [
+ "eslint:recommended",
+ "plugin:@typescript-eslint/recommended",
+ "plugin:@typescript-eslint/recommended-requiring-type-checking",
+ "plugin:import/recommended",
+ "plugin:import/typescript",
+ "plugin:jest/all"
+ ],
+ "rules": {
+ "brace-style": ["error", "1tbs"],
+ "comma-dangle": ["error", "always-multiline"],
+ "quotes": ["error", "single", {"avoidEscape": true}],
+ "import-newlines/enforce": [
+ "error",
+ {
+ "items": 2,
+ "max-len": 100,
+ "semi": false
+ }
+ ],
+ "no-multiple-empty-lines": [
+ "error", {
+ "max": 2,
+ "maxEOF": 0,
+ "maxBOF": 0
+ }
+ ],
+ "indent": ["error", 2, {"SwitchCase": 1}],
+ "object-curly-spacing": ["error", "always"],
+ "object-curly-newline": [
+ "error", {
+ "ObjectExpression": {
+ "minProperties": 4, "multiline": true, "consistent": true
+ },
+ "ObjectPattern": {
+ "minProperties": 4, "multiline": true, "consistent": true
+ },
+ "ImportDeclaration": {
+ "minProperties": 4, "multiline": true, "consistent": true
+ },
+ "ExportDeclaration": {
+ "minProperties": 4, "multiline": true, "consistent": true
+ }
+ }
+ ],
+ "curly": [
+ "error",
+ "all"
+ ],
+ "@typescript-eslint/require-await": "off",
+ "@typescript-eslint/no-unsafe-return": "off",
+ "@typescript-eslint/no-unsafe-assignment": "off",
+ "@typescript-eslint/no-unsafe-member-access": "off",
+ "@typescript-eslint/member-delimiter-style": "error",
+ "tsdoc/syntax": "warn",
+ "import/order": [
+ "error",
+ {
+ "groups": [
+ "builtin",
+ "external",
+ "internal"
+ ],
+ "newlines-between": "always",
+ "alphabetize": {
+ "order": "asc",
+ "caseInsensitive": true
+ }
+ }
+ ],
+ "jest/no-hooks": "off",
+ "jest/prefer-expect-assertions": "off",
+ "semi": ["error", "always"],
+ "@typescript-eslint/ban-ts-comment": "off",
+ "jest/no-disabled-tests": "off",
+ "jest/no-conditional-in-test": "off"
+ },
+ "settings": {
+ "import/parsers": {
+ "@typescript-eslint/parser": [
+ ".ts",
+ ".tsx"
+ ]
+ },
+ "import/resolver": {
+ "typescript": {
+ "alwaysTryTypes": true,
+ "project": "tsconfig.json"
+ }
+ }
+ }
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..90d20a9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,47 @@
+# build
+/dist
+/node_modules
+
+.npmrc
+
+# Logs
+logs
+*.log
+npm-debug.log*
+pnpm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+
+# OS
+.DS_Store
+
+# Tests
+/coverage
+/.nyc_output
+
+# IDEs and editors
+/.idea
+/.idea/*
+.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+.env
+*.properties
+*.env.json
+
+# Yarn >=2
+.yarn
+.pnp.*
+.yarnrc.yml
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 0000000..3c03207
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+18
diff --git a/README.md b/README.md
index 57bc84c..d66a567 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,427 @@
# zano-utils-js
Set of helpers and tools for JS developers that working with Zano
+
+* [Zano Utils JS](#zano-utils-js)
+ * [Blockchain Description](#blockchain-description)
+ * [Functions](#functions)
+ * [deocdeTransaction](#decodetransaction)
+ * [generateAccount](#generateaccount)
+ * [validateAccount](#validateaccount)
+ * [generateAccountKey](#generateaccountkeys)
+ * [privateKeyToPublicKey](#privatekeytopublickey)
+ * [getAccountBySecretSpendKey](#getaccountbysecretspendkey)
+ * [getKeyPair](#getkeypair)
+ * [getIntegratedAddress](#getintegratedaddress)
+ * [createIntegratedAddress](#createintegratedaddress)
+ * [getMasterAddress](#getmasteraddress)
+ * [splitIntegratedAddress](#splitintegratedaddress)
+ * [getKeysFromAddress](#getkeysfromaddress)
+ * [generatePaymentId](#generatepaymentid)
+ * [mnemonicToSeed](#mnemonictoseed)
+ * [seedToMnemonic](#seedtomnemonic)
+
+
+
+## Blockchain Description
+
+- **Ticker**: Zano
+- **Network**: Zano
+
+---
+
+## Functions
+
+### `decodeTransaction`
+
+#### Node Method Used:
+- `get_tx_details`
+
+#### Example Request:
+
+```bash
+curl -X POST \
+-H "Content-Type: application/json" \
+--data '{ "jsonrpc": "2.0", "method": "get_tx_details", "params": {"tx_hash": "77b09d759fefd512642f9a5e4e31ed0fefbaf1a8e602a2be94fc511ff982f7cf" }, "id": 1 }' \
+"http://37.27.100.59:10500/json_rpc"
+```
+
+
+ Example response
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "result": {
+ "status": "OK",
+ "tx_info": {
+ "amount": 0,
+ "blob": "AwIlEBqFoRgAAAAAABp....",
+ "blob_size": 2017,
+ "extra": [{
+ "details_view": "",
+ "short_view": "(encrypted)",
+ "type": "payer"
+ },{
+ "details_view": "",
+ "short_view": "631a0aa63dd0caa6473f8a136a155f54a05d1f2f8b5b92c5145383be2a696834",
+ "type": "pub_key"
+ },{
+ "details_view": "0000",
+ "short_view": "0000",
+ "type": "FLAGS16"
+ },{
+ "details_view": "derivation_hash: 5fd099a9\nencrypted_key_derivation: 2fecfc1742ea69e8b25f76c5014bd2cb9ca249e2b717bbc6376e0196e450eccf",
+ "short_view": "derivation_hash: 5fd099a9",
+ "type": "crypto_checksum"
+ },{
+ "details_view": "ef40",
+ "short_view": "ef40",
+ "type": "derivation_hint"
+ },{
+ "details_view": "94c3",
+ "short_view": "94c3",
+ "type": "derivation_hint"
+ },{
+ "details_view": "fee = 0.01",
+ "short_view": "fee = 0.01",
+ "type": "zarcanum_tx_data_v1"
+ }],
+ "fee": 10000000000,
+ "id": "fd93234ee26299d9bcd0c7ffd66cfd31f66c16b7cd28776ddb3113f77477a669",
+ "ins": [{
+ "amount": 0,
+ "global_indexes": [1614213,1625091,1701687,1724120,1755061,1852550,1885364,1888520,1890757,1901665,1901797,1902935,1903361,1903474,1903878,1904042],
+ "htlc_origin": "",
+ "kimage_or_ms_id": "5eb5744c8fa2e2b44413323cc1b9bb6021c18218eb25f4c3a12c8ba5f8ca9e05",
+ "multisig_count": 0
+ },{
+ "amount": 0,
+ "global_indexes": [1415271,1478600,1553576,1658538,1872595,1899601,1901346,1901642,1902588,1903284,1903353,1903522,1903584,1903697,1903952,1903954],
+ "htlc_origin": "",
+ "kimage_or_ms_id": "e2a6d2a56c671fec431fa3025e8143ec2e9c14b1bdfc19936f6377c84abc0672",
+ "multisig_count": 0
+ }],
+ "keeper_block": 3199720,
+ "object_in_json": "ewogICJBR0dSRUdBVEVE....AgfQogICAgfQogIF0KfQ==",
+ "outs": [{
+ "amount": 0,
+ "global_index": 1904095,
+ "is_spent": false,
+ "minimum_sigs": 0,
+ "pub_keys": ["a08e213373e34988600db3168be88eff5a9e2da9972dcc12d6e51dc56a7b845b","23b5f778966dc4d8594549670a0335c8f639f18a39063606a9ebf1a826bb6a66","e22c32eb7fd87d8403d1516a5849966a1f8f4053eb56ae3a7048c3e5ffcaa0a2","a23fe6c894dc069ba92a252611027bcaae8c80d0848ce0e3357e05e61aa78914","5df242cb3fb59a87"]
+ },{
+ "amount": 0,
+ "global_index": 1904096,
+ "is_spent": false,
+ "minimum_sigs": 0,
+ "pub_keys": ["492d93dc0fb07d90e5d1ce9210b31fc1155206473d5d3f5136f7031ff6aad31e","6c24323a8e2690482cdd685956904168cb5fc8749f3be2df58f7d0aeb39f5252","bbaa2f259d5f6f5c1e0df43c9cbd7c061ac023f91ebb3fe22a5352115f642cec","d4ec19288fc18a81917c3328d45464bddfb04d5582690bc50062dac9dd963887","8dfdd23882a0a1ae"]
+ }],
+ "pub_key": "631a0aa63dd0caa6473f8a136a155f54a05d1f2f8b5b92c5145383be2a696834",
+ "timestamp": 1749725356
+ }
+ }
+}
+```
+
+
+
+---
+
+### `decodeTransaction`
+
+Decode a transaction object_in_json using the provided secret view key and either address or public spend key.
+
+#### Import and usage
+
+```ts
+import { decodeTransaction } from '@hyle-team/zano-utils-js';
+import type { DecodeTransactionResult } from '@hyle-team/zano-utils-js';
+
+decodeTransaction(objectInJson, secretViewKey, address);
+or
+decodeTransaction(objectInJson, secretViewKey,
+publicSpendKey);
+```
+#### Returned data decodeTransaction
+
+```ts
+type DecodeTransactionResult =
+ | { ok: true; amount: string; paymentId?: string }
+ | { ok: false; error: string }
+```
+---
+
+### `generateAccount`
+
+```typescript
+import { generateAccount } from '@hyle-team/zano-utils-js';
+import type { AccountResult } from '@hyle-team/zano-utils-js';
+
+const account: AccountResult = generateAccount();
+```
+
+#### Returned data generateAccount
+
+```ts
+type AccountResult = AccountKeys & {
+ address: string;
+}
+
+type AccountKeys = {
+ secretSpendKey: string;
+ secretViewKey: string;
+ publicSpendKey: string;
+ publicViewKey: string;
+}
+```
+---
+
+### `validateAccount`
+
+```ts
+import { validateAccount } from '@hyle-team/zano-utils-js';
+
+const validatedAccount: boolean = validateAccount(
+'ZxC15vh38qHAZbfsUXTpxoiyeLhavbBzsQQk81fEwP4jYxN4qR8SEhMfXkRBpQw6vbbSEGpK2VPVPADnL6h3ZViL29Remh4oH',
+'21dcd98fb9dc392aeabe1d5cfb90faf63840685762448bf49a48d58d0c70bf0b',
+'2ff9e77456d0e65b50d80392a098cddf9032744bd876371fffe95476a92d8564',
+'88609e3bc954fe8b5f1a5f0a7e7e44528835b62890de49000033b28898888d01',
+'b35fb46128f7150ecff93e0eeee80a95ad9b13e3bfced7d3ff7a121f6748df0e',
+);
+```
+
+#### validateAccount params
+
+```ts
+async function validateAccount(
+ address: string,
+ publicSpendKey: string,
+ publicViewKey: string,
+ secretSpendKey: string,
+ secretViewKey: string,
+): Promise
+```
+---
+
+### `generateAccountKeys`
+
+```ts
+import { generateAccountKeys } from '@hyle-team/zano-utils-js';
+import type { AccountKeys } from '@hyle-team/zano-utils-js';
+
+const accountKeys: AccountKeys = generateAccountKeys();
+```
+#### Returned data generateAccountKeys
+
+```ts
+type AccountKeys = {
+ secretSpendKey: string;
+ secretViewKey: string;
+ publicSpendKey: string;
+ publicViewKey: string;
+}
+```
+---
+
+### `privateKeyToPublicKey`
+
+```ts
+import { privateKeyToPublicKey } from '@hyle-team/zano-utils-js';
+
+const publicKey: string = privateKeyToPublicKey('88609e3bc954fe8b5f1a5f0a7e7e44528835b62890de49000033b28898888d01');
+```
+---
+
+### `getAccountBySecretSpendKey`
+
+```ts
+import { getAccountBySecretSpendKey } from '@hyle-team/zano-utils-js';
+import type { AccountKeys } from '@hyle-team/zano-utils-js';
+
+const accountKeys: AccountKeys = getAccountBySecretSpendKey('88609e3bc954fe8b5f1a5f0a7e7e44528835b62890de49000033b28898888d01');
+```
+
+#### Returned data getAccountBySecretSpendKey
+
+```ts
+type AccountKeys = {
+ secretSpendKey: string;
+ secretViewKey: string;
+ publicSpendKey: string;
+ publicViewKey: string;
+}
+```
+---
+
+### `getKeyPair`
+
+```ts
+import { getKeyPair } from '@hyle-team/zano-utils-js';
+import type { KeyPair } from '@hyle-team/zano-utils-js';
+
+const keypair: KeyPair = getKeyPair();
+```
+
+#### Returned data getKeyPair
+
+```ts
+type KeyPair = {
+ rawSecretKey: string;
+ secretKey: string;
+ publicKey: string;
+}
+```
+---
+
+### `getIntegratedAddress`
+
+The function accepts either the main master address or the integrated address as a parameter.
+
+```ts
+import { getIntegratedAddress } from '@hyle-team/zano-utils-js';
+
+const integratedAddress: string = getIntegratedAddress('ZxD5aoLDPTdcaRx4uCpyW4XiLfEXejepAVz8cSY2fwHNEiJNu6NmpBBDLGTJzCsUvn3acCVDVDPMV8yQXdPooAp338Se7AxeH');
+```
+---
+
+### `createIntegratedAddress`
+
+```ts
+import { createIntegratedAddress } from '@hyle-team/zano-utils-js';
+
+const integratedAddress: string = createIntegratedAddress('ZxD5aoLDPTdcaRx4uCpyW4XiLfEXejepAVz8cSY2fwHNEiJNu6NmpBBDLGTJzCsUvn3acCVDVDPMV8yQXdPooAp338Se7AxeH', '49c925855b863a25');
+```
+---
+
+
+### `getMasterAddress`
+
+params:
+1. spendPublicKey: string,
+2. viewPublicKey: string
+
+```ts
+import { getMasterAddress } from '@hyle-team/zano-utils-js';
+
+const integratedAddress: string = getMasterAddress('9f5e1fa93630d4b281b18bb67a3db79e9622fc703cc3ad4a453a82e0a36d51fa', 'a3f208c8f9ba49bab28eed62b35b0f6be0a297bcd85c2faa1eb1820527bcf7e3');
+```
+---
+
+### `splitIntegratedAddress`
+Descr: Extract paymentId and master address from integrated address
+
+params:
+1. integratedAddress: string,
+
+```ts
+import { splitIntegratedAddress } from '@hyle-team/zano-utils-js';
+import type { SplitedIntegratedAddress } from '@hyle-team/zano-utils-js';
+
+const integratedAddress: SplitedIntegratedAddress = splitIntegratedAddress('iZ2kFmwxRHoaRxm1ni8HnfUTkYuKbni8s4CE2Z4GgFfH99BJ6cnbAtJTgUnZjPj9CTCTKy1qqM9wPCTp92uBC7e47JPoHxGL5UU2D1tpQMg4');
+```
+
+#### Returned data splitIntegratedAddress
+
+```ts
+type SplitedIntegratedAddress = {
+ masterAddress: string;
+ paymentId: string;
+}
+```
+---
+
+### `getKeysFromAddress`
+Descr: Extract public keys from master or integratedAddress
+
+params:
+1. address: string,
+
+```ts
+import { getKeysFromAddress } from '@hyle-team/zano-utils-js';
+import type { ZarcanumAddressKeys } from '@hyle-team/zano-utils-js';
+
+const integratedAddress: ZarcanumAddressKeys = getKeysFromAddress('iZ2kFmwxRHoaRxm1ni8HnfUTkYuKbni8s4CE2Z4GgFfH99BJ6cnbAtJTgUnZjPj9CTCTKy1qqM9wPCTp92uBC7e47JPoHxGL5UU2D1tpQMg4');
+```
+
+#### Returned data getKeysFromAddress
+
+```ts
+type ZarcanumAddressKeys = {
+ spendPublicKey: string;
+ viewPublicKey: string;
+};
+```
+---
+
+### `generatePaymentId`
+Descr: generate payment id for creating integrated address
+
+```ts
+import { generatePaymentId } from '@hyle-team/zano-utils-js';
+
+const paymentId: string = generatePaymentId();
+```
+---
+
+### `mnemonicToSeed`
+
+## Limitations
+
+- **No support for password-protected seed phrases**: Currently, the library does not handle mnemonic phrases that are encrypted with a password.
+- **No audit flag support**: The library does not yet support the audit flag feature.
+
+ @param seedPhraseRaw - Raw seed phrase string (mnemonic) containing 25 or 26 words.
+
+ @returns The secret spend key as a hex string, or `false` if parsing failed.
+
+```ts
+import { mnemonicToSeed } from '@hyle-team/zano-utils-js';
+import type { MnemonicToSeedResult } from '@hyle-team/zano-utils-js';
+
+const secretSpendKey: MnemonicToSeedResult = mnemonicToSeed('bridge passion scale vast speak mud murder own birthday flight always hair especially tickle crowd shatter tickle deserve hopefully bomb join plan darling aunt beneath give');
+```
+
+#### Returned data mnemonicToSeed
+
+```ts
+type MnemonicToSeedResult = string | false;
+```
+---
+
+### `seedToMnemonic`
+
+## Warning:
+**Dont use secret spend for creating mnemonic**
+
+**You need provide raw seed key, its key using for creating secret spend key and mnemonic**
+
+## Limitations
+
+- **No support for password-protected seed phrases**: Currently, the library does not handle mnemonic phrases that are encrypted with a password.
+- **No audit flag support**: The library does not yet support the audit flag feature.
+
+```ts
+import { seedToMnemonic } from '@hyle-team/zano-utils-js';
+import type { SeedToMnemonicResult } from '@hyle-team/zano-utils-js';
+
+const randomBytes: string = getRandomBytes(64).toString('hex');
+
+const seedPhrase: SeedToMnemonicResult = mnemonicToSeed(randomBytes);
+```
+
+#### Returned data seedToMnemonic
+```ts
+type SeedToMnemonicResult = string;
+```
+
+
+
+
+# Supporting project/donations
+---
+ZANO @dev
+BTC bc1qpa8w8eaehlplfepmnzpd7v9j046899nktxnkxp
+BCH qqgq078vww5exd9kt3frx6krdyznmp80hcygzlgqzd
+ETH 0x206c52b78141498e74FF074301ea90888C40c178
+XMR 45gp9WTobeB5Km3kLQgVmPJkvm9rSmg4gdyHheXqXijXYMjUY48kLgL7QEz5Ar8z9vQioQ68WYDKsQsjAEonSeFX4UeLSiX
\ No newline at end of file
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..6e154ef
--- /dev/null
+++ b/package.json
@@ -0,0 +1,76 @@
+{
+ "name": "@hyle-team/zano-utils-js",
+ "version": "0.0.1",
+ "repository": "https://github.com/hyle-team/zano-utils-js",
+ "author": "Zano Team",
+ "license": "MIT",
+ "publishConfig": {
+ "access": "public"
+ },
+ "main": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "files": [
+ "/dist"
+ ],
+ "scripts": {
+ "prebuild": "rimraf dist",
+ "test": "jest",
+ "test:watch": "jest --watch",
+ "test:cov": "jest --coverage",
+ "test:debug": "node --inspect-brk -r ts-node/register node_modules/.bin/jest --runInBand",
+ "build": "tsc -p ./tsconfig.build.json",
+ "preversion": "yarn test",
+ "version": "yarn build && git add -A dist",
+ "postversion": "git push && git push --tags",
+ "lint": "eslint \"{src,apps,libs,test,lib}/**/*.ts\" --fix"
+ },
+ "dependencies": {
+ "bn.js": "^5.2.1",
+ "elliptic": "^6.5.4",
+ "js-sha3": "^0.9.3",
+ "keccak": "^3.0.3",
+ "axios": "^0.21.1",
+ "big.js": "^6.1.1",
+ "rimraf": "^3.0.2"
+ },
+ "devDependencies": {
+ "@types/big.js": "^6",
+ "@types/elliptic": "^6.4.18",
+ "@types/keccak": "^3.0.5",
+ "@types/node": "^18",
+ "@types/jest": "^26.0.24",
+ "@typescript-eslint/eslint-plugin": "^4.28.2",
+ "@typescript-eslint/parser": "^4.28.2",
+ "eslint": "^7.32.0",
+ "eslint-import-resolver-node": "^0.3.4",
+ "eslint-import-resolver-typescript": "^2.4.0",
+ "eslint-plugin-import": "^2.23.4",
+ "eslint-plugin-import-newlines": "^1.1.7",
+ "eslint-plugin-jest": "^24.3.6",
+ "eslint-plugin-tsdoc": "^0.2.14",
+ "jest": "^26.6.3",
+ "ts-jest": "^26.5.6",
+ "ts-node": "^10.1.0",
+ "typescript": "^4.3.5"
+ },
+ "jest": {
+ "moduleFileExtensions": [
+ "js",
+ "json",
+ "ts"
+ ],
+ "rootDir": ".",
+ "testRegex": ".*\\.spec\\.ts$",
+ "transform": {
+ "^.+\\.(t|j)s$": "ts-jest"
+ },
+ "collectCoverageFrom": [
+ "**/*.(t|j)s",
+ "!dist/**",
+ "!coverage/**"
+ ],
+ "coverageDirectory": "./coverage",
+ "testEnvironment": "node"
+ },
+ "packageManager": "yarn@1.22.22"
+}
diff --git a/src/account/account-utils.ts b/src/account/account-utils.ts
new file mode 100644
index 0000000..2d9caa0
--- /dev/null
+++ b/src/account/account-utils.ts
@@ -0,0 +1,170 @@
+import { BRAINWALLET_DEFAULT_SEED_SIZE } from './constants';
+import type {
+ AccountKeys,
+ AccountResult,
+ KeyPair,
+ SpendKeypair,
+} from './types';
+import { getKeysFromAddress, getMasterAddress } from '../address/address-utils';
+import { ADDRESS_REGEX } from '../address/constants';
+import type { ZarcanumAddressKeys } from '../address/types';
+import {
+ dependentKey,
+ generateSeedKeys,
+ generateSeedKeysWeb,
+ secretKeyToPublicKey,
+} from '../core/crypto';
+
+function generateAccount(): AccountResult {
+ const keys: AccountKeys = generateAccountKeys();
+
+ if (!keys || !keys.secretSpendKey || !keys.publicSpendKey || !keys.secretViewKey || !keys.publicViewKey) {
+ throw new Error('Invalid generated keys');
+ }
+
+ const address: string = getMasterAddress(keys.publicSpendKey, keys.publicViewKey);
+
+ try {
+ validateAccount(address, keys.publicSpendKey, keys.publicViewKey, keys.secretSpendKey, keys.secretViewKey);
+ } catch (error) {
+ console.error('Error validating address:', error);
+ throw error.message;
+ }
+
+ return {
+ address,
+ ...keys,
+ };
+}
+
+function validateAccount(
+ address: string,
+ publicSpendKey: string,
+ publicViewKey: string,
+ secretSpendKey: string,
+ secretViewKey: string,
+): boolean {
+
+ if (!ADDRESS_REGEX.test(address)) {
+ throw new Error('invalid address format');
+ }
+
+ const { spendPublicKey }: ZarcanumAddressKeys = getKeysFromAddress(address);
+
+ if (spendPublicKey !== publicSpendKey) {
+ throw new Error('invalid address keys');
+ }
+
+ const secretSpendKeyBuf: Buffer = Buffer.from(secretSpendKey, 'hex');
+ const secViewKey: string = dependentKey(secretSpendKeyBuf);
+
+ if (secViewKey !== secretViewKey) {
+ throw new Error('invalid depend secret view key');
+ }
+
+ const secretViewKeyBuf: Buffer = Buffer.from(secretViewKey, 'hex');
+ const pubViewKey: string = secretKeyToPublicKey(secretViewKeyBuf);
+
+ if (pubViewKey !== publicViewKey) {
+ throw new Error('pub view key from secret key no equal provided pub view key');
+ }
+
+ const pubSpendKey: string = secretKeyToPublicKey(secretSpendKeyBuf);
+
+ if (pubSpendKey !== pubSpendKey) {
+ throw new Error('pub spend key from secret key no equal provided pub spend key');
+ }
+
+ return true;
+}
+
+function generateAccountKeys(): AccountKeys {
+ const {
+ secretSpendKey,
+ publicSpendKey,
+ }: SpendKeypair = generateSeedKeys(BRAINWALLET_DEFAULT_SEED_SIZE);
+
+ if (!secretSpendKey || !publicSpendKey) {
+ throw new Error('Error generate seed keys');
+ }
+
+ const secretSpendKeyBuf: Buffer = Buffer.from(secretSpendKey, 'hex');
+ const secretViewKey: string = dependentKey(secretSpendKeyBuf);
+
+ if (!secretViewKey) {
+ throw new Error('Error generate seed keys');
+ }
+
+ const secretViewKeyBuf: Buffer = Buffer.from(secretViewKey, 'hex');
+ const publicViewKey: string = secretKeyToPublicKey(secretViewKeyBuf);
+
+ return {
+ secretSpendKey,
+ publicSpendKey,
+ secretViewKey,
+ publicViewKey,
+ };
+}
+
+function getAccountBySecretSpendKey(secretSpendKey: string): AccountKeys {
+ if (secretSpendKey.length !== 64 || !/^([0-9a-fA-F]{2})+$/.test(secretSpendKey)) {
+ throw new Error('Invalid secret spend key');
+ }
+
+ const secretSpendKeyBuf: Buffer = Buffer.from(secretSpendKey, 'hex');
+
+ const secretViewKey: string = dependentKey(secretSpendKeyBuf);
+ const publicSpendKey: string = secretKeyToPublicKey(secretSpendKeyBuf);
+
+ if (!secretViewKey || !publicSpendKey) {
+ throw new Error('Error generate seed keys');
+ }
+
+ const secretViewKeyBuf: Buffer = Buffer.from(secretViewKey, 'hex');
+ const publicViewKey: string = secretKeyToPublicKey(secretViewKeyBuf);
+
+ return {
+ secretSpendKey,
+ publicSpendKey,
+ secretViewKey,
+ publicViewKey,
+ };
+}
+
+function privateKeyToPublicKey(secretKey: string): string {
+ if (secretKey.length !== 64 || !/^([0-9a-fA-F]{2})+$/.test(secretKey)) {
+ throw new Error('Invalid secret spend key');
+ }
+
+ const secretKeyBuf: Buffer = Buffer.from(secretKey, 'hex');
+ const publicKey: string = secretKeyToPublicKey(secretKeyBuf);
+
+ if (!publicKey) {
+ throw new Error('Error generate seed keys');
+ }
+
+ return publicKey;
+}
+
+function getKeyPair(): KeyPair {
+ const {
+ seedKey,
+ secretSpendKey,
+ publicSpendKey,
+ } = generateSeedKeysWeb(BRAINWALLET_DEFAULT_SEED_SIZE);
+
+ return {
+ rawSecretKey: seedKey,
+ secretKey: secretSpendKey,
+ publicKey: publicSpendKey,
+ };
+}
+
+export {
+ privateKeyToPublicKey,
+ generateAccount,
+ validateAccount,
+ generateAccountKeys,
+ getAccountBySecretSpendKey,
+ getKeyPair,
+};
diff --git a/src/account/constants.ts b/src/account/constants.ts
new file mode 100644
index 0000000..38d1b36
--- /dev/null
+++ b/src/account/constants.ts
@@ -0,0 +1 @@
+export const BRAINWALLET_DEFAULT_SEED_SIZE = 32;
diff --git a/src/account/types.ts b/src/account/types.ts
new file mode 100644
index 0000000..7d7391f
--- /dev/null
+++ b/src/account/types.ts
@@ -0,0 +1,22 @@
+export type AccountKeys = {
+ secretSpendKey: string;
+ secretViewKey: string;
+ publicSpendKey: string;
+ publicViewKey: string;
+}
+
+export type AccountResult = AccountKeys & {
+ address: string;
+}
+
+export type SpendKeypair = {
+ seedKey?: string;
+ secretSpendKey: string;
+ publicSpendKey: string;
+}
+
+export type KeyPair = {
+ rawSecretKey: string;
+ secretKey: string;
+ publicKey: string;
+}
diff --git a/src/address/address-utils.ts b/src/address/address-utils.ts
new file mode 100644
index 0000000..22ed037
--- /dev/null
+++ b/src/address/address-utils.ts
@@ -0,0 +1,257 @@
+import { ZarcanumAddressKeys } from 'src/decode/types';
+
+import {
+ PAYMENT_ID_REGEX,
+ ADDRESS_TAG_PREFIX,
+ ADDRESS_FLAG_PREFIX,
+ BUFFER_INTEGRATED_ADDRESS_LENGTH,
+ INTEGRATED_ADDRESS_REGEX,
+ PAYMENT_ID_LENGTH,
+ INTEGRATED_ADDRESS_FLAG_PREFIX,
+ INTEGRATED_ADDRESS_TAG_PREFIX,
+ BUFFER_ADDRESS_LENGTH,
+ CHECKSUM_LENGTH,
+ FLAG_LENGTH,
+ SPEND_KEY_LENGTH,
+ TAG_LENGTH,
+ VIEW_KEY_LENGTH,
+ ADDRESS_REGEX,
+ ACCOUNT_KEY_REGEX,
+} from './constants';
+import { DecodedAddress, SplitedIntegratedAddress } from './types';
+import { base58Encode, base58Decode } from '../core/base58';
+import { getRandomBytes , getChecksum } from '../core/crypto';
+
+
+function getIntegratedAddress(address: string): string {
+ return createIntegratedAddress(address, generatePaymentId());
+}
+
+function createIntegratedAddress(address: string, paymentId: string): string {
+ if (!validateAddress(address)) {
+ throw new Error('Invalid address format');
+ }
+
+ if (!validatePaymentId(paymentId)) {
+ throw new Error('Invalid payment ID format');
+ }
+
+ try {
+ const paymentIdBuffer: Buffer = Buffer.from(paymentId, 'hex');
+ const addressDecoded: DecodedAddress = decodeAddress(address);
+ if (!addressDecoded) {
+ return null;
+ }
+
+ return formatIntegratedAddress(addressDecoded, paymentIdBuffer);
+ } catch (error) {
+ throw new Error(`Error creating integrated address: ${error.message}`);
+ }
+}
+
+
+function formatIntegratedAddress(addressDecoded: DecodedAddress, paymentIdBuffer: Buffer): string {
+ const {
+ tag,
+ flag,
+ viewPublicKey,
+ spendPublicKey,
+ }: DecodedAddress = addressDecoded;
+
+ const integratedAddressBuffer: Buffer = Buffer.concat([
+ Buffer.from([tag, flag]),
+ viewPublicKey,
+ spendPublicKey,
+ paymentIdBuffer,
+ ]);
+
+ const checksum: string = calculateChecksum(integratedAddressBuffer);
+ return base58Encode(Buffer.concat([integratedAddressBuffer, Buffer.from(checksum, 'hex')]));
+}
+
+function decodeAddress(address: string): DecodedAddress {
+ try {
+ const decodedAddress: Buffer = base58Decode(address);
+ if (!decodedAddress) {
+ throw new Error('Invalid decode address');
+ }
+
+ let offset = TAG_LENGTH + FLAG_LENGTH;
+ const viewPublicKey: Buffer = decodedAddress.subarray(offset, offset + VIEW_KEY_LENGTH);
+ offset += VIEW_KEY_LENGTH;
+ const spendPublicKey: Buffer = decodedAddress.subarray(offset, offset + SPEND_KEY_LENGTH);
+
+ return {
+ tag: INTEGRATED_ADDRESS_TAG_PREFIX,
+ flag: INTEGRATED_ADDRESS_FLAG_PREFIX,
+ viewPublicKey,
+ spendPublicKey,
+ };
+ } catch (error) {
+ throw new Error(`Error decode address: ${error.message}`);
+ }
+}
+
+function encodeAddress(tag: number, flag: number, spendPublicKey: string, viewPublicKey: string): string {
+ try {
+ if (tag < 0) {
+ throw new Error('Invalid tag');
+ }
+ if (flag < 0) {
+ throw new Error('Invalid flag');
+ }
+ let buf: Buffer = Buffer.from([tag, flag]);
+
+ if (spendPublicKey.length !== 64 && !ACCOUNT_KEY_REGEX.test(spendPublicKey)) {
+ throw new Error('Invalid spendPublicKey: must be a hexadecimal string with a length of 64');
+ }
+ const spendKey: Buffer = Buffer.from(spendPublicKey, 'hex');
+
+ if (viewPublicKey.length !== 64 && !ACCOUNT_KEY_REGEX.test(viewPublicKey)) {
+ throw new Error('Invalid viewPrivateKey: must be a hexadecimal string with a length of 64');
+ }
+ const viewKey: Buffer = Buffer.from(viewPublicKey, 'hex');
+
+ buf = Buffer.concat([buf, spendKey, viewKey]);
+ const hash: string = getChecksum(buf);
+
+ return base58Encode(Buffer.concat([buf, Buffer.from(hash, 'hex')]));
+ } catch (error) {
+ throw new Error(error.message);
+ }
+}
+
+function getMasterAddress(spendPublicKey: string, viewPublicKey: string): string {
+ try {
+ const tag: number = ADDRESS_TAG_PREFIX;
+ const flag: number = ADDRESS_FLAG_PREFIX;
+
+ if (spendPublicKey.length !== 64 && !ACCOUNT_KEY_REGEX.test(spendPublicKey)) {
+ throw new Error('Invalid spendPublicKey: must be a hexadecimal string with a length of 64');
+ }
+
+ if (viewPublicKey.length !== 64 && !ACCOUNT_KEY_REGEX.test(viewPublicKey)) {
+ throw new Error('Invalid viewPrivateKey: must be a hexadecimal string with a length of 64');
+ }
+
+ const viewPublicKeyBuf: Buffer = Buffer.from(viewPublicKey, 'hex');
+ const spendPublicKeyBuf: Buffer = Buffer.from(spendPublicKey, 'hex');
+
+ let buf: Buffer = Buffer.from([tag, flag]);
+
+ buf = Buffer.concat([buf, spendPublicKeyBuf, viewPublicKeyBuf]);
+ const hash: string = getChecksum(buf);
+
+ return base58Encode(Buffer.concat([buf, Buffer.from(hash, 'hex')]));
+ } catch (error) {
+ throw new Error(error.message);
+ }
+}
+
+function splitIntegratedAddress(integratedAddress: string): SplitedIntegratedAddress {
+ try {
+ if (!INTEGRATED_ADDRESS_REGEX.test(integratedAddress)) {
+ throw new Error('Invalid integratedAddress: must be a hexadecimal string with a length of 106 whit correct regex');
+ }
+
+ const {
+ spendPublicKey,
+ viewPublicKey,
+ }: ZarcanumAddressKeys = getKeysFromAddress(integratedAddress);
+
+ if (!spendPublicKey || !viewPublicKey) {
+ throw new Error('spendPublicKey or viewPublicKey are missing');
+ }
+
+ const paymentId: string = base58Decode(integratedAddress).subarray(66, 66 + PAYMENT_ID_LENGTH).toString('hex');
+ const masterAddress: string = getMasterAddress(spendPublicKey, viewPublicKey);
+
+ return {
+ masterAddress,
+ paymentId,
+ };
+
+ } catch (error) {
+ throw new Error(`Error decode integrated address: ${error.message}`);
+ }
+}
+
+
+/*
+ * Retrieves public spend and view keys from the Zano address.
+ *
+ * This function decodes a Zano address and Integrated address from its Base58 representation and extracts
+ * the spend and view keys contained within it. If the address is not in a valid
+ * Base58 format, or if the resulting buffer does not conform to expected length specifics,
+ * an error is thrown.
+ *
+ * @param {string} address - A Zano address and Integrated address in Base58 format.
+ * @returns { ZarcanumAddressKeys } An object containing the spend and view keys.
+ * @throws { Error } Throws an error if the address format or buffer length is invalid.
+*/
+function getKeysFromAddress(address: string): ZarcanumAddressKeys {
+ if (!ADDRESS_REGEX.test(address) && !INTEGRATED_ADDRESS_REGEX.test(address)) {
+ throw new Error('Invalid address format');
+ }
+
+ const buf: Buffer = base58Decode(address);
+
+ if (buf.length !== BUFFER_ADDRESS_LENGTH && buf.length !== BUFFER_INTEGRATED_ADDRESS_LENGTH) {
+ throw new Error('Invalid buffer address length');
+ }
+
+ const addressWithoutChecksum: Buffer = Buffer.from(buf.buffer, 0, buf.length - CHECKSUM_LENGTH);
+ const checksum: string = Buffer.from(buf.buffer, buf.length - CHECKSUM_LENGTH).toString('hex');
+
+ if (checksum !== getChecksum(addressWithoutChecksum)) {
+ throw new Error('Invalid address checksum');
+ }
+
+ const spendPublicKey: string = Buffer.from(
+ buf.buffer,
+ TAG_LENGTH + FLAG_LENGTH,
+ SPEND_KEY_LENGTH,
+ ).toString('hex');
+
+ const viewPublicKey: string = Buffer.from(
+ buf.buffer,
+ TAG_LENGTH + FLAG_LENGTH + SPEND_KEY_LENGTH,
+ VIEW_KEY_LENGTH,
+ ).toString('hex');
+
+ if (!spendPublicKey || spendPublicKey.length !== SPEND_KEY_LENGTH * 2 ||
+ !viewPublicKey || viewPublicKey.length !== VIEW_KEY_LENGTH * 2) {
+ throw new Error('Invalid key format in the address.');
+ }
+
+ return {
+ spendPublicKey,
+ viewPublicKey,
+ };
+}
+
+function generatePaymentId(): string {
+ return getRandomBytes(PAYMENT_ID_LENGTH).toString('hex');
+}
+
+function validatePaymentId(paymentId: string): boolean {
+ return PAYMENT_ID_REGEX.test(paymentId);
+}
+
+function validateAddress(address: string): boolean {
+ return INTEGRATED_ADDRESS_REGEX.test(address) || ADDRESS_REGEX.test(address);
+}
+
+function calculateChecksum(buffer: Buffer): string {
+ return getChecksum(buffer);
+}
+
+export {
+ getIntegratedAddress,
+ createIntegratedAddress,
+ encodeAddress,
+ getMasterAddress,
+ splitIntegratedAddress,
+ getKeysFromAddress,
+ generatePaymentId,
+};
diff --git a/src/address/constants.ts b/src/address/constants.ts
new file mode 100644
index 0000000..a8969ca
--- /dev/null
+++ b/src/address/constants.ts
@@ -0,0 +1,23 @@
+export const TAG_LENGTH = 1;
+export const FLAG_LENGTH = 1;
+export const SPEND_KEY_LENGTH = 32;
+export const VIEW_KEY_LENGTH = 32;
+export const CHECKSUM_LENGTH = 4;
+export const BUFFER_ADDRESS_LENGTH: number =
+ TAG_LENGTH +
+ FLAG_LENGTH +
+ SPEND_KEY_LENGTH +
+ VIEW_KEY_LENGTH +
+ CHECKSUM_LENGTH;
+export const ADDRESS_REGEX = /^Z[a-zA-Z0-9]{96}$/;
+export const INTEGRATED_ADDRESS_REGEX = /^iZ[a-zA-Z0-9]{106}$/;
+export const PAYMENT_ID_LENGTH = 8;
+export const INTEGRATED_ADDRESS_FLAG_PREFIX = 0x6c;
+export const INTEGRATED_ADDRESS_TAG_PREFIX = 0xf8;
+export const ADDRESS_FLAG_PREFIX = 0x01;
+export const ADDRESS_TAG_PREFIX = 0xC5;
+export const BUFFER_INTEGRATED_ADDRESS_LENGTH =
+ BUFFER_ADDRESS_LENGTH +
+ PAYMENT_ID_LENGTH;
+export const PAYMENT_ID_REGEX = /^[a-fA-F0-9]{16}$/;
+export const ACCOUNT_KEY_REGEX = /^([0-9a-fA-F]{2})+$/;
\ No newline at end of file
diff --git a/src/address/types.ts b/src/address/types.ts
new file mode 100644
index 0000000..b033dff
--- /dev/null
+++ b/src/address/types.ts
@@ -0,0 +1,16 @@
+export type ZarcanumAddressKeys = {
+ spendPublicKey: string;
+ viewPublicKey: string;
+}
+
+export type DecodedAddress = {
+ tag: number;
+ flag: number;
+ viewPublicKey: Buffer;
+ spendPublicKey: Buffer;
+}
+
+export type SplitedIntegratedAddress = {
+ masterAddress: string;
+ paymentId: string;
+}
\ No newline at end of file
diff --git a/src/core/arx.ts b/src/core/arx.ts
new file mode 100644
index 0000000..66ea676
--- /dev/null
+++ b/src/core/arx.ts
@@ -0,0 +1,254 @@
+export type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |
+ Uint16Array | Int16Array | Uint32Array | Int32Array;
+
+export const u32 = (arr: TypedArray) =>
+ new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));
+
+
+export function clean(...arrays: TypedArray[]) {
+ for (let i = 0; i < arrays.length; i++) {
+ arrays[i].fill(0);
+ }
+}
+
+export function copyBytes(bytes: Uint8Array) {
+ return Uint8Array.from(bytes);
+}
+
+const _utf8ToBytes = (str: string) => Uint8Array.from(str.split('').map((c) => c.charCodeAt(0)));
+const sigma16 = _utf8ToBytes('expand 16-byte k');
+const sigma32 = _utf8ToBytes('expand 32-byte k');
+const sigma16_32 = u32(sigma16);
+const sigma32_32 = u32(sigma32);
+
+export function rotl(a: number, b: number): number {
+ return (a << b) | (a >>> (32 - b));
+}
+
+export type CipherCoreFn = (
+ sigma: Uint32Array,
+ key: Uint32Array,
+ nonce: Uint32Array,
+ output: Uint32Array,
+ counter: number,
+ rounds?: number
+) => void;
+
+export type ExtendNonceFn = (
+ sigma: Uint32Array,
+ key: Uint32Array,
+ input: Uint32Array,
+ output: Uint32Array
+) => void;
+
+export type CipherOpts = {
+ allowShortKeys?: boolean; // Original salsa / chacha allow 16-byte keys
+ extendNonceFn?: ExtendNonceFn;
+ counterLength?: number;
+ counterRight?: boolean; // right: nonce|counter; left: counter|nonce
+ rounds?: number;
+};
+
+// Is byte array aligned to 4 byte offset (u32)?
+function isAligned32(b: Uint8Array) {
+ return b.byteOffset % 4 === 0;
+}
+
+// Salsa and Chacha block length is always 512-bit
+const BLOCK_LEN = 64;
+const BLOCK_LEN32 = 16;
+
+// new Uint32Array([2**32]) // => Uint32Array(1) [ 0 ]
+// new Uint32Array([2**32-1]) // => Uint32Array(1) [ 4294967295 ]
+const MAX_COUNTER = 2 ** 32 - 1;
+
+const U32_EMPTY = new Uint32Array();
+function runCipher(
+ core: CipherCoreFn,
+ sigma: Uint32Array,
+ key: Uint32Array,
+ nonce: Uint32Array,
+ data: Uint8Array,
+ output: Uint8Array,
+ counter: number,
+ rounds: number,
+): void {
+ const len = data.length;
+ const block = new Uint8Array(BLOCK_LEN);
+ const b32 = u32(block);
+ // Make sure that buffers aligned to 4 bytes
+ const isAligned = isAligned32(data) && isAligned32(output);
+ const d32 = isAligned ? u32(data) : U32_EMPTY;
+ const o32 = isAligned ? u32(output) : U32_EMPTY;
+ for (let pos = 0; pos < len; counter++) {
+ core(sigma, key, nonce, b32, counter, rounds);
+ if (counter >= MAX_COUNTER) {
+ throw new Error('arx: counter overflow');
+ }
+ const take = Math.min(BLOCK_LEN, len - pos);
+ // aligned to 4 bytes
+ if (isAligned && take === BLOCK_LEN) {
+ const pos32 = pos / 4;
+ if (pos % 4 !== 0) {
+ throw new Error('arx: invalid block position');
+ }
+ for (let j = 0, posj: number; j < BLOCK_LEN32; j++) {
+ posj = pos32 + j;
+ o32[posj] = d32[posj] ^ b32[j];
+ }
+ pos += BLOCK_LEN;
+ continue;
+ }
+ for (let j = 0, posj; j < take; j++) {
+ posj = pos + j;
+ output[posj] = data[posj] ^ block[j];
+ }
+ pos += take;
+ }
+}
+
+type EmptyObj = {};
+
+export function checkOpts(
+ defaults: T1,
+ opts: T2,
+): T1 & T2 {
+ if (opts == null || typeof opts !== 'object') {
+ throw new Error('options must be defined');
+ }
+ const merged = Object.assign(defaults, opts);
+ return merged as T1 & T2;
+}
+
+export type XorStream = (
+ key: Uint8Array,
+ nonce: Uint8Array,
+ data: Uint8Array,
+ output?: Uint8Array,
+ counter?: number
+) => Uint8Array;
+
+function anumber(n: number) {
+ if (!Number.isSafeInteger(n) || n < 0) {
+ throw new Error('positive integer expected, got');
+ }
+}
+
+function abool(b: boolean) {
+ if (typeof b !== 'boolean') {
+ throw new Error(`boolean expected, not ${b}`);
+ }
+}
+
+function abytes(b: Uint8Array | undefined, ...lengths: number[]) {
+ if (!isBytes(b)) {
+ throw new Error('Uint8Array expected');
+ }
+ if (lengths.length > 0 && !lengths.includes(b.length)) {
+ throw new Error('Uint8Array expected of length');
+ }
+}
+
+function isBytes(a: unknown): a is Uint8Array {
+ return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');
+}
+
+export function createCipher(core: CipherCoreFn, opts: CipherOpts): XorStream {
+ const {
+ allowShortKeys, extendNonceFn, counterLength, counterRight, rounds,
+ } = checkOpts(
+ {
+ allowShortKeys: false, counterLength: 8, counterRight: false, rounds: 20,
+ },
+ opts,
+ );
+ if (typeof core !== 'function') {
+ throw new Error('core must be a function');
+ }
+ anumber(counterLength);
+ anumber(rounds);
+ abool(counterRight);
+ abool(allowShortKeys);
+ return (
+ key: Uint8Array,
+ nonce: Uint8Array,
+ data: Uint8Array,
+ output?: Uint8Array,
+ counter = 0,
+ ): Uint8Array => {
+ abytes(key);
+ abytes(nonce);
+ abytes(data);
+ const len = data.length;
+ if (output === undefined) {
+ output = new Uint8Array(len);
+ }
+ abytes(output);
+ anumber(counter);
+ if (counter < 0 || counter >= MAX_COUNTER) {
+ throw new Error('arx: counter overflow');
+ }
+ if (output.length < len) {
+ throw new Error(`arx: output (${output.length}) is shorter than data (${len})`);
+ }
+ const toClean = [];
+
+ // Key & sigma
+ // key=16 -> sigma16, k=key|key
+ // key=32 -> sigma32, k=key
+ const l = key.length;
+ let k: Uint8Array;
+ let sigma: Uint32Array;
+ if (l === 32) {
+ toClean.push((k = copyBytes(key)));
+ sigma = sigma32_32;
+ } else if (l === 16 && allowShortKeys) {
+ k = new Uint8Array(32);
+ k.set(key);
+ k.set(key, 16);
+ sigma = sigma16_32;
+ toClean.push(k);
+ } else {
+ throw new Error(`arx: invalid 32-byte key, got length=${l}`);
+ }
+
+ // Nonce
+ // salsa20: 8 (8-byte counter)
+ // chacha20orig: 8 (8-byte counter)
+ // chacha20: 12 (4-byte counter)
+ // xsalsa20: 24 (16 -> hsalsa, 8 -> old nonce)
+ // xchacha20: 24 (16 -> hchacha, 8 -> old nonce)
+ // Align nonce to 4 bytes
+ if (!isAligned32(nonce)) {
+ toClean.push((nonce = copyBytes(nonce)));
+ }
+
+ const k32 = u32(k);
+ // hsalsa & hchacha: handle extended nonce
+ if (extendNonceFn) {
+ if (nonce.length !== 24) {
+ throw new Error('arx: extended nonce must be 24 bytes');
+ }
+ extendNonceFn(sigma, k32, u32(nonce.subarray(0, 16)), k32);
+ nonce = nonce.subarray(16);
+ }
+
+ // Handle nonce counter
+ const nonceNcLen = 16 - counterLength;
+ if (nonceNcLen !== nonce.length) {
+ throw new Error(`arx: nonce must be ${nonceNcLen} or 16 bytes`);
+ }
+
+ // Pad counter when nonce is 64 bit
+ if (nonceNcLen !== 12) {
+ const nc = new Uint8Array(12);
+ nc.set(nonce, counterRight ? 0 : 12 - nonce.length);
+ nonce = nc;
+ toClean.push(nonce);
+ }
+ const n32 = u32(nonce);
+ runCipher(core, sigma, k32, n32, data, output, counter, rounds);
+ clean(...toClean);
+ return output;
+ };
+}
diff --git a/src/core/base58.ts b/src/core/base58.ts
new file mode 100644
index 0000000..243b811
--- /dev/null
+++ b/src/core/base58.ts
@@ -0,0 +1,146 @@
+const UINT64_MAX = 2n ** 64n - 1n;
+const UINT64_SIZE = 8;
+
+const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
+const ALPHABET_SIZE = BigInt(ALPHABET.length);
+const ENCODED_BLOCK_SIZES = [0, 2, 3, 5, 6, 7, 9, 10, 11];
+const FULL_DECODED_BLOCK_SIZE = ENCODED_BLOCK_SIZES.length - 1;
+const FULL_ENCODED_BLOCK_SIZE = ENCODED_BLOCK_SIZES[FULL_DECODED_BLOCK_SIZE];
+
+const REVERSE_ALPHABET = [];
+for (let i = 0; i < ALPHABET.length; i++) {
+ REVERSE_ALPHABET[ALPHABET.charCodeAt(i) - ALPHABET.charCodeAt(0)] = i;
+}
+
+const DECODED_BLOCK_SIZES = [];
+for (let i = 0; i <= FULL_DECODED_BLOCK_SIZE; i++) {
+ DECODED_BLOCK_SIZES[ENCODED_BLOCK_SIZES[i]] = i;
+}
+
+function bufferToUint64(buffer: Uint8Array) {
+ if (!buffer.length || buffer.length > UINT64_SIZE) {
+ throw new Error(
+ `only a buffer of size between 1 and ${UINT64_SIZE} can be converted `,
+ );
+ }
+
+ let uint64 = 0n;
+ for (let i = 0; i < buffer.length; i++) {
+ uint64 = (uint64 << 8n) + BigInt(buffer[i]);
+ }
+
+ return uint64;
+}
+
+function uint64ToBuffer(buffer: Buffer, uint64: bigint): void {
+ if (!buffer.length || buffer.length > UINT64_SIZE) {
+ throw new Error(
+ 'a uint64 can only be converted to a buffer of size between 1 and ' +
+ `${UINT64_SIZE}`,
+ );
+ }
+
+ for (let i = buffer.length - 1; uint64; i--) {
+ if (i < 0) {
+ throw new Error(
+ 'buffer size insufficient to represent the uint64',
+ );
+ }
+
+ buffer[i] = Number(uint64 & 0xffn);
+ uint64 >>= 8n;
+ }
+}
+
+export function encodeBlock(buffer: Uint8Array): string {
+ if (!buffer.length || buffer.length > FULL_ENCODED_BLOCK_SIZE) {
+ throw new Error(
+ 'base58 block buffer size must be between 1 and ' +
+ `${FULL_ENCODED_BLOCK_SIZE}`,
+ );
+ }
+
+ const stringSize = ENCODED_BLOCK_SIZES[buffer.length];
+ let uint64 = bufferToUint64(buffer);
+
+ let string = '';
+ for (let i = stringSize - 1; uint64 && i >= 0; i--) {
+ const rem = Number(uint64 % ALPHABET_SIZE);
+ uint64 /= ALPHABET_SIZE;
+ string = ALPHABET[rem] + string;
+ }
+
+ return string.padStart(stringSize, ALPHABET[0]);
+}
+
+export function decodeBlock(buffer: Buffer, string: string): void {
+ if (!string || string.length > FULL_ENCODED_BLOCK_SIZE) {
+ throw new Error(
+ 'base58 block string size must be between 1 and ' +
+ `${FULL_ENCODED_BLOCK_SIZE}`,
+ );
+ }
+
+ let uint64 = 0n;
+ for (let i = 0; i < string.length; i++) {
+ const digit = REVERSE_ALPHABET[string.charCodeAt(i) - ALPHABET.charCodeAt(0)];
+
+ if (digit === undefined) {
+ throw new Error(
+ 'base58 string block contains invalid character',
+ );
+ }
+
+ uint64 = uint64 * ALPHABET_SIZE + BigInt(digit);
+ }
+
+ if (uint64 > UINT64_MAX) {
+ throw new Error(
+ 'numeric value of base58 block string overflows uint64',
+ );
+ }
+
+ uint64ToBuffer(buffer, uint64);
+}
+
+export function base58Encode(buffer: Uint8Array): string {
+ let string = '';
+
+ for (let start = 0; start < buffer.length;) {
+ const end: number = start + FULL_DECODED_BLOCK_SIZE;
+ const block: Uint8Array = buffer.subarray(start, end);
+ string += encodeBlock(block);
+ start = end;
+ }
+
+ return string;
+}
+
+export function base58Decode(string: string): Buffer {
+ const bufferSize: number = Math.floor(string.length / FULL_ENCODED_BLOCK_SIZE) *
+ FULL_DECODED_BLOCK_SIZE +
+ +DECODED_BLOCK_SIZES[string.length % FULL_ENCODED_BLOCK_SIZE];
+
+ if (!bufferSize) {
+ throw new Error(
+ 'base58 string has an invalid size',
+ );
+ }
+
+ const buffer = Buffer.alloc(bufferSize);
+ for (let startEncoded = 0, startDecoded = 0; startEncoded < string.length;) {
+ const endDecoded: number = startDecoded + FULL_DECODED_BLOCK_SIZE;
+ const blockDecoded: Buffer = buffer.subarray(startDecoded, endDecoded);
+
+ const endEncoded: number = startEncoded + FULL_ENCODED_BLOCK_SIZE;
+
+ const blockEncoded: string = string.slice(startEncoded, endEncoded);
+
+ decodeBlock(blockDecoded, blockEncoded);
+
+ startDecoded = endDecoded;
+ startEncoded = endEncoded;
+ }
+
+ return buffer;
+}
diff --git a/src/core/binary-archive.ts b/src/core/binary-archive.ts
new file mode 100644
index 0000000..fa0f259
--- /dev/null
+++ b/src/core/binary-archive.ts
@@ -0,0 +1,70 @@
+export class BinaryArchive {
+ public _buffer: Buffer;
+ public _offset: number;
+
+ constructor(buffer: Buffer) {
+ this._buffer = buffer;
+ this._offset = 0;
+ }
+
+ get offset(): number {
+ return this._offset;
+ }
+
+ eof(): boolean {
+ return this._offset === this._buffer.length;
+ }
+
+ readUint8(): number {
+ const value: number = this._buffer.readUInt8(this._offset);
+ this._offset += 1;
+ return value;
+ }
+
+ readUint16(): bigint {
+ const value = BigInt(this._buffer.readUInt16LE(this._offset));
+ this._offset += 2;
+ return value;
+ }
+
+ readUint32(): bigint {
+ const value = BigInt(this._buffer.readUInt32LE(this._offset));
+ this._offset += 4;
+ return value;
+ }
+
+ /**
+ *
+ * @see https://github.com/hyle-team/zano/blob/69a5d42d9908b7168247e103b2b40aae8c1fb3f5/src/common/varint.h#L59
+ */
+ readVarint(): bigint {
+ let varint = 0n;
+ let shift = 0;
+ let byte: number;
+
+ do {
+ byte = this.readUint8();
+ varint |= BigInt(byte & 0x7f) << BigInt(shift);
+ shift += 7;
+
+ if (shift >= 64) {
+ throw new Error('Overflow: Varint exceeds 64 bits.');
+ }
+ } while ((byte & 0x80) !== 0);
+
+ return varint;
+ }
+
+ readString(): string {
+ const length = Number(this.readVarint());
+ const str: string = this._buffer.toString('utf8', this._offset, this._offset + length);
+ this._offset += length;
+ return str;
+ }
+
+ readBlob(size: number): Buffer {
+ const blob: Buffer = this._buffer.subarray(this._offset, this._offset + size);
+ this._offset += size;
+ return blob;
+ }
+}
diff --git a/src/core/chacha8.ts b/src/core/chacha8.ts
new file mode 100644
index 0000000..2e9a134
--- /dev/null
+++ b/src/core/chacha8.ts
@@ -0,0 +1,83 @@
+import { XorStream , createCipher } from './arx';
+
+export function rotl(a: number, b: number): number {
+ return (a << b) | (a >>> (32 - b));
+}
+
+/**
+ * ChaCha core function.
+ */
+// prettier-ignore
+function chachaCore(
+ s: Uint32Array, k: Uint32Array, n: Uint32Array, out: Uint32Array, cnt: number, rounds = 20,
+): void {
+ const y00 = s[0], y01 = s[1], y02 = s[2], y03 = s[3], // "expa" "nd 3" "2-by" "te k"
+ y04 = k[0], y05 = k[1], y06 = k[2], y07 = k[3], // Key Key Key Key
+ y08 = k[4], y09 = k[5], y10 = k[6], y11 = k[7], // Key Key Key Key
+ y12 = cnt, y13 = n[0], y14 = n[1], y15 = n[2]; // Counter Counter Nonce Nonce
+ // Save state to temporary variables
+ let x00 = y00, x01 = y01, x02 = y02, x03 = y03,
+ x04 = y04, x05 = y05, x06 = y06, x07 = y07,
+ x08 = y08, x09 = y09, x10 = y10, x11 = y11,
+ x12 = y12, x13 = y13, x14 = y14, x15 = y15;
+ for (let r = 0; r < rounds; r += 2) {
+ x00 = (x00 + x04) | 0; x12 = rotl(x12 ^ x00, 16);
+ x08 = (x08 + x12) | 0; x04 = rotl(x04 ^ x08, 12);
+ x00 = (x00 + x04) | 0; x12 = rotl(x12 ^ x00, 8);
+ x08 = (x08 + x12) | 0; x04 = rotl(x04 ^ x08, 7);
+
+ x01 = (x01 + x05) | 0; x13 = rotl(x13 ^ x01, 16);
+ x09 = (x09 + x13) | 0; x05 = rotl(x05 ^ x09, 12);
+ x01 = (x01 + x05) | 0; x13 = rotl(x13 ^ x01, 8);
+ x09 = (x09 + x13) | 0; x05 = rotl(x05 ^ x09, 7);
+
+ x02 = (x02 + x06) | 0; x14 = rotl(x14 ^ x02, 16);
+ x10 = (x10 + x14) | 0; x06 = rotl(x06 ^ x10, 12);
+ x02 = (x02 + x06) | 0; x14 = rotl(x14 ^ x02, 8);
+ x10 = (x10 + x14) | 0; x06 = rotl(x06 ^ x10, 7);
+
+ x03 = (x03 + x07) | 0; x15 = rotl(x15 ^ x03, 16);
+ x11 = (x11 + x15) | 0; x07 = rotl(x07 ^ x11, 12);
+ x03 = (x03 + x07) | 0; x15 = rotl(x15 ^ x03, 8);
+ x11 = (x11 + x15) | 0; x07 = rotl(x07 ^ x11, 7);
+
+ x00 = (x00 + x05) | 0; x15 = rotl(x15 ^ x00, 16);
+ x10 = (x10 + x15) | 0; x05 = rotl(x05 ^ x10, 12);
+ x00 = (x00 + x05) | 0; x15 = rotl(x15 ^ x00, 8);
+ x10 = (x10 + x15) | 0; x05 = rotl(x05 ^ x10, 7);
+
+ x01 = (x01 + x06) | 0; x12 = rotl(x12 ^ x01, 16);
+ x11 = (x11 + x12) | 0; x06 = rotl(x06 ^ x11, 12);
+ x01 = (x01 + x06) | 0; x12 = rotl(x12 ^ x01, 8);
+ x11 = (x11 + x12) | 0; x06 = rotl(x06 ^ x11, 7);
+
+ x02 = (x02 + x07) | 0; x13 = rotl(x13 ^ x02, 16);
+ x08 = (x08 + x13) | 0; x07 = rotl(x07 ^ x08, 12);
+ x02 = (x02 + x07) | 0; x13 = rotl(x13 ^ x02, 8);
+ x08 = (x08 + x13) | 0; x07 = rotl(x07 ^ x08, 7);
+
+ x03 = (x03 + x04) | 0; x14 = rotl(x14 ^ x03, 16);
+ x09 = (x09 + x14) | 0; x04 = rotl(x04 ^ x09, 12);
+ x03 = (x03 + x04) | 0; x14 = rotl(x14 ^ x03, 8);
+ x09 = (x09 + x14) | 0; x04 = rotl(x04 ^ x09, 7);
+ }
+ // Write output
+ let oi = 0;
+ out[oi++] = (y00 + x00) | 0; out[oi++] = (y01 + x01) | 0;
+ out[oi++] = (y02 + x02) | 0; out[oi++] = (y03 + x03) | 0;
+ out[oi++] = (y04 + x04) | 0; out[oi++] = (y05 + x05) | 0;
+ out[oi++] = (y06 + x06) | 0; out[oi++] = (y07 + x07) | 0;
+ out[oi++] = (y08 + x08) | 0; out[oi++] = (y09 + x09) | 0;
+ out[oi++] = (y10 + x10) | 0; out[oi++] = (y11 + x11) | 0;
+ out[oi++] = (y12 + x12) | 0; out[oi++] = (y13 + x13) | 0;
+ out[oi++] = (y14 + x14) | 0; out[oi++] = (y15 + x15) | 0;
+}
+
+/*
+ * Reduced 8-round chacha, described in original paper.
+ */
+export const chacha8: XorStream = createCipher(chachaCore, {
+ counterRight: false,
+ counterLength: 4,
+ rounds: 8,
+});
diff --git a/src/core/crypto-data.ts b/src/core/crypto-data.ts
new file mode 100644
index 0000000..7d9042a
--- /dev/null
+++ b/src/core/crypto-data.ts
@@ -0,0 +1,30 @@
+import BN from 'bn.js';
+import { eddsa as EDDSA } from 'elliptic';
+
+import RedBN from './interfaces';
+
+export const ec: EDDSA = new EDDSA('ed25519');
+
+const { red } = ec.curve;
+export const A = new BN(486662, 10).toRed(red);
+
+// sqrt(-1)
+// https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto-ops-data.c#L12
+//export const sqrtm1 = new BN(1).toRed(red).redNeg().redSqrt();
+export const sqrtm1: RedBN = new BN('547cdb7fb03e20f4d4b2ff66c2042858d0bce7f952d01b873b11e4d8b5f15f3d', 'hex').toRed(red);
+
+// sqrt(-2 * A * (A + 2))
+// https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto-ops-data.c#L843
+export const fffb1: RedBN = new BN('7e71fbefdad61b1720a9c53741fb19e3d19404a8b92a738d22a76975321c41ee', 'hex').toRed(red);
+
+// sqrt(2 * A * (A + 2))
+// https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto-ops-data.c#L844
+export const fffb2: RedBN = new BN('32f9e1f5fba5d3096e2bae483fe9a041ae21fcb9fba908202d219b7c9f83650d', 'hex').toRed(red);
+
+// sqrt(-sqrt(-1) * A * (A + 2))
+// https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto-ops-data.c#L845
+export const fffb3: RedBN = new BN('1a43f3031067dbf926c0f4887ef7432eee46fc08a13f4a49853d1903b6b39186', 'hex').toRed(red);
+
+// sqrt(sqrt(-1) * A * (A + 2))
+// https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto-ops-data.c#L846
+export const fffb4: RedBN = new BN('674a110d14c208efb89546403f0da2ed4024ff4ea5964229581b7d8717302c66', 'hex').toRed(red);
diff --git a/src/core/crypto.ts b/src/core/crypto.ts
new file mode 100644
index 0000000..5db0740
--- /dev/null
+++ b/src/core/crypto.ts
@@ -0,0 +1,504 @@
+import { randomBytes } from 'crypto';
+
+import BN from 'bn.js';
+import { curve } from 'elliptic';
+import * as sha3 from 'js-sha3';
+import createKeccakHash from 'keccak';
+
+
+import { chacha8 } from './chacha8';
+import {
+ fffb4,
+ fffb3,
+ sqrtm1,
+ fffb2,
+ fffb1,
+ A,
+ ec,
+} from './crypto-data';
+import {
+ encodeInt,
+ decodePoint,
+ reduceScalar,
+ encodePoint,
+ decodeScalar,
+ squareRoot,
+ decodeInt,
+} from './helpers';
+import RedBN from './interfaces';
+import { serializeVarUint } from './serialize';
+import { SpendKeypair } from './types';
+
+const ADDRESS_CHECKSUM_SIZE = 8;
+export const SCALAR_1DIV8: Buffer = (() => {
+ const scalar: Buffer = Buffer.alloc(32);
+
+ scalar.writeBigUInt64LE(BigInt('0x6106e529e2dc2f79'), 0);
+ scalar.writeBigUInt64LE(BigInt('0x07d39db37d1cdad0'), 8);
+ scalar.writeBigUInt64LE(BigInt('0x0'), 16);
+ scalar.writeBigUInt64LE(BigInt('0x0600000000000000'), 24);
+
+ return scalar;
+})();
+export const HASH_SIZE = 32;
+
+export function getChecksum(buffer: Buffer): string {
+ return sha3.keccak_256(buffer).substring(0, ADDRESS_CHECKSUM_SIZE);
+}
+
+export function getDerivationToScalar(txPubKey: string, secViewKey: string, outIndex: number): Buffer {
+ const txPubKeyBuf: Buffer = Buffer.from(txPubKey, 'hex');
+ const secViewKeyBuf: Buffer = Buffer.from(secViewKey, 'hex');
+
+ const sharedSecret: Buffer = generateKeyDerivation(txPubKeyBuf, secViewKeyBuf);
+
+ return derivationToScalar(sharedSecret, outIndex);
+}
+
+/*
+ * out.concealing_point = (crypto::hash_helper_t::hs(CRYPTO_HDS_OUT_CONCEALING_POINT, h) * crypto::point_t(apa.view_public_key)).to_public_key(); // Q = 1/8 * Hs(domain_sep, Hs(8 * r * V, i) ) * 8 * V
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/currency_core/currency_format_utils.cpp#L1270
+ */
+export function calculateConcealingPoint(Hs: Buffer, pubViewKeyBuff: Buffer): Buffer {
+ const scalar: BN = decodeScalar(Hs, 'Invalid sсalar');
+ const P: curve.edwards.EdwardsPoint = decodePoint(pubViewKeyBuff, 'Invalid public key');
+ const P2: curve.base.BasePoint = P.mul(scalar);
+ return encodePoint(P2);
+}
+
+/*
+ * out.blinded_asset_id = (crypto::c_scalar_1div8 * blinded_asset_id).to_public_key(); // T = 1/8 * (H_asset + s * X)
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/currency_core/currency_format_utils.cpp#L1278
+ */
+export function calculateBlindedAssetId(Hs: Buffer, assetId: Buffer, X: Buffer): Buffer {
+ const assetIdCopy: Buffer = Buffer.from(assetId);
+ const pointXCopy: Buffer = Buffer.from(X);
+
+ const hsScalar: BN = decodeScalar(Hs, 'Invalid sсalar');
+ const xP: curve.edwards.EdwardsPoint = decodePoint(pointXCopy, 'Invalid public key');
+ const sxP: curve.base.BasePoint = xP.mul(hsScalar);
+
+ const scalar1div8: BN = decodeScalar(SCALAR_1DIV8, 'Invalid sсalar');
+ const assetPoint: curve.edwards.EdwardsPoint = decodePoint(assetIdCopy, 'Invalid public key');
+
+ const pointT: curve.base.BasePoint = sxP.add(assetPoint);
+ const blindedAssetIdPoint: curve.base.BasePoint = pointT.mul(scalar1div8);
+
+ return encodePoint(blindedAssetIdPoint);
+}
+
+// todo: crypto::point_t asset_id = blinded_asset_id - asset_id_blinding_mask * crypto::c_point_X; // H = T - s * X
+// https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/currency_core/currency_format_utils.cpp#L3289
+
+/*
+ * generate_key_derivation
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto.cpp#L175
+ */
+export function generateKeyDerivation(txPubKey: Buffer, secKeyView: Buffer): Buffer {
+ const s: BN = decodeScalar(secKeyView, 'Invalid secret key');
+ const P: curve.edwards.EdwardsPoint = decodePoint(txPubKey, 'Invalid public key');
+ const P2: curve.base.BasePoint = P.mul(s);
+ // Multiplying the initial derivation by 8, adhering to specific cryptographic protocol requirements
+ const P3: curve.base.BasePoint = P2.mul(new BN('8'));
+ return encodePoint(P3);
+}
+
+/*
+ * derive_public_key
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto.cpp#L207
+ */
+export function derivePublicKey(
+ derivation: Buffer,
+ outIndex: number,
+ pubSpendKeyBuf: Buffer,
+): Buffer {
+ const P1: curve.base.BasePoint = decodePoint(pubSpendKeyBuf, 'Invalid public key');
+ const scalar: Buffer = derivationToScalar(derivation, outIndex);
+ /*
+ * Scalar multiplication of the base point with the derived scalar to get the intermediary public key
+ * Hs(8 * r * V, i)G
+ */
+ const P: curve.base.BasePoint = ec.curve.g.mul(decodeInt(scalar));
+ // Hs(8 * r * V, i)G + S
+ const P2: curve.base.BasePoint = P.add(P1);
+ return encodePoint(P2);
+}
+
+/*
+ * derive_secret_key
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto.cpp#L227
+ */
+export function deriveSecretKey(derivation: Buffer, outIndex: number, sec: Buffer): Buffer {
+ const s: BN = decodeScalar(sec, 'Invalid secret key');
+ const scalar: Buffer = derivationToScalar(derivation, outIndex);
+ const key: BN = s
+ .add(decodeInt(scalar))
+ .umod(ec.curve.n);
+ return encodeInt(key);
+}
+
+/*
+ * derivation_to_scalar
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto.cpp#L190
+ */
+export function derivationToScalar(derivation: Buffer, outIndex: number): Buffer {
+ const data: Buffer = Buffer.concat([
+ derivation,
+ serializeVarUint(outIndex),
+ ]);
+ return hashToScalar(data);
+}
+
+export function fastHash(data: Buffer): Buffer {
+ const hash: Buffer = createKeccakHash('keccak256').update(data).digest();
+ return hash;
+}
+
+/*
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto-sugar.h#L1386
+ */
+export function hs(str32: Buffer, h: Buffer): Buffer {
+ const elements: Buffer[] = [str32, h];
+ const data: Buffer = Buffer.concat(elements);
+ return hashToScalar(data);
+}
+
+/*
+ * hash_to_scalar
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto.cpp#L115
+ */
+export function hashToScalar(data: Buffer): Buffer {
+ const hash: Buffer = fastHash(data);
+ return reduceScalar32(hash);
+}
+
+export function reduceScalar32(scalar: Buffer): Buffer {
+ const num: BN = decodeInt(scalar);
+ return encodeInt(num.umod(ec.curve.n));
+}
+
+/*
+ * generate_key_image
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto.cpp#L296
+ */
+export function calculateKeyImage(pub: Buffer, sec: Buffer): Buffer {
+ const s: BN = decodeScalar(sec, 'Invalid secret key');
+ const P1: curve.base.BasePoint = hashToEc(pub);
+ const P2: curve.base.BasePoint = P1.mul(s);
+ return encodePoint(P2);
+}
+
+/*
+ * hash_to_ec
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto.cpp#L286
+ */
+export function hashToEc(ephemeralPubKey: Buffer): curve.base.BasePoint {
+ const hash: Buffer = fastHash(ephemeralPubKey);
+ const P: curve.edwards.EdwardsPoint = hashToPoint(hash);
+ return P.mul(new BN(8).toRed(ec.curve.red));
+}
+
+/*
+ * ge_fromfe_frombytes_vartime
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto-ops.c#L2209
+ */
+export function hashToPoint(hash: Buffer): curve.edwards.EdwardsPoint {
+ const u: RedBN = decodeInt(hash).toRed(ec.curve.red);
+ // v = 2 * u^2
+ const v: RedBN = u.redMul(u).redMul(new BN(2).toRed(ec.curve.red));
+ // w = 2 * u^2 + 1 = v + 1
+ const w: RedBN = v.redAdd(new BN(1).toRed(ec.curve.red));
+ // t = w^2 - 2 * A^2 * u^2 = w^2 - A^2 * v
+ const t: RedBN = w.redMul(w).redSub(A.redMul(A).redMul(v));
+ // x = sqrt( w / w^2 - 2 * A^2 * u^2 ) = sqrt( w / t )
+ let x: RedBN = squareRoot(w, t);
+
+ let negative = false;
+
+ // check = w - x^2 * t
+ let check: RedBN = w.redSub(x.redMul(x).redMul(t));
+
+ if (!check.isZero()) {
+ // check = w + x^2 * t
+ check = w.redAdd(x.redMul(x).redMul(t));
+ if (!check.isZero()) {
+ negative = true;
+ } else {
+ // x = x * fe_fffb1
+ x = x.redMul(fffb1);
+ }
+ } else {
+ // x = x * fe_fffb2
+ x = x.redMul(fffb2);
+ }
+
+ let odd: boolean;
+ let r: RedBN;
+ if (!negative) {
+ odd = false;
+ // r = -2 * A * u^2 = -1 * A * v
+ r = A.redNeg().redMul(v);
+ // x = x * u
+ x = x.redMul(u);
+ } else {
+ odd = true;
+ // r = -1 * A
+ r = A.redNeg();
+ // check = w - sqrtm1 * x^2 * t
+ check = w.redSub(x.redMul(x).redMul(t).redMul(sqrtm1));
+ if (!check.isZero()) {
+ // check = w + sqrtm1 * x^2 * t
+ check = w.redAdd(x.redMul(x).redMul(t).redMul(sqrtm1));
+ if (!check.isZero()) {
+ throw new TypeError('Invalid point');
+ } else {
+ x = x.redMul(fffb3);
+ }
+ } else {
+ x = x.redMul(fffb4);
+ }
+ }
+
+ if (x.isOdd() !== odd) {
+ // x = -1 * x
+ x = x.redNeg();
+ }
+
+ // z = r + w
+ const z: RedBN = r.redAdd(w);
+ // y = r - w
+ const y: RedBN = r.redSub(w);
+ // x = x * z
+ x = x.redMul(z);
+
+ return ec.curve.point(x, y, z);
+}
+
+export function generateChaCha8Key(pass: Buffer): Buffer {
+ const hash: Buffer = fastHash(pass);
+ if (hash.length !== HASH_SIZE) {
+ throw new Error('Size of hash must be at least that of chacha8_key');
+ }
+ return hash;
+}
+
+export function chachaCrypt(paymentId: Buffer, derivation: Buffer): Buffer {
+ const key: Buffer = generateChaCha8Key(Buffer.from(derivation));
+ const iv: Uint8Array = new Uint8Array(Buffer.alloc(12).fill(0));
+ const decryptedBuff: Uint8Array = chacha8(key, iv, paymentId);
+
+ return Buffer.from(decryptedBuff);
+}
+
+/*
+ * keys_from_default
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto.cpp#L88
+ */
+export function keysFromDefault(aPart: Buffer, keysSeedBinarySize: number): SpendKeypair {
+ // aPart == 32 bytes
+ const tmp: Buffer = Buffer.alloc(64).fill(0);
+
+ if (!(tmp.length >= keysSeedBinarySize)) {
+ throw new Error('size mismatch');
+ }
+
+ tmp.set(aPart);
+
+ const hash: Buffer = fastHash(tmp.subarray(0, 32));
+ hash.copy(tmp, 32);
+
+ const scalar: BN = decodeInt(tmp);
+
+ const reducedScalarBuff: Buffer = Buffer.alloc(32);
+
+ const reducedScalar: BN = reduceScalar(scalar, ec.curve.n);
+ // for working in web building, without to Buffer
+ reducedScalarBuff.set(reducedScalar.toArrayLike(Buffer, 'le', 32));
+
+ const basePoint: curve.base.BasePoint = ec.curve.g;
+ const secretKey: Buffer = reducedScalarBuff.subarray(0, 32);
+
+ const s: BN = decodeScalar(secretKey);
+
+ const P2: curve.base.BasePoint = basePoint.mul(s);
+
+ return {
+ publicSpendKey: encodePoint(P2).toString('hex'),
+ secretSpendKey: Buffer.from(secretKey).toString('hex'),
+ };
+}
+
+/*
+ * generate_seed_keys
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto.cpp#L108
+ */
+export function generateSeedKeys(keysSeedBinarySize: number): SpendKeypair {
+ const keysSeedBinary: Buffer = getRandomBytes(keysSeedBinarySize);
+
+ const {
+ secretSpendKey,
+ publicSpendKey,
+ } = keysFromDefault(keysSeedBinary, keysSeedBinarySize);
+
+ return {
+ secretSpendKey,
+ publicSpendKey,
+ };
+}
+
+export function generateSeedKeysWeb(size: number): SpendKeypair {
+ const seed: Buffer = getRandomBytes(size);
+
+ const {
+ secretSpendKey,
+ publicSpendKey,
+ } = keysFromDefault(seed, size);
+
+ return {
+ seedKey: seed.toString('hex'),
+ secretSpendKey,
+ publicSpendKey,
+ };
+}
+
+export function getRandomBytes(numBytes: number): Buffer {
+ const array: Uint8Array = new Uint8Array(numBytes);
+ return typeof window !== 'undefined' && window.crypto?.getRandomValues(array)
+ ? Buffer.from(array)
+ : randomBytes(numBytes);
+}
+
+/*
+ * dependent_key
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto.cpp#L129
+ */
+export function dependentKey(secretSpendKey: Buffer): string {
+ if (secretSpendKey.length !== 32) {
+ throw new Error('Invalid secret spend key');
+ }
+ const secretViewKey: Buffer = hashToScalar(secretSpendKey);
+ return secretViewKey.toString('hex');
+}
+
+/*
+ * secret_key_to_public_key
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto.cpp#L165
+ */
+export function secretKeyToPublicKey(secretViewKey: Buffer): string {
+ const s: BN = decodeScalar(secretViewKey, 'Invalid secret key');
+ const basePoint: curve.base.BasePoint = ec.curve.g;
+ const P2: curve.base.BasePoint = basePoint.mul(s);
+ return encodePoint(P2).toString('hex');
+}
+
+/*
+ * generate_signature
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto.cpp#L241
+ */
+export function generateSignature(message: Buffer, privateKey: Buffer, pubKey: Buffer): string {
+ const h: Buffer = fastHash(message);
+ const s: BN = decodeScalar(privateKey);
+ const publicKey: string = secretKeyToPublicKey(privateKey);
+ const pubKeyBuf: Buffer = Buffer.from(publicKey, 'hex');
+
+ if (!pubKeyBuf.equals(pubKey)) {
+ throw new RangeError('Incorrect public key');
+ }
+
+ while (true) {
+ const k: BN = decodeInt(getRandomScalar(randomBytes(32), 32));
+ const K: curve.base.BasePoint = ec.curve.g.mul(k);
+
+ const buf = {
+ h: h,
+ key: pubKeyBuf,
+ comm: encodePoint(K),
+ };
+
+ const bufForHash: Buffer = Buffer.concat([buf.h, buf.key, buf.comm]);
+ const hashFromBuffer: Buffer = hashToScalar(bufForHash);
+
+ const c: BN = decodeInt(hashFromBuffer);
+
+ if (c.isZero()) {
+ continue;
+ }
+
+ const r: BN = k
+ .sub(s.mul(c))
+ .umod(ec.curve.n);
+
+ if (r.isZero()) {
+ continue;
+ }
+
+ const encodedC: Buffer = c.toArrayLike(Buffer, 'le', 32);
+ const encodedR: Buffer = r.toArrayLike(Buffer, 'le', 32);
+
+ return encodedR.toString('hex') + encodedC.toString('hex');
+ }
+}
+
+/*
+ * check_signature
+ * https://github.com/hyle-team/zano/blob/2817090c8ac7639d6f697d00fc8bcba2b3681d90/src/crypto/crypto.cpp#L265
+ */
+export function checkSignature(
+ message: Buffer,
+ publicKey: Buffer,
+ signature: { r: Buffer; c: Buffer },
+): boolean {
+ try {
+ const r: BN = decodeScalar(signature.r);
+ const c: BN = decodeScalar(signature.c);
+ const P: curve.edwards.EdwardsPoint = decodePoint(publicKey);
+ const h: Buffer = fastHash(message);
+ const B: curve.base.BasePoint = ec.curve.g;
+
+ const R: curve.base.BasePoint = P.mul(c).add(B.mul(r));
+ const bufComm: Buffer = encodePoint(R);
+
+ const buf = {
+ h,
+ key: publicKey,
+ comm: bufComm,
+ };
+
+ const bufForHash: Buffer = Buffer.concat([buf.h, buf.key, buf.comm]);
+ const hashFromBuffer: Buffer = hashToScalar(bufForHash);
+
+ const calculatedC: BN = decodeInt(hashFromBuffer);
+
+ return calculatedC.eq(c);
+
+ } catch (error) {
+ console.error('Error during signature verification:', error.message);
+ return false;
+ }
+}
+
+function getRandomScalar(aPart: Buffer, keysSeedBinarySize: number) {
+ // aPart == 32 bytes
+ const tmp: Buffer = Buffer.alloc(64).fill(0);
+
+ if (!(tmp.length >= keysSeedBinarySize)) {
+ throw new Error('size mismatch');
+ }
+
+ tmp.set(aPart);
+
+ const hash: Buffer = fastHash(tmp.subarray(0, 32));
+ hash.copy(tmp, 32);
+
+ const scalar: BN = decodeInt(tmp);
+
+ const reducedScalarBuff: Buffer = Buffer.alloc(32);
+
+ const reducedScalar: BN = reduceScalar(scalar, ec.curve.n);
+ // for working in web building, without to Buffer
+ reducedScalarBuff.set(reducedScalar.toArrayLike(Buffer, 'le', 32));
+
+ const secretKey: Buffer = reducedScalarBuff.subarray(0, 32);
+
+ return secretKey;
+}
diff --git a/src/core/helpers.ts b/src/core/helpers.ts
new file mode 100644
index 0000000..38f44b7
--- /dev/null
+++ b/src/core/helpers.ts
@@ -0,0 +1,86 @@
+import { Buffer } from 'buffer';
+
+import BN from 'bn.js';
+import { curve } from 'elliptic';
+
+import { ec, sqrtm1 } from './crypto-data';
+import RedBN from './interfaces';
+
+/*
+ * Decode little-endian number
+ */
+export function decodeInt(buf: Buffer): BN {
+ if (typeof buf === 'string') {
+ buf = Buffer.from(buf, 'hex');
+ }
+ return new BN(buf, 'hex', 'le');
+}
+
+/*
+ * Square root candidate
+ * x = (u/v)^(p+3)/8 = u*v^3*(u*v^7)^(p-5)/8
+ * https://tools.ietf.org/html/rfc8032#section-5.1.3
+ * https://crypto.stackexchange.com/questions/88868/why-computation-of-uv3uv7p-5-8-is-suggested-instead-of-u-vp3-8
+ */
+export function squareRoot(u: RedBN, v: RedBN) {
+ return u.redMul(v.redPow(new BN(3)))
+ .redMul(u.redMul(v.redPow(new BN(7))).redPow(ec.curve.p.subn(5).divn(8)));
+}
+
+/*
+ * Decode little-endian number and veryfy < n
+ */
+export function decodeScalar(buf: Buffer, message = 'Invalid scalar'): BN {
+ const scalar: BN = decodeInt(buf);
+ if (scalar.gte(ec.curve.n)) {
+ throw new RangeError(message);
+ }
+ return scalar;
+}
+
+export function encodePoint(P: curve.base.BasePoint): Buffer {
+ return Buffer.from(ec.encodePoint(P));
+}
+
+export function reduceScalar(scalar: BN, curveOrder: BN): BN {
+ return scalar.mod(curveOrder);
+}
+
+export function decodePoint(buf: Buffer, message = 'Invalid point'): curve.edwards.EdwardsPoint {
+ // compress data if curve isOdd
+ const xIsOdd: boolean = (buf[buf.length - 1] & 0x80) !== 0;
+ buf[buf.length - 1] = buf[buf.length - 1] & ~0x80;
+
+ let y: RedBN = decodeInt(buf) as RedBN;
+ if (y.gte(ec.curve.p)) {
+ throw new RangeError(message);
+ }
+ y = y.toRed(ec.curve.red);
+ // x^2 = (y^2 - c^2) / (c^2 d y^2 - a) = u / v
+ const y2: RedBN = y.redSqr();
+ const u: RedBN = y2.redSub(ec.curve.c2 as RedBN);
+ const v: RedBN = y2.redMul(ec.curve.d as RedBN).redMul(ec.curve.c2 as RedBN).redSub(ec.curve.a as RedBN);
+
+ let x: RedBN = squareRoot(u, v);
+
+ if (!u.redSub(x.redSqr().redMul(v)).isZero()) {
+ x = x.redMul(sqrtm1);
+ if (!u.redSub(x.redSqr().redMul(v)).isZero()) {
+ throw new RangeError(message);
+ }
+ }
+
+ if (x.fromRed().isZero() && xIsOdd) {
+ throw new RangeError(message);
+ }
+
+ if (x.fromRed().isOdd() !== xIsOdd) {
+ x = x.redNeg();
+ }
+
+ return ec.curve.point(x, y);
+}
+
+export function encodeInt(num: BN) {
+ return num.toArrayLike(Buffer, 'le', 32);
+}
\ No newline at end of file
diff --git a/src/core/interfaces.ts b/src/core/interfaces.ts
new file mode 100644
index 0000000..203bb37
--- /dev/null
+++ b/src/core/interfaces.ts
@@ -0,0 +1,78 @@
+import BN from 'bn.js';
+
+/**
+ * BN operations in a reduction context.
+ */
+declare class RedBN extends BN {
+ /**
+ * Convert back a number using a reduction context
+ */
+ fromRed(): BN;
+
+ /**
+ * modular addition
+ */
+ redAdd(b: RedBN): RedBN;
+
+ /**
+ * in-place modular addition
+ */
+ redIAdd(b: RedBN): RedBN;
+
+ /**
+ * modular subtraction
+ */
+ redSub(b: RedBN): RedBN;
+
+ /**
+ * in-place modular subtraction
+ */
+ redISub(b: RedBN): RedBN;
+
+ /**
+ * modular shift left
+ */
+ redShl(num: number): RedBN;
+
+ /**
+ * modular multiplication
+ */
+ redMul(b: RedBN): RedBN;
+
+ /**
+ * in-place modular multiplication
+ */
+ redIMul(b: RedBN): RedBN;
+
+ /**
+ * modular square
+ */
+ redSqr(): RedBN;
+
+ /**
+ * in-place modular square
+ */
+ redISqr(): RedBN;
+
+ /**
+ * modular square root
+ */
+ redSqrt(): RedBN;
+
+ /**
+ * modular inverse of the number
+ */
+ redInvm(): RedBN;
+
+ /**
+ * modular negation
+ */
+ redNeg(): RedBN;
+
+ /**
+ * modular exponentiation
+ */
+ redPow(b: BN): RedBN;
+}
+
+export default RedBN;
diff --git a/src/core/serialize.ts b/src/core/serialize.ts
new file mode 100644
index 0000000..ee45e0a
--- /dev/null
+++ b/src/core/serialize.ts
@@ -0,0 +1,25 @@
+export function serializeVarUint(varuint: number | bigint): Buffer {
+ const type = typeof varuint;
+ if (
+ (type !== 'number' && type !== 'bigint') ||
+ (type === 'number' && !Number.isInteger(varuint))
+ ) {
+ throw new Error(
+ 'varuint value must be integer-like',
+ );
+ }
+
+ const bytes = [];
+
+ varuint = BigInt(varuint);
+ while (varuint >= 0x80n) {
+ const byte = Number((varuint & 0x7fn) | 0x80n);
+ bytes.push(byte);
+ varuint >>= 7n;
+ }
+
+ bytes.push(Number(varuint));
+
+ const buffer: Buffer = Buffer.from(bytes);
+ return buffer;
+}
diff --git a/src/core/types.ts b/src/core/types.ts
new file mode 100644
index 0000000..2b48d4f
--- /dev/null
+++ b/src/core/types.ts
@@ -0,0 +1,5 @@
+export type SpendKeypair = {
+ seedKey?: string;
+ secretSpendKey: string;
+ publicSpendKey: string;
+}
diff --git a/src/decode/constants.ts b/src/decode/constants.ts
new file mode 100644
index 0000000..400d4d7
--- /dev/null
+++ b/src/decode/constants.ts
@@ -0,0 +1,25 @@
+export const TAG_LENGTH = 1;
+export const FLAG_LENGTH = 1;
+export const SPEND_KEY_LENGTH = 32;
+export const VIEW_KEY_LENGTH = 32;
+export const CHECKSUM_LENGTH = 4;
+export const BUFFER_ADDRESS_LENGTH: number =
+ TAG_LENGTH +
+ FLAG_LENGTH +
+ SPEND_KEY_LENGTH +
+ VIEW_KEY_LENGTH +
+ CHECKSUM_LENGTH;
+export const ADDRESS_REGEX = /^Z[a-zA-Z0-9]{96}$/;
+export const INTEGRATED_ADDRESS_REGEX = /^iZ[a-zA-Z0-9]{106}$/;
+export const PAYMENT_ID_LENGTH = 8;
+export const INTEGRATED_ADDRESS_FLAG_PREFIX = 0x6c;
+export const INTEGRATED_ADDRESS_TAG_PREFIX = 0xf8;
+export const ADDRESS_FLAG_PREFIX = 0x01;
+export const ADDRESS_TAG_PREFIX = 0xC5;
+export const BUFFER_INTEGRATED_ADDRESS_LENGTH =
+ BUFFER_ADDRESS_LENGTH +
+ PAYMENT_ID_LENGTH;
+export const PAYMENT_ID_REGEX = /^[a-fA-F0-9]{16}$/;
+export const PUBLIC_KEY_REGEX = /^[0-9a-f]{64}$/i;
+export const HEX_PUBKEY_REGEX = /^[a-fA-F0-9]{64}$/;
+export const HEX_ENCRYPTED_PAYMENT_ID = /\b[a-fA-F0-9]{16}\b/;
diff --git a/src/decode/decode-service.ts b/src/decode/decode-service.ts
new file mode 100644
index 0000000..c75df2c
--- /dev/null
+++ b/src/decode/decode-service.ts
@@ -0,0 +1,245 @@
+import {
+ ADDRESS_REGEX,
+ BUFFER_ADDRESS_LENGTH,
+ BUFFER_INTEGRATED_ADDRESS_LENGTH,
+ CHECKSUM_LENGTH,
+ FLAG_LENGTH,
+ INTEGRATED_ADDRESS_REGEX,
+ PUBLIC_KEY_REGEX,
+ SPEND_KEY_LENGTH,
+ TAG_LENGTH,
+ VIEW_KEY_LENGTH,
+} from './constants';
+import {
+ DecodeVoutResult,
+ DecodeTransactionResult,
+ ZarcanumAddressKeys,
+} from './types';
+import { isTransactionObjectV3, satoshiToZano } from './utils/functions';
+import { base58Decode } from '../core/base58';
+import { getChecksum, secretKeyToPublicKey } from '../core/crypto';
+import {
+ decodeAmount,
+ decryptPaymentId,
+ getConcealingPoint,
+ getNativeBlindedAsset,
+ getStealthAddress,
+ parseObjectInJson,
+} from '../transaction/transaction-utils';
+import {
+ AggregatedTxV3,
+ TransactionObject,
+ TransactionObjectV3,
+ TxOutZarcanum,
+ VoutEntry,
+} from '../transaction/types/transactions';
+
+export function decodeTransaction(
+ objectInJson: string,
+ secretViewKey: string,
+ addressOrPublicSpendKey: string,
+): DecodeTransactionResult {
+ objectInJson = objectInJson.trim();
+ secretViewKey = secretViewKey.trim();
+ addressOrPublicSpendKey = addressOrPublicSpendKey.trim();
+
+ let addressKeys: ZarcanumAddressKeys;
+
+ if (ADDRESS_REGEX.test(addressOrPublicSpendKey)) {
+ addressKeys = getKeysFromAddress(addressOrPublicSpendKey);
+ } else if (PUBLIC_KEY_REGEX.test(addressOrPublicSpendKey)) {
+ const secretViewKeyBuf: Buffer = Buffer.from(secretViewKey, 'hex');
+ const publicViewKey: string = secretKeyToPublicKey(secretViewKeyBuf);
+ addressKeys = {
+ spendPublicKey: addressOrPublicSpendKey,
+ viewPublicKey: publicViewKey,
+ };
+ } else {
+ return { ok: false, error: 'Either address or valid publicSpendKey must be provided.' };
+ }
+
+ const tx: TransactionObject | TransactionObjectV3 | null = parseObjectInJson(objectInJson);
+
+ if (!tx) {
+ return { ok: false, error: 'Failed to parse transaction JSON.' };
+ }
+
+ if (!isTransactionObjectV3(tx)) {
+ return { ok: false, error: 'Only V3 transactions are supported.' };
+ }
+
+ const aggregated: AggregatedTxV3 = tx.AGGREGATED;
+
+ if (!aggregated.vin?.length || !aggregated.vout?.length) {
+ return { ok: false, error: 'Invalid V3 transaction: missing vin or vout.' };
+ }
+
+ const validPubKey: string | undefined = aggregated.extra?.find(
+ item => 'pub_key' in item && typeof item.pub_key === 'string' && item.pub_key.length > 0,
+ )?.pub_key;
+
+ if (!validPubKey) {
+ return { ok: false, error: 'Public key not found in V3 transaction.' };
+ }
+
+ const extractedPaymentId: string | undefined = extractPaymentId(tx);
+ const paymentId: string = decryptPaymentId(extractedPaymentId, validPubKey, secretViewKey);
+
+ let totalAmount = BigInt(0);
+
+ for (const [index, vout] of aggregated.vout.entries()) {
+ if (!validateVoutEntryDataV3(vout)) {
+ continue;
+ }
+
+ const result: DecodeVoutResult = decodeVoutEntryV3(
+ vout,
+ validPubKey,
+ index,
+ addressKeys,
+ secretViewKey,
+ );
+
+ if (!result.ok) {
+ continue;
+ }
+
+ totalAmount += result.amount;
+ }
+
+ return {
+ ok: true,
+ amount: satoshiToZano(totalAmount.toString()),
+ ...(paymentId ? { paymentId } : { }),
+ };
+}
+
+function decodeVoutEntryV3(
+ vout: VoutEntry,
+ validPubKey: string,
+ index: number,
+ addressKeys: ZarcanumAddressKeys,
+ secretViewKey: string,
+): DecodeVoutResult {
+ if (!vout || !vout.tx_out_zarcanum) {
+ return { ok: false, error: 'Missing tx_out_zarcanum in vout.' };
+ }
+
+ const stealthAddress: string = getStealthAddress(
+ validPubKey,
+ secretViewKey,
+ addressKeys.spendPublicKey,
+ index,
+ );
+
+ const concealingPoint: string = getConcealingPoint(
+ secretViewKey,
+ validPubKey,
+ addressKeys.viewPublicKey,
+ index,
+ );
+
+ const blindedAssetId: string = getNativeBlindedAsset(
+ secretViewKey,
+ validPubKey,
+ index,
+ );
+
+ const out: TxOutZarcanum = vout.tx_out_zarcanum;
+
+ if (
+ stealthAddress !== out.stealth_address ||
+ concealingPoint !== out.concealing_point ||
+ blindedAssetId !== out.blinded_asset_id
+ ) {
+ return { ok: false, error: 'Output does not belong to this address (mismatch).' };
+ }
+
+ const decryptedAmount: bigint = decodeAmount(
+ secretViewKey,
+ validPubKey,
+ out.encrypted_amount,
+ index,
+ );
+
+ if (!decryptedAmount || typeof decryptedAmount !== 'bigint') {
+ return { ok: false, error: 'Failed to decrypt amount.' };
+ }
+
+ return { ok: true, amount: decryptedAmount };
+}
+
+function getKeysFromAddress(address: string): ZarcanumAddressKeys {
+ if (!ADDRESS_REGEX.test(address) && !INTEGRATED_ADDRESS_REGEX.test(address)) {
+ throw new Error('Invalid address format');
+ }
+
+ const buf: Buffer = base58Decode(address);
+
+ if (buf.length !== BUFFER_ADDRESS_LENGTH && buf.length !== BUFFER_INTEGRATED_ADDRESS_LENGTH) {
+ throw new Error('Invalid buffer address length');
+ }
+
+ const addressWithoutChecksum: Buffer = Buffer.from(buf.buffer, 0, buf.length - CHECKSUM_LENGTH);
+ const checksum: string = Buffer.from(buf.buffer, buf.length - CHECKSUM_LENGTH).toString('hex');
+
+ if (checksum !== getChecksum(addressWithoutChecksum)) {
+ throw new Error('Invalid address checksum');
+ }
+
+ const spendPublicKey: string = Buffer.from(
+ buf.buffer,
+ TAG_LENGTH + FLAG_LENGTH,
+ SPEND_KEY_LENGTH,
+ ).toString('hex');
+
+ const viewPublicKey: string = Buffer.from(
+ buf.buffer,
+ TAG_LENGTH + FLAG_LENGTH + SPEND_KEY_LENGTH,
+ VIEW_KEY_LENGTH,
+ ).toString('hex');
+
+ if (!spendPublicKey || spendPublicKey.length !== SPEND_KEY_LENGTH * 2 ||
+ !viewPublicKey || viewPublicKey.length !== VIEW_KEY_LENGTH * 2) {
+ throw new Error('Invalid key format in the address.');
+ }
+
+ return {
+ spendPublicKey,
+ viewPublicKey,
+ };
+}
+
+function validateVoutEntryDataV3(vout: VoutEntry): boolean {
+ if (!vout || !vout.tx_out_zarcanum) {
+ return false;
+ }
+
+ const {
+ stealth_address,
+ concealing_point,
+ amount_commitment,
+ blinded_asset_id,
+ encrypted_amount,
+ mix_attr,
+ } = vout.tx_out_zarcanum;
+
+ return (
+ typeof stealth_address === 'string' &&
+ typeof concealing_point === 'string' &&
+ typeof amount_commitment === 'string' &&
+ typeof blinded_asset_id === 'string' &&
+ typeof encrypted_amount === 'string' &&
+ typeof mix_attr === 'string'
+ );
+}
+
+function extractPaymentId(tx: TransactionObjectV3): string | null {
+ const body: string = tx?.attachment?.[0]?.attachment?.body;
+ if (typeof body !== 'string') {
+ return null;
+ }
+
+ const match: RegExpMatchArray = /\b[a-fA-F0-9]{16}\b/.exec(body);
+ return match ? match[0] : null;
+}
diff --git a/src/decode/types.ts b/src/decode/types.ts
new file mode 100644
index 0000000..88d03fc
--- /dev/null
+++ b/src/decode/types.ts
@@ -0,0 +1,11 @@
+export type ZarcanumAddressKeys = {
+ spendPublicKey: string;
+ viewPublicKey: string;
+};
+export type DecodeTransactionResult =
+ | { ok: true; amount: string; paymentId?: string }
+ | { ok: false; error: string }
+
+export type DecodeVoutResult =
+ | { ok: true; amount: bigint }
+ | { ok: false; error: string }
diff --git a/src/decode/utils/functions.ts b/src/decode/utils/functions.ts
new file mode 100644
index 0000000..41837bf
--- /dev/null
+++ b/src/decode/utils/functions.ts
@@ -0,0 +1,45 @@
+import Big from 'big.js';
+
+import type { TransactionObject, TransactionObjectV3 } from '../../transaction/types/transactions';
+
+
+export function timestampMsToDate(timestampMs: number): Date {
+ return new Date(timestampMs * 1000);
+}
+
+export function satoshiToZano(satoshiAmount: string): string {
+ const satoshi: Big = new Big(satoshiAmount);
+ if (satoshi.lt(0)) {
+ throw new Error('The number of satoshi cannot be negative');
+ } else if (satoshi.eq(0)) {
+ return '0';
+ }
+
+ satoshi.e -= 12;
+ return satoshi.toFixed();
+}
+
+export function isTransactionObjectV3(tx: TransactionObject | TransactionObjectV3): tx is TransactionObjectV3 {
+ return (tx as TransactionObjectV3).AGGREGATED?.version === '3';
+}
+
+/**
+ * Safely parses a string to a number using Big.js.
+ * Returns null if the value is invalid or too large for a JS number.
+ */
+export function parseBigAmountToNumber(str: string): number | null {
+ try {
+ const big: Big = new Big(str);
+ const num = Number(big.toString());
+
+ if (!Number.isFinite(num)) {
+ console.error('Value too large for JS number:', str);
+ return null;
+ }
+
+ return num;
+ } catch (e) {
+ console.error('Invalid numeric string format:', str);
+ return null;
+ }
+}
diff --git a/src/index.ts b/src/index.ts
new file mode 100644
index 0000000..9dc8185
--- /dev/null
+++ b/src/index.ts
@@ -0,0 +1,34 @@
+export { decodeTransaction } from './decode/decode-service';
+export type { DecodeTransactionResult } from './decode/types';
+
+export {
+ generateAccount,
+ validateAccount,
+ generateAccountKeys,
+ privateKeyToPublicKey,
+ getAccountBySecretSpendKey,
+ getKeyPair,
+} from './account/account-utils';
+export type {
+ AccountResult,
+ AccountKeys,
+ KeyPair,
+} from './account/types';
+
+export {
+ getIntegratedAddress,
+ createIntegratedAddress,
+ getMasterAddress,
+ splitIntegratedAddress,
+ getKeysFromAddress,
+ generatePaymentId,
+} from './address/address-utils';
+export type {
+ SplitedIntegratedAddress,
+ ZarcanumAddressKeys,
+} from './address/types';
+
+export { mnemonicToSeed } from './mnemonic';
+export type { MnemonicToSeedResult } from './mnemonic';
+export { seedToMnemonic } from './mnemonic';
+export type { SeedToMnemonicResult } from './mnemonic';
diff --git a/src/mnemonic/consts/phrases.ts b/src/mnemonic/consts/phrases.ts
new file mode 100644
index 0000000..918e92e
--- /dev/null
+++ b/src/mnemonic/consts/phrases.ts
@@ -0,0 +1,1628 @@
+export const phrases = [
+ { phrase: 'like', value: 0 },
+ { phrase: 'just', value: 1 },
+ { phrase: 'love', value: 2 },
+ { phrase: 'know', value: 3 },
+ { phrase: 'never', value: 4 },
+ { phrase: 'want', value: 5 },
+ { phrase: 'time', value: 6 },
+ { phrase: 'out', value: 7 },
+ { phrase: 'there', value: 8 },
+ { phrase: 'make', value: 9 },
+ { phrase: 'look', value: 10 },
+ { phrase: 'eye', value: 11 },
+ { phrase: 'down', value: 12 },
+ { phrase: 'only', value: 13 },
+ { phrase: 'think', value: 14 },
+ { phrase: 'heart', value: 15 },
+ { phrase: 'back', value: 16 },
+ { phrase: 'then', value: 17 },
+ { phrase: 'into', value: 18 },
+ { phrase: 'about', value: 19 },
+ { phrase: 'more', value: 20 },
+ { phrase: 'away', value: 21 },
+ { phrase: 'still', value: 22 },
+ { phrase: 'them', value: 23 },
+ { phrase: 'take', value: 24 },
+ { phrase: 'thing', value: 25 },
+ { phrase: 'even', value: 26 },
+ { phrase: 'through', value: 27 },
+ { phrase: 'long', value: 28 },
+ { phrase: 'always', value: 29 },
+ { phrase: 'world', value: 30 },
+ { phrase: 'too', value: 31 },
+ { phrase: 'friend', value: 32 },
+ { phrase: 'tell', value: 33 },
+ { phrase: 'try', value: 34 },
+ { phrase: 'hand', value: 35 },
+ { phrase: 'thought', value: 36 },
+ { phrase: 'over', value: 37 },
+ { phrase: 'here', value: 38 },
+ { phrase: 'other', value: 39 },
+ { phrase: 'need', value: 40 },
+ { phrase: 'smile', value: 41 },
+ { phrase: 'again', value: 42 },
+ { phrase: 'much', value: 43 },
+ { phrase: 'cry', value: 44 },
+ { phrase: 'been', value: 45 },
+ { phrase: 'night', value: 46 },
+ { phrase: 'ever', value: 47 },
+ { phrase: 'little', value: 48 },
+ { phrase: 'said', value: 49 },
+ { phrase: 'end', value: 50 },
+ { phrase: 'some', value: 51 },
+ { phrase: 'those', value: 52 },
+ { phrase: 'around', value: 53 },
+ { phrase: 'mind', value: 54 },
+ { phrase: 'people', value: 55 },
+ { phrase: 'girl', value: 56 },
+ { phrase: 'leave', value: 57 },
+ { phrase: 'dream', value: 58 },
+ { phrase: 'left', value: 59 },
+ { phrase: 'turn', value: 60 },
+ { phrase: 'myself', value: 61 },
+ { phrase: 'give', value: 62 },
+ { phrase: 'nothing', value: 63 },
+ { phrase: 'really', value: 64 },
+ { phrase: 'off', value: 65 },
+ { phrase: 'before', value: 66 },
+ { phrase: 'something', value: 67 },
+ { phrase: 'find', value: 68 },
+ { phrase: 'walk', value: 69 },
+ { phrase: 'wish', value: 70 },
+ { phrase: 'good', value: 71 },
+ { phrase: 'once', value: 72 },
+ { phrase: 'place', value: 73 },
+ { phrase: 'ask', value: 74 },
+ { phrase: 'stop', value: 75 },
+ { phrase: 'keep', value: 76 },
+ { phrase: 'watch', value: 77 },
+ { phrase: 'seem', value: 78 },
+ { phrase: 'everything', value: 79 },
+ { phrase: 'wait', value: 80 },
+ { phrase: 'got', value: 81 },
+ { phrase: 'yet', value: 82 },
+ { phrase: 'made', value: 83 },
+ { phrase: 'remember', value: 84 },
+ { phrase: 'start', value: 85 },
+ { phrase: 'alone', value: 86 },
+ { phrase: 'run', value: 87 },
+ { phrase: 'hope', value: 88 },
+ { phrase: 'maybe', value: 89 },
+ { phrase: 'believe', value: 90 },
+ { phrase: 'body', value: 91 },
+ { phrase: 'hate', value: 92 },
+ { phrase: 'after', value: 93 },
+ { phrase: 'close', value: 94 },
+ { phrase: 'talk', value: 95 },
+ { phrase: 'stand', value: 96 },
+ { phrase: 'own', value: 97 },
+ { phrase: 'each', value: 98 },
+ { phrase: 'hurt', value: 99 },
+ { phrase: 'help', value: 100 },
+ { phrase: 'home', value: 101 },
+ { phrase: 'god', value: 102 },
+ { phrase: 'soul', value: 103 },
+ { phrase: 'new', value: 104 },
+ { phrase: 'many', value: 105 },
+ { phrase: 'two', value: 106 },
+ { phrase: 'inside', value: 107 },
+ { phrase: 'should', value: 108 },
+ { phrase: 'true', value: 109 },
+ { phrase: 'first', value: 110 },
+ { phrase: 'fear', value: 111 },
+ { phrase: 'mean', value: 112 },
+ { phrase: 'better', value: 113 },
+ { phrase: 'play', value: 114 },
+ { phrase: 'another', value: 115 },
+ { phrase: 'gone', value: 116 },
+ { phrase: 'change', value: 117 },
+ { phrase: 'use', value: 118 },
+ { phrase: 'wonder', value: 119 },
+ { phrase: 'someone', value: 120 },
+ { phrase: 'hair', value: 121 },
+ { phrase: 'cold', value: 122 },
+ { phrase: 'open', value: 123 },
+ { phrase: 'best', value: 124 },
+ { phrase: 'any', value: 125 },
+ { phrase: 'behind', value: 126 },
+ { phrase: 'happen', value: 127 },
+ { phrase: 'water', value: 128 },
+ { phrase: 'dark', value: 129 },
+ { phrase: 'laugh', value: 130 },
+ { phrase: 'stay', value: 131 },
+ { phrase: 'forever', value: 132 },
+ { phrase: 'name', value: 133 },
+ { phrase: 'work', value: 134 },
+ { phrase: 'show', value: 135 },
+ { phrase: 'sky', value: 136 },
+ { phrase: 'break', value: 137 },
+ { phrase: 'came', value: 138 },
+ { phrase: 'deep', value: 139 },
+ { phrase: 'door', value: 140 },
+ { phrase: 'put', value: 141 },
+ { phrase: 'black', value: 142 },
+ { phrase: 'together', value: 143 },
+ { phrase: 'upon', value: 144 },
+ { phrase: 'happy', value: 145 },
+ { phrase: 'such', value: 146 },
+ { phrase: 'great', value: 147 },
+ { phrase: 'white', value: 148 },
+ { phrase: 'matter', value: 149 },
+ { phrase: 'fill', value: 150 },
+ { phrase: 'past', value: 151 },
+ { phrase: 'please', value: 152 },
+ { phrase: 'burn', value: 153 },
+ { phrase: 'cause', value: 154 },
+ { phrase: 'enough', value: 155 },
+ { phrase: 'touch', value: 156 },
+ { phrase: 'moment', value: 157 },
+ { phrase: 'soon', value: 158 },
+ { phrase: 'voice', value: 159 },
+ { phrase: 'scream', value: 160 },
+ { phrase: 'anything', value: 161 },
+ { phrase: 'stare', value: 162 },
+ { phrase: 'sound', value: 163 },
+ { phrase: 'red', value: 164 },
+ { phrase: 'everyone', value: 165 },
+ { phrase: 'hide', value: 166 },
+ { phrase: 'kiss', value: 167 },
+ { phrase: 'truth', value: 168 },
+ { phrase: 'death', value: 169 },
+ { phrase: 'beautiful', value: 170 },
+ { phrase: 'mine', value: 171 },
+ { phrase: 'blood', value: 172 },
+ { phrase: 'broken', value: 173 },
+ { phrase: 'very', value: 174 },
+ { phrase: 'pass', value: 175 },
+ { phrase: 'next', value: 176 },
+ { phrase: 'forget', value: 177 },
+ { phrase: 'tree', value: 178 },
+ { phrase: 'wrong', value: 179 },
+ { phrase: 'air', value: 180 },
+ { phrase: 'mother', value: 181 },
+ { phrase: 'understand', value: 182 },
+ { phrase: 'lip', value: 183 },
+ { phrase: 'hit', value: 184 },
+ { phrase: 'wall', value: 185 },
+ { phrase: 'memory', value: 186 },
+ { phrase: 'sleep', value: 187 },
+ { phrase: 'free', value: 188 },
+ { phrase: 'high', value: 189 },
+ { phrase: 'realize', value: 190 },
+ { phrase: 'school', value: 191 },
+ { phrase: 'might', value: 192 },
+ { phrase: 'skin', value: 193 },
+ { phrase: 'sweet', value: 194 },
+ { phrase: 'perfect', value: 195 },
+ { phrase: 'blue', value: 196 },
+ { phrase: 'kill', value: 197 },
+ { phrase: 'breath', value: 198 },
+ { phrase: 'dance', value: 199 },
+ { phrase: 'against', value: 200 },
+ { phrase: 'fly', value: 201 },
+ { phrase: 'between', value: 202 },
+ { phrase: 'grow', value: 203 },
+ { phrase: 'strong', value: 204 },
+ { phrase: 'under', value: 205 },
+ { phrase: 'listen', value: 206 },
+ { phrase: 'bring', value: 207 },
+ { phrase: 'sometimes', value: 208 },
+ { phrase: 'speak', value: 209 },
+ { phrase: 'pull', value: 210 },
+ { phrase: 'person', value: 211 },
+ { phrase: 'become', value: 212 },
+ { phrase: 'family', value: 213 },
+ { phrase: 'begin', value: 214 },
+ { phrase: 'ground', value: 215 },
+ { phrase: 'real', value: 216 },
+ { phrase: 'small', value: 217 },
+ { phrase: 'father', value: 218 },
+ { phrase: 'sure', value: 219 },
+ { phrase: 'feet', value: 220 },
+ { phrase: 'rest', value: 221 },
+ { phrase: 'young', value: 222 },
+ { phrase: 'finally', value: 223 },
+ { phrase: 'land', value: 224 },
+ { phrase: 'across', value: 225 },
+ { phrase: 'today', value: 226 },
+ { phrase: 'different', value: 227 },
+ { phrase: 'guy', value: 228 },
+ { phrase: 'line', value: 229 },
+ { phrase: 'fire', value: 230 },
+ { phrase: 'reason', value: 231 },
+ { phrase: 'reach', value: 232 },
+ { phrase: 'second', value: 233 },
+ { phrase: 'slowly', value: 234 },
+ { phrase: 'write', value: 235 },
+ { phrase: 'eat', value: 236 },
+ { phrase: 'smell', value: 237 },
+ { phrase: 'mouth', value: 238 },
+ { phrase: 'step', value: 239 },
+ { phrase: 'learn', value: 240 },
+ { phrase: 'three', value: 241 },
+ { phrase: 'floor', value: 242 },
+ { phrase: 'promise', value: 243 },
+ { phrase: 'breathe', value: 244 },
+ { phrase: 'darkness', value: 245 },
+ { phrase: 'push', value: 246 },
+ { phrase: 'earth', value: 247 },
+ { phrase: 'guess', value: 248 },
+ { phrase: 'save', value: 249 },
+ { phrase: 'song', value: 250 },
+ { phrase: 'above', value: 251 },
+ { phrase: 'along', value: 252 },
+ { phrase: 'both', value: 253 },
+ { phrase: 'color', value: 254 },
+ { phrase: 'house', value: 255 },
+ { phrase: 'almost', value: 256 },
+ { phrase: 'sorry', value: 257 },
+ { phrase: 'anymore', value: 258 },
+ { phrase: 'brother', value: 259 },
+ { phrase: 'okay', value: 260 },
+ { phrase: 'dear', value: 261 },
+ { phrase: 'game', value: 262 },
+ { phrase: 'fade', value: 263 },
+ { phrase: 'already', value: 264 },
+ { phrase: 'apart', value: 265 },
+ { phrase: 'warm', value: 266 },
+ { phrase: 'beauty', value: 267 },
+ { phrase: 'heard', value: 268 },
+ { phrase: 'notice', value: 269 },
+ { phrase: 'question', value: 270 },
+ { phrase: 'shine', value: 271 },
+ { phrase: 'began', value: 272 },
+ { phrase: 'piece', value: 273 },
+ { phrase: 'whole', value: 274 },
+ { phrase: 'shadow', value: 275 },
+ { phrase: 'secret', value: 276 },
+ { phrase: 'street', value: 277 },
+ { phrase: 'within', value: 278 },
+ { phrase: 'finger', value: 279 },
+ { phrase: 'point', value: 280 },
+ { phrase: 'morning', value: 281 },
+ { phrase: 'whisper', value: 282 },
+ { phrase: 'child', value: 283 },
+ { phrase: 'moon', value: 284 },
+ { phrase: 'green', value: 285 },
+ { phrase: 'story', value: 286 },
+ { phrase: 'glass', value: 287 },
+ { phrase: 'kid', value: 288 },
+ { phrase: 'silence', value: 289 },
+ { phrase: 'since', value: 290 },
+ { phrase: 'soft', value: 291 },
+ { phrase: 'yourself', value: 292 },
+ { phrase: 'empty', value: 293 },
+ { phrase: 'shall', value: 294 },
+ { phrase: 'angel', value: 295 },
+ { phrase: 'answer', value: 296 },
+ { phrase: 'baby', value: 297 },
+ { phrase: 'bright', value: 298 },
+ { phrase: 'dad', value: 299 },
+ { phrase: 'path', value: 300 },
+ { phrase: 'worry', value: 301 },
+ { phrase: 'hour', value: 302 },
+ { phrase: 'drop', value: 303 },
+ { phrase: 'follow', value: 304 },
+ { phrase: 'power', value: 305 },
+ { phrase: 'war', value: 306 },
+ { phrase: 'half', value: 307 },
+ { phrase: 'flow', value: 308 },
+ { phrase: 'heaven', value: 309 },
+ { phrase: 'act', value: 310 },
+ { phrase: 'chance', value: 311 },
+ { phrase: 'fact', value: 312 },
+ { phrase: 'least', value: 313 },
+ { phrase: 'tired', value: 314 },
+ { phrase: 'children', value: 315 },
+ { phrase: 'near', value: 316 },
+ { phrase: 'quite', value: 317 },
+ { phrase: 'afraid', value: 318 },
+ { phrase: 'rise', value: 319 },
+ { phrase: 'sea', value: 320 },
+ { phrase: 'taste', value: 321 },
+ { phrase: 'window', value: 322 },
+ { phrase: 'cover', value: 323 },
+ { phrase: 'nice', value: 324 },
+ { phrase: 'trust', value: 325 },
+ { phrase: 'lot', value: 326 },
+ { phrase: 'sad', value: 327 },
+ { phrase: 'cool', value: 328 },
+ { phrase: 'force', value: 329 },
+ { phrase: 'peace', value: 330 },
+ { phrase: 'return', value: 331 },
+ { phrase: 'blind', value: 332 },
+ { phrase: 'easy', value: 333 },
+ { phrase: 'ready', value: 334 },
+ { phrase: 'roll', value: 335 },
+ { phrase: 'rose', value: 336 },
+ { phrase: 'drive', value: 337 },
+ { phrase: 'held', value: 338 },
+ { phrase: 'music', value: 339 },
+ { phrase: 'beneath', value: 340 },
+ { phrase: 'hang', value: 341 },
+ { phrase: 'mom', value: 342 },
+ { phrase: 'paint', value: 343 },
+ { phrase: 'emotion', value: 344 },
+ { phrase: 'quiet', value: 345 },
+ { phrase: 'clear', value: 346 },
+ { phrase: 'cloud', value: 347 },
+ { phrase: 'few', value: 348 },
+ { phrase: 'pretty', value: 349 },
+ { phrase: 'bird', value: 350 },
+ { phrase: 'outside', value: 351 },
+ { phrase: 'paper', value: 352 },
+ { phrase: 'picture', value: 353 },
+ { phrase: 'front', value: 354 },
+ { phrase: 'rock', value: 355 },
+ { phrase: 'simple', value: 356 },
+ { phrase: 'anyone', value: 357 },
+ { phrase: 'meant', value: 358 },
+ { phrase: 'reality', value: 359 },
+ { phrase: 'road', value: 360 },
+ { phrase: 'sense', value: 361 },
+ { phrase: 'waste', value: 362 },
+ { phrase: 'bit', value: 363 },
+ { phrase: 'leaf', value: 364 },
+ { phrase: 'thank', value: 365 },
+ { phrase: 'happiness', value: 366 },
+ { phrase: 'meet', value: 367 },
+ { phrase: 'men', value: 368 },
+ { phrase: 'smoke', value: 369 },
+ { phrase: 'truly', value: 370 },
+ { phrase: 'decide', value: 371 },
+ { phrase: 'self', value: 372 },
+ { phrase: 'age', value: 373 },
+ { phrase: 'book', value: 374 },
+ { phrase: 'form', value: 375 },
+ { phrase: 'alive', value: 376 },
+ { phrase: 'carry', value: 377 },
+ { phrase: 'escape', value: 378 },
+ { phrase: 'damn', value: 379 },
+ { phrase: 'instead', value: 380 },
+ { phrase: 'able', value: 381 },
+ { phrase: 'ice', value: 382 },
+ { phrase: 'minute', value: 383 },
+ { phrase: 'throw', value: 384 },
+ { phrase: 'catch', value: 385 },
+ { phrase: 'leg', value: 386 },
+ { phrase: 'ring', value: 387 },
+ { phrase: 'course', value: 388 },
+ { phrase: 'goodbye', value: 389 },
+ { phrase: 'lead', value: 390 },
+ { phrase: 'poem', value: 391 },
+ { phrase: 'sick', value: 392 },
+ { phrase: 'corner', value: 393 },
+ { phrase: 'desire', value: 394 },
+ { phrase: 'known', value: 395 },
+ { phrase: 'problem', value: 396 },
+ { phrase: 'remind', value: 397 },
+ { phrase: 'shoulder', value: 398 },
+ { phrase: 'suppose', value: 399 },
+ { phrase: 'toward', value: 400 },
+ { phrase: 'wave', value: 401 },
+ { phrase: 'drink', value: 402 },
+ { phrase: 'jump', value: 403 },
+ { phrase: 'woman', value: 404 },
+ { phrase: 'pretend', value: 405 },
+ { phrase: 'sister', value: 406 },
+ { phrase: 'week', value: 407 },
+ { phrase: 'human', value: 408 },
+ { phrase: 'joy', value: 409 },
+ { phrase: 'crack', value: 410 },
+ { phrase: 'grey', value: 411 },
+ { phrase: 'pray', value: 412 },
+ { phrase: 'surprise', value: 413 },
+ { phrase: 'dry', value: 414 },
+ { phrase: 'knee', value: 415 },
+ { phrase: 'less', value: 416 },
+ { phrase: 'search', value: 417 },
+ { phrase: 'bleed', value: 418 },
+ { phrase: 'caught', value: 419 },
+ { phrase: 'clean', value: 420 },
+ { phrase: 'embrace', value: 421 },
+ { phrase: 'future', value: 422 },
+ { phrase: 'king', value: 423 },
+ { phrase: 'son', value: 424 },
+ { phrase: 'sorrow', value: 425 },
+ { phrase: 'chest', value: 426 },
+ { phrase: 'hug', value: 427 },
+ { phrase: 'remain', value: 428 },
+ { phrase: 'sat', value: 429 },
+ { phrase: 'worth', value: 430 },
+ { phrase: 'blow', value: 431 },
+ { phrase: 'daddy', value: 432 },
+ { phrase: 'final', value: 433 },
+ { phrase: 'parent', value: 434 },
+ { phrase: 'tight', value: 435 },
+ { phrase: 'also', value: 436 },
+ { phrase: 'create', value: 437 },
+ { phrase: 'lonely', value: 438 },
+ { phrase: 'safe', value: 439 },
+ { phrase: 'cross', value: 440 },
+ { phrase: 'dress', value: 441 },
+ { phrase: 'evil', value: 442 },
+ { phrase: 'silent', value: 443 },
+ { phrase: 'bone', value: 444 },
+ { phrase: 'fate', value: 445 },
+ { phrase: 'perhaps', value: 446 },
+ { phrase: 'anger', value: 447 },
+ { phrase: 'class', value: 448 },
+ { phrase: 'scar', value: 449 },
+ { phrase: 'snow', value: 450 },
+ { phrase: 'tiny', value: 451 },
+ { phrase: 'tonight', value: 452 },
+ { phrase: 'continue', value: 453 },
+ { phrase: 'control', value: 454 },
+ { phrase: 'dog', value: 455 },
+ { phrase: 'edge', value: 456 },
+ { phrase: 'mirror', value: 457 },
+ { phrase: 'month', value: 458 },
+ { phrase: 'suddenly', value: 459 },
+ { phrase: 'comfort', value: 460 },
+ { phrase: 'given', value: 461 },
+ { phrase: 'loud', value: 462 },
+ { phrase: 'quickly', value: 463 },
+ { phrase: 'gaze', value: 464 },
+ { phrase: 'plan', value: 465 },
+ { phrase: 'rush', value: 466 },
+ { phrase: 'stone', value: 467 },
+ { phrase: 'town', value: 468 },
+ { phrase: 'battle', value: 469 },
+ { phrase: 'ignore', value: 470 },
+ { phrase: 'spirit', value: 471 },
+ { phrase: 'stood', value: 472 },
+ { phrase: 'stupid', value: 473 },
+ { phrase: 'yours', value: 474 },
+ { phrase: 'brown', value: 475 },
+ { phrase: 'build', value: 476 },
+ { phrase: 'dust', value: 477 },
+ { phrase: 'hey', value: 478 },
+ { phrase: 'kept', value: 479 },
+ { phrase: 'pay', value: 480 },
+ { phrase: 'phone', value: 481 },
+ { phrase: 'twist', value: 482 },
+ { phrase: 'although', value: 483 },
+ { phrase: 'ball', value: 484 },
+ { phrase: 'beyond', value: 485 },
+ { phrase: 'hidden', value: 486 },
+ { phrase: 'nose', value: 487 },
+ { phrase: 'taken', value: 488 },
+ { phrase: 'fail', value: 489 },
+ { phrase: 'float', value: 490 },
+ { phrase: 'pure', value: 491 },
+ { phrase: 'somehow', value: 492 },
+ { phrase: 'wash', value: 493 },
+ { phrase: 'wrap', value: 494 },
+ { phrase: 'angry', value: 495 },
+ { phrase: 'cheek', value: 496 },
+ { phrase: 'creature', value: 497 },
+ { phrase: 'forgotten', value: 498 },
+ { phrase: 'heat', value: 499 },
+ { phrase: 'rip', value: 500 },
+ { phrase: 'single', value: 501 },
+ { phrase: 'space', value: 502 },
+ { phrase: 'special', value: 503 },
+ { phrase: 'weak', value: 504 },
+ { phrase: 'whatever', value: 505 },
+ { phrase: 'yell', value: 506 },
+ { phrase: 'anyway', value: 507 },
+ { phrase: 'blame', value: 508 },
+ { phrase: 'job', value: 509 },
+ { phrase: 'choose', value: 510 },
+ { phrase: 'country', value: 511 },
+ { phrase: 'curse', value: 512 },
+ { phrase: 'drift', value: 513 },
+ { phrase: 'echo', value: 514 },
+ { phrase: 'figure', value: 515 },
+ { phrase: 'grew', value: 516 },
+ { phrase: 'laughter', value: 517 },
+ { phrase: 'neck', value: 518 },
+ { phrase: 'suffer', value: 519 },
+ { phrase: 'worse', value: 520 },
+ { phrase: 'yeah', value: 521 },
+ { phrase: 'disappear', value: 522 },
+ { phrase: 'foot', value: 523 },
+ { phrase: 'forward', value: 524 },
+ { phrase: 'knife', value: 525 },
+ { phrase: 'mess', value: 526 },
+ { phrase: 'somewhere', value: 527 },
+ { phrase: 'stomach', value: 528 },
+ { phrase: 'storm', value: 529 },
+ { phrase: 'beg', value: 530 },
+ { phrase: 'idea', value: 531 },
+ { phrase: 'lift', value: 532 },
+ { phrase: 'offer', value: 533 },
+ { phrase: 'breeze', value: 534 },
+ { phrase: 'field', value: 535 },
+ { phrase: 'five', value: 536 },
+ { phrase: 'often', value: 537 },
+ { phrase: 'simply', value: 538 },
+ { phrase: 'stuck', value: 539 },
+ { phrase: 'win', value: 540 },
+ { phrase: 'allow', value: 541 },
+ { phrase: 'confuse', value: 542 },
+ { phrase: 'enjoy', value: 543 },
+ { phrase: 'except', value: 544 },
+ { phrase: 'flower', value: 545 },
+ { phrase: 'seek', value: 546 },
+ { phrase: 'strength', value: 547 },
+ { phrase: 'calm', value: 548 },
+ { phrase: 'grin', value: 549 },
+ { phrase: 'gun', value: 550 },
+ { phrase: 'heavy', value: 551 },
+ { phrase: 'hill', value: 552 },
+ { phrase: 'large', value: 553 },
+ { phrase: 'ocean', value: 554 },
+ { phrase: 'shoe', value: 555 },
+ { phrase: 'sigh', value: 556 },
+ { phrase: 'straight', value: 557 },
+ { phrase: 'summer', value: 558 },
+ { phrase: 'tongue', value: 559 },
+ { phrase: 'accept', value: 560 },
+ { phrase: 'crazy', value: 561 },
+ { phrase: 'everyday', value: 562 },
+ { phrase: 'exist', value: 563 },
+ { phrase: 'grass', value: 564 },
+ { phrase: 'mistake', value: 565 },
+ { phrase: 'sent', value: 566 },
+ { phrase: 'shut', value: 567 },
+ { phrase: 'surround', value: 568 },
+ { phrase: 'table', value: 569 },
+ { phrase: 'ache', value: 570 },
+ { phrase: 'brain', value: 571 },
+ { phrase: 'destroy', value: 572 },
+ { phrase: 'heal', value: 573 },
+ { phrase: 'nature', value: 574 },
+ { phrase: 'shout', value: 575 },
+ { phrase: 'sign', value: 576 },
+ { phrase: 'stain', value: 577 },
+ { phrase: 'choice', value: 578 },
+ { phrase: 'doubt', value: 579 },
+ { phrase: 'glance', value: 580 },
+ { phrase: 'glow', value: 581 },
+ { phrase: 'mountain', value: 582 },
+ { phrase: 'queen', value: 583 },
+ { phrase: 'stranger', value: 584 },
+ { phrase: 'throat', value: 585 },
+ { phrase: 'tomorrow', value: 586 },
+ { phrase: 'city', value: 587 },
+ { phrase: 'either', value: 588 },
+ { phrase: 'fish', value: 589 },
+ { phrase: 'flame', value: 590 },
+ { phrase: 'rather', value: 591 },
+ { phrase: 'shape', value: 592 },
+ { phrase: 'spin', value: 593 },
+ { phrase: 'spread', value: 594 },
+ { phrase: 'ash', value: 595 },
+ { phrase: 'distance', value: 596 },
+ { phrase: 'finish', value: 597 },
+ { phrase: 'image', value: 598 },
+ { phrase: 'imagine', value: 599 },
+ { phrase: 'important', value: 600 },
+ { phrase: 'nobody', value: 601 },
+ { phrase: 'shatter', value: 602 },
+ { phrase: 'warmth', value: 603 },
+ { phrase: 'became', value: 604 },
+ { phrase: 'feed', value: 605 },
+ { phrase: 'flesh', value: 606 },
+ { phrase: 'funny', value: 607 },
+ { phrase: 'lust', value: 608 },
+ { phrase: 'shirt', value: 609 },
+ { phrase: 'trouble', value: 610 },
+ { phrase: 'yellow', value: 611 },
+ { phrase: 'attention', value: 612 },
+ { phrase: 'bare', value: 613 },
+ { phrase: 'bite', value: 614 },
+ { phrase: 'money', value: 615 },
+ { phrase: 'protect', value: 616 },
+ { phrase: 'amaze', value: 617 },
+ { phrase: 'appear', value: 618 },
+ { phrase: 'born', value: 619 },
+ { phrase: 'choke', value: 620 },
+ { phrase: 'completely', value: 621 },
+ { phrase: 'daughter', value: 622 },
+ { phrase: 'fresh', value: 623 },
+ { phrase: 'friendship', value: 624 },
+ { phrase: 'gentle', value: 625 },
+ { phrase: 'probably', value: 626 },
+ { phrase: 'six', value: 627 },
+ { phrase: 'deserve', value: 628 },
+ { phrase: 'expect', value: 629 },
+ { phrase: 'grab', value: 630 },
+ { phrase: 'middle', value: 631 },
+ { phrase: 'nightmare', value: 632 },
+ { phrase: 'river', value: 633 },
+ { phrase: 'thousand', value: 634 },
+ { phrase: 'weight', value: 635 },
+ { phrase: 'worst', value: 636 },
+ { phrase: 'wound', value: 637 },
+ { phrase: 'barely', value: 638 },
+ { phrase: 'bottle', value: 639 },
+ { phrase: 'cream', value: 640 },
+ { phrase: 'regret', value: 641 },
+ { phrase: 'relationship', value: 642 },
+ { phrase: 'stick', value: 643 },
+ { phrase: 'test', value: 644 },
+ { phrase: 'crush', value: 645 },
+ { phrase: 'endless', value: 646 },
+ { phrase: 'fault', value: 647 },
+ { phrase: 'itself', value: 648 },
+ { phrase: 'rule', value: 649 },
+ { phrase: 'spill', value: 650 },
+ { phrase: 'art', value: 651 },
+ { phrase: 'circle', value: 652 },
+ { phrase: 'join', value: 653 },
+ { phrase: 'kick', value: 654 },
+ { phrase: 'mask', value: 655 },
+ { phrase: 'master', value: 656 },
+ { phrase: 'passion', value: 657 },
+ { phrase: 'quick', value: 658 },
+ { phrase: 'raise', value: 659 },
+ { phrase: 'smooth', value: 660 },
+ { phrase: 'unless', value: 661 },
+ { phrase: 'wander', value: 662 },
+ { phrase: 'actually', value: 663 },
+ { phrase: 'broke', value: 664 },
+ { phrase: 'chair', value: 665 },
+ { phrase: 'deal', value: 666 },
+ { phrase: 'favorite', value: 667 },
+ { phrase: 'gift', value: 668 },
+ { phrase: 'note', value: 669 },
+ { phrase: 'number', value: 670 },
+ { phrase: 'sweat', value: 671 },
+ { phrase: 'box', value: 672 },
+ { phrase: 'chill', value: 673 },
+ { phrase: 'clothes', value: 674 },
+ { phrase: 'lady', value: 675 },
+ { phrase: 'mark', value: 676 },
+ { phrase: 'park', value: 677 },
+ { phrase: 'poor', value: 678 },
+ { phrase: 'sadness', value: 679 },
+ { phrase: 'tie', value: 680 },
+ { phrase: 'animal', value: 681 },
+ { phrase: 'belong', value: 682 },
+ { phrase: 'brush', value: 683 },
+ { phrase: 'consume', value: 684 },
+ { phrase: 'dawn', value: 685 },
+ { phrase: 'forest', value: 686 },
+ { phrase: 'innocent', value: 687 },
+ { phrase: 'pen', value: 688 },
+ { phrase: 'pride', value: 689 },
+ { phrase: 'stream', value: 690 },
+ { phrase: 'thick', value: 691 },
+ { phrase: 'clay', value: 692 },
+ { phrase: 'complete', value: 693 },
+ { phrase: 'count', value: 694 },
+ { phrase: 'draw', value: 695 },
+ { phrase: 'faith', value: 696 },
+ { phrase: 'press', value: 697 },
+ { phrase: 'silver', value: 698 },
+ { phrase: 'struggle', value: 699 },
+ { phrase: 'surface', value: 700 },
+ { phrase: 'taught', value: 701 },
+ { phrase: 'teach', value: 702 },
+ { phrase: 'wet', value: 703 },
+ { phrase: 'bless', value: 704 },
+ { phrase: 'chase', value: 705 },
+ { phrase: 'climb', value: 706 },
+ { phrase: 'enter', value: 707 },
+ { phrase: 'letter', value: 708 },
+ { phrase: 'melt', value: 709 },
+ { phrase: 'metal', value: 710 },
+ { phrase: 'movie', value: 711 },
+ { phrase: 'stretch', value: 712 },
+ { phrase: 'swing', value: 713 },
+ { phrase: 'vision', value: 714 },
+ { phrase: 'wife', value: 715 },
+ { phrase: 'beside', value: 716 },
+ { phrase: 'crash', value: 717 },
+ { phrase: 'forgot', value: 718 },
+ { phrase: 'guide', value: 719 },
+ { phrase: 'haunt', value: 720 },
+ { phrase: 'joke', value: 721 },
+ { phrase: 'knock', value: 722 },
+ { phrase: 'plant', value: 723 },
+ { phrase: 'pour', value: 724 },
+ { phrase: 'prove', value: 725 },
+ { phrase: 'reveal', value: 726 },
+ { phrase: 'steal', value: 727 },
+ { phrase: 'stuff', value: 728 },
+ { phrase: 'trip', value: 729 },
+ { phrase: 'wood', value: 730 },
+ { phrase: 'wrist', value: 731 },
+ { phrase: 'bother', value: 732 },
+ { phrase: 'bottom', value: 733 },
+ { phrase: 'crawl', value: 734 },
+ { phrase: 'crowd', value: 735 },
+ { phrase: 'fix', value: 736 },
+ { phrase: 'forgive', value: 737 },
+ { phrase: 'frown', value: 738 },
+ { phrase: 'grace', value: 739 },
+ { phrase: 'loose', value: 740 },
+ { phrase: 'lucky', value: 741 },
+ { phrase: 'party', value: 742 },
+ { phrase: 'release', value: 743 },
+ { phrase: 'surely', value: 744 },
+ { phrase: 'survive', value: 745 },
+ { phrase: 'teacher', value: 746 },
+ { phrase: 'gently', value: 747 },
+ { phrase: 'grip', value: 748 },
+ { phrase: 'speed', value: 749 },
+ { phrase: 'suicide', value: 750 },
+ { phrase: 'travel', value: 751 },
+ { phrase: 'treat', value: 752 },
+ { phrase: 'vein', value: 753 },
+ { phrase: 'written', value: 754 },
+ { phrase: 'cage', value: 755 },
+ { phrase: 'chain', value: 756 },
+ { phrase: 'conversation', value: 757 },
+ { phrase: 'date', value: 758 },
+ { phrase: 'enemy', value: 759 },
+ { phrase: 'however', value: 760 },
+ { phrase: 'interest', value: 761 },
+ { phrase: 'million', value: 762 },
+ { phrase: 'page', value: 763 },
+ { phrase: 'pink', value: 764 },
+ { phrase: 'proud', value: 765 },
+ { phrase: 'sway', value: 766 },
+ { phrase: 'themselves', value: 767 },
+ { phrase: 'winter', value: 768 },
+ { phrase: 'church', value: 769 },
+ { phrase: 'cruel', value: 770 },
+ { phrase: 'cup', value: 771 },
+ { phrase: 'demon', value: 772 },
+ { phrase: 'experience', value: 773 },
+ { phrase: 'freedom', value: 774 },
+ { phrase: 'pair', value: 775 },
+ { phrase: 'pop', value: 776 },
+ { phrase: 'purpose', value: 777 },
+ { phrase: 'respect', value: 778 },
+ { phrase: 'shoot', value: 779 },
+ { phrase: 'softly', value: 780 },
+ { phrase: 'state', value: 781 },
+ { phrase: 'strange', value: 782 },
+ { phrase: 'bar', value: 783 },
+ { phrase: 'birth', value: 784 },
+ { phrase: 'curl', value: 785 },
+ { phrase: 'dirt', value: 786 },
+ { phrase: 'excuse', value: 787 },
+ { phrase: 'lord', value: 788 },
+ { phrase: 'lovely', value: 789 },
+ { phrase: 'monster', value: 790 },
+ { phrase: 'order', value: 791 },
+ { phrase: 'pack', value: 792 },
+ { phrase: 'pants', value: 793 },
+ { phrase: 'pool', value: 794 },
+ { phrase: 'scene', value: 795 },
+ { phrase: 'seven', value: 796 },
+ { phrase: 'shame', value: 797 },
+ { phrase: 'slide', value: 798 },
+ { phrase: 'ugly', value: 799 },
+ { phrase: 'among', value: 800 },
+ { phrase: 'blade', value: 801 },
+ { phrase: 'blonde', value: 802 },
+ { phrase: 'closet', value: 803 },
+ { phrase: 'creek', value: 804 },
+ { phrase: 'deny', value: 805 },
+ { phrase: 'drug', value: 806 },
+ { phrase: 'eternity', value: 807 },
+ { phrase: 'gain', value: 808 },
+ { phrase: 'grade', value: 809 },
+ { phrase: 'handle', value: 810 },
+ { phrase: 'key', value: 811 },
+ { phrase: 'linger', value: 812 },
+ { phrase: 'pale', value: 813 },
+ { phrase: 'prepare', value: 814 },
+ { phrase: 'swallow', value: 815 },
+ { phrase: 'swim', value: 816 },
+ { phrase: 'tremble', value: 817 },
+ { phrase: 'wheel', value: 818 },
+ { phrase: 'won', value: 819 },
+ { phrase: 'cast', value: 820 },
+ { phrase: 'cigarette', value: 821 },
+ { phrase: 'claim', value: 822 },
+ { phrase: 'college', value: 823 },
+ { phrase: 'direction', value: 824 },
+ { phrase: 'dirty', value: 825 },
+ { phrase: 'gather', value: 826 },
+ { phrase: 'ghost', value: 827 },
+ { phrase: 'hundred', value: 828 },
+ { phrase: 'loss', value: 829 },
+ { phrase: 'lung', value: 830 },
+ { phrase: 'orange', value: 831 },
+ { phrase: 'present', value: 832 },
+ { phrase: 'swear', value: 833 },
+ { phrase: 'swirl', value: 834 },
+ { phrase: 'twice', value: 835 },
+ { phrase: 'wild', value: 836 },
+ { phrase: 'bitter', value: 837 },
+ { phrase: 'blanket', value: 838 },
+ { phrase: 'doctor', value: 839 },
+ { phrase: 'everywhere', value: 840 },
+ { phrase: 'flash', value: 841 },
+ { phrase: 'grown', value: 842 },
+ { phrase: 'knowledge', value: 843 },
+ { phrase: 'numb', value: 844 },
+ { phrase: 'pressure', value: 845 },
+ { phrase: 'radio', value: 846 },
+ { phrase: 'repeat', value: 847 },
+ { phrase: 'ruin', value: 848 },
+ { phrase: 'spend', value: 849 },
+ { phrase: 'unknown', value: 850 },
+ { phrase: 'buy', value: 851 },
+ { phrase: 'clock', value: 852 },
+ { phrase: 'devil', value: 853 },
+ { phrase: 'early', value: 854 },
+ { phrase: 'false', value: 855 },
+ { phrase: 'fantasy', value: 856 },
+ { phrase: 'pound', value: 857 },
+ { phrase: 'precious', value: 858 },
+ { phrase: 'refuse', value: 859 },
+ { phrase: 'sheet', value: 860 },
+ { phrase: 'teeth', value: 861 },
+ { phrase: 'welcome', value: 862 },
+ { phrase: 'add', value: 863 },
+ { phrase: 'ahead', value: 864 },
+ { phrase: 'block', value: 865 },
+ { phrase: 'bury', value: 866 },
+ { phrase: 'caress', value: 867 },
+ { phrase: 'content', value: 868 },
+ { phrase: 'depth', value: 869 },
+ { phrase: 'despite', value: 870 },
+ { phrase: 'distant', value: 871 },
+ { phrase: 'marry', value: 872 },
+ { phrase: 'purple', value: 873 },
+ { phrase: 'threw', value: 874 },
+ { phrase: 'whenever', value: 875 },
+ { phrase: 'bomb', value: 876 },
+ { phrase: 'dull', value: 877 },
+ { phrase: 'easily', value: 878 },
+ { phrase: 'grasp', value: 879 },
+ { phrase: 'hospital', value: 880 },
+ { phrase: 'innocence', value: 881 },
+ { phrase: 'normal', value: 882 },
+ { phrase: 'receive', value: 883 },
+ { phrase: 'reply', value: 884 },
+ { phrase: 'rhyme', value: 885 },
+ { phrase: 'shade', value: 886 },
+ { phrase: 'someday', value: 887 },
+ { phrase: 'sword', value: 888 },
+ { phrase: 'toe', value: 889 },
+ { phrase: 'visit', value: 890 },
+ { phrase: 'asleep', value: 891 },
+ { phrase: 'bought', value: 892 },
+ { phrase: 'center', value: 893 },
+ { phrase: 'consider', value: 894 },
+ { phrase: 'flat', value: 895 },
+ { phrase: 'hero', value: 896 },
+ { phrase: 'history', value: 897 },
+ { phrase: 'ink', value: 898 },
+ { phrase: 'insane', value: 899 },
+ { phrase: 'muscle', value: 900 },
+ { phrase: 'mystery', value: 901 },
+ { phrase: 'pocket', value: 902 },
+ { phrase: 'reflection', value: 903 },
+ { phrase: 'shove', value: 904 },
+ { phrase: 'silently', value: 905 },
+ { phrase: 'smart', value: 906 },
+ { phrase: 'soldier', value: 907 },
+ { phrase: 'spot', value: 908 },
+ { phrase: 'stress', value: 909 },
+ { phrase: 'train', value: 910 },
+ { phrase: 'type', value: 911 },
+ { phrase: 'view', value: 912 },
+ { phrase: 'whether', value: 913 },
+ { phrase: 'bus', value: 914 },
+ { phrase: 'energy', value: 915 },
+ { phrase: 'explain', value: 916 },
+ { phrase: 'holy', value: 917 },
+ { phrase: 'hunger', value: 918 },
+ { phrase: 'inch', value: 919 },
+ { phrase: 'magic', value: 920 },
+ { phrase: 'mix', value: 921 },
+ { phrase: 'noise', value: 922 },
+ { phrase: 'nowhere', value: 923 },
+ { phrase: 'prayer', value: 924 },
+ { phrase: 'presence', value: 925 },
+ { phrase: 'shock', value: 926 },
+ { phrase: 'snap', value: 927 },
+ { phrase: 'spider', value: 928 },
+ { phrase: 'study', value: 929 },
+ { phrase: 'thunder', value: 930 },
+ { phrase: 'trail', value: 931 },
+ { phrase: 'admit', value: 932 },
+ { phrase: 'agree', value: 933 },
+ { phrase: 'bag', value: 934 },
+ { phrase: 'bang', value: 935 },
+ { phrase: 'bound', value: 936 },
+ { phrase: 'butterfly', value: 937 },
+ { phrase: 'cute', value: 938 },
+ { phrase: 'exactly', value: 939 },
+ { phrase: 'explode', value: 940 },
+ { phrase: 'familiar', value: 941 },
+ { phrase: 'fold', value: 942 },
+ { phrase: 'further', value: 943 },
+ { phrase: 'pierce', value: 944 },
+ { phrase: 'reflect', value: 945 },
+ { phrase: 'scent', value: 946 },
+ { phrase: 'selfish', value: 947 },
+ { phrase: 'sharp', value: 948 },
+ { phrase: 'sink', value: 949 },
+ { phrase: 'spring', value: 950 },
+ { phrase: 'stumble', value: 951 },
+ { phrase: 'universe', value: 952 },
+ { phrase: 'weep', value: 953 },
+ { phrase: 'women', value: 954 },
+ { phrase: 'wonderful', value: 955 },
+ { phrase: 'action', value: 956 },
+ { phrase: 'ancient', value: 957 },
+ { phrase: 'attempt', value: 958 },
+ { phrase: 'avoid', value: 959 },
+ { phrase: 'birthday', value: 960 },
+ { phrase: 'branch', value: 961 },
+ { phrase: 'chocolate', value: 962 },
+ { phrase: 'core', value: 963 },
+ { phrase: 'depress', value: 964 },
+ { phrase: 'drunk', value: 965 },
+ { phrase: 'especially', value: 966 },
+ { phrase: 'focus', value: 967 },
+ { phrase: 'fruit', value: 968 },
+ { phrase: 'honest', value: 969 },
+ { phrase: 'match', value: 970 },
+ { phrase: 'palm', value: 971 },
+ { phrase: 'perfectly', value: 972 },
+ { phrase: 'pillow', value: 973 },
+ { phrase: 'pity', value: 974 },
+ { phrase: 'poison', value: 975 },
+ { phrase: 'roar', value: 976 },
+ { phrase: 'shift', value: 977 },
+ { phrase: 'slightly', value: 978 },
+ { phrase: 'thump', value: 979 },
+ { phrase: 'truck', value: 980 },
+ { phrase: 'tune', value: 981 },
+ { phrase: 'twenty', value: 982 },
+ { phrase: 'unable', value: 983 },
+ { phrase: 'wipe', value: 984 },
+ { phrase: 'wrote', value: 985 },
+ { phrase: 'coat', value: 986 },
+ { phrase: 'constant', value: 987 },
+ { phrase: 'dinner', value: 988 },
+ { phrase: 'drove', value: 989 },
+ { phrase: 'egg', value: 990 },
+ { phrase: 'eternal', value: 991 },
+ { phrase: 'flight', value: 992 },
+ { phrase: 'flood', value: 993 },
+ { phrase: 'frame', value: 994 },
+ { phrase: 'freak', value: 995 },
+ { phrase: 'gasp', value: 996 },
+ { phrase: 'glad', value: 997 },
+ { phrase: 'hollow', value: 998 },
+ { phrase: 'motion', value: 999 },
+ { phrase: 'peer', value: 1000 },
+ { phrase: 'plastic', value: 1001 },
+ { phrase: 'root', value: 1002 },
+ { phrase: 'screen', value: 1003 },
+ { phrase: 'season', value: 1004 },
+ { phrase: 'sting', value: 1005 },
+ { phrase: 'strike', value: 1006 },
+ { phrase: 'team', value: 1007 },
+ { phrase: 'unlike', value: 1008 },
+ { phrase: 'victim', value: 1009 },
+ { phrase: 'volume', value: 1010 },
+ { phrase: 'warn', value: 1011 },
+ { phrase: 'weird', value: 1012 },
+ { phrase: 'attack', value: 1013 },
+ { phrase: 'await', value: 1014 },
+ { phrase: 'awake', value: 1015 },
+ { phrase: 'built', value: 1016 },
+ { phrase: 'charm', value: 1017 },
+ { phrase: 'crave', value: 1018 },
+ { phrase: 'despair', value: 1019 },
+ { phrase: 'fought', value: 1020 },
+ { phrase: 'grant', value: 1021 },
+ { phrase: 'grief', value: 1022 },
+ { phrase: 'horse', value: 1023 },
+ { phrase: 'limit', value: 1024 },
+ { phrase: 'message', value: 1025 },
+ { phrase: 'ripple', value: 1026 },
+ { phrase: 'sanity', value: 1027 },
+ { phrase: 'scatter', value: 1028 },
+ { phrase: 'serve', value: 1029 },
+ { phrase: 'split', value: 1030 },
+ { phrase: 'string', value: 1031 },
+ { phrase: 'trick', value: 1032 },
+ { phrase: 'annoy', value: 1033 },
+ { phrase: 'blur', value: 1034 },
+ { phrase: 'boat', value: 1035 },
+ { phrase: 'brave', value: 1036 },
+ { phrase: 'clearly', value: 1037 },
+ { phrase: 'cling', value: 1038 },
+ { phrase: 'connect', value: 1039 },
+ { phrase: 'fist', value: 1040 },
+ { phrase: 'forth', value: 1041 },
+ { phrase: 'imagination', value: 1042 },
+ { phrase: 'iron', value: 1043 },
+ { phrase: 'jock', value: 1044 },
+ { phrase: 'judge', value: 1045 },
+ { phrase: 'lesson', value: 1046 },
+ { phrase: 'milk', value: 1047 },
+ { phrase: 'misery', value: 1048 },
+ { phrase: 'nail', value: 1049 },
+ { phrase: 'naked', value: 1050 },
+ { phrase: 'ourselves', value: 1051 },
+ { phrase: 'poet', value: 1052 },
+ { phrase: 'possible', value: 1053 },
+ { phrase: 'princess', value: 1054 },
+ { phrase: 'sail', value: 1055 },
+ { phrase: 'size', value: 1056 },
+ { phrase: 'snake', value: 1057 },
+ { phrase: 'society', value: 1058 },
+ { phrase: 'stroke', value: 1059 },
+ { phrase: 'torture', value: 1060 },
+ { phrase: 'toss', value: 1061 },
+ { phrase: 'trace', value: 1062 },
+ { phrase: 'wise', value: 1063 },
+ { phrase: 'bloom', value: 1064 },
+ { phrase: 'bullet', value: 1065 },
+ { phrase: 'cell', value: 1066 },
+ { phrase: 'check', value: 1067 },
+ { phrase: 'cost', value: 1068 },
+ { phrase: 'darling', value: 1069 },
+ { phrase: 'during', value: 1070 },
+ { phrase: 'footstep', value: 1071 },
+ { phrase: 'fragile', value: 1072 },
+ { phrase: 'hallway', value: 1073 },
+ { phrase: 'hardly', value: 1074 },
+ { phrase: 'horizon', value: 1075 },
+ { phrase: 'invisible', value: 1076 },
+ { phrase: 'journey', value: 1077 },
+ { phrase: 'midnight', value: 1078 },
+ { phrase: 'mud', value: 1079 },
+ { phrase: 'nod', value: 1080 },
+ { phrase: 'pause', value: 1081 },
+ { phrase: 'relax', value: 1082 },
+ { phrase: 'shiver', value: 1083 },
+ { phrase: 'sudden', value: 1084 },
+ { phrase: 'value', value: 1085 },
+ { phrase: 'youth', value: 1086 },
+ { phrase: 'abuse', value: 1087 },
+ { phrase: 'admire', value: 1088 },
+ { phrase: 'blink', value: 1089 },
+ { phrase: 'breast', value: 1090 },
+ { phrase: 'bruise', value: 1091 },
+ { phrase: 'constantly', value: 1092 },
+ { phrase: 'couple', value: 1093 },
+ { phrase: 'creep', value: 1094 },
+ { phrase: 'curve', value: 1095 },
+ { phrase: 'difference', value: 1096 },
+ { phrase: 'dumb', value: 1097 },
+ { phrase: 'emptiness', value: 1098 },
+ { phrase: 'gotta', value: 1099 },
+ { phrase: 'honor', value: 1100 },
+ { phrase: 'plain', value: 1101 },
+ { phrase: 'planet', value: 1102 },
+ { phrase: 'recall', value: 1103 },
+ { phrase: 'rub', value: 1104 },
+ { phrase: 'ship', value: 1105 },
+ { phrase: 'slam', value: 1106 },
+ { phrase: 'soar', value: 1107 },
+ { phrase: 'somebody', value: 1108 },
+ { phrase: 'tightly', value: 1109 },
+ { phrase: 'weather', value: 1110 },
+ { phrase: 'adore', value: 1111 },
+ { phrase: 'approach', value: 1112 },
+ { phrase: 'bond', value: 1113 },
+ { phrase: 'bread', value: 1114 },
+ { phrase: 'burst', value: 1115 },
+ { phrase: 'candle', value: 1116 },
+ { phrase: 'coffee', value: 1117 },
+ { phrase: 'cousin', value: 1118 },
+ { phrase: 'crime', value: 1119 },
+ { phrase: 'desert', value: 1120 },
+ { phrase: 'flutter', value: 1121 },
+ { phrase: 'frozen', value: 1122 },
+ { phrase: 'grand', value: 1123 },
+ { phrase: 'heel', value: 1124 },
+ { phrase: 'hello', value: 1125 },
+ { phrase: 'language', value: 1126 },
+ { phrase: 'level', value: 1127 },
+ { phrase: 'movement', value: 1128 },
+ { phrase: 'pleasure', value: 1129 },
+ { phrase: 'powerful', value: 1130 },
+ { phrase: 'random', value: 1131 },
+ { phrase: 'rhythm', value: 1132 },
+ { phrase: 'settle', value: 1133 },
+ { phrase: 'silly', value: 1134 },
+ { phrase: 'slap', value: 1135 },
+ { phrase: 'sort', value: 1136 },
+ { phrase: 'spoken', value: 1137 },
+ { phrase: 'steel', value: 1138 },
+ { phrase: 'threaten', value: 1139 },
+ { phrase: 'tumble', value: 1140 },
+ { phrase: 'upset', value: 1141 },
+ { phrase: 'aside', value: 1142 },
+ { phrase: 'awkward', value: 1143 },
+ { phrase: 'bee', value: 1144 },
+ { phrase: 'blank', value: 1145 },
+ { phrase: 'board', value: 1146 },
+ { phrase: 'button', value: 1147 },
+ { phrase: 'card', value: 1148 },
+ { phrase: 'carefully', value: 1149 },
+ { phrase: 'complain', value: 1150 },
+ { phrase: 'crap', value: 1151 },
+ { phrase: 'deeply', value: 1152 },
+ { phrase: 'discover', value: 1153 },
+ { phrase: 'drag', value: 1154 },
+ { phrase: 'dread', value: 1155 },
+ { phrase: 'effort', value: 1156 },
+ { phrase: 'entire', value: 1157 },
+ { phrase: 'fairy', value: 1158 },
+ { phrase: 'giant', value: 1159 },
+ { phrase: 'gotten', value: 1160 },
+ { phrase: 'greet', value: 1161 },
+ { phrase: 'illusion', value: 1162 },
+ { phrase: 'jeans', value: 1163 },
+ { phrase: 'leap', value: 1164 },
+ { phrase: 'liquid', value: 1165 },
+ { phrase: 'march', value: 1166 },
+ { phrase: 'mend', value: 1167 },
+ { phrase: 'nervous', value: 1168 },
+ { phrase: 'nine', value: 1169 },
+ { phrase: 'replace', value: 1170 },
+ { phrase: 'rope', value: 1171 },
+ { phrase: 'spine', value: 1172 },
+ { phrase: 'stole', value: 1173 },
+ { phrase: 'terror', value: 1174 },
+ { phrase: 'accident', value: 1175 },
+ { phrase: 'apple', value: 1176 },
+ { phrase: 'balance', value: 1177 },
+ { phrase: 'boom', value: 1178 },
+ { phrase: 'childhood', value: 1179 },
+ { phrase: 'collect', value: 1180 },
+ { phrase: 'demand', value: 1181 },
+ { phrase: 'depression', value: 1182 },
+ { phrase: 'eventually', value: 1183 },
+ { phrase: 'faint', value: 1184 },
+ { phrase: 'glare', value: 1185 },
+ { phrase: 'goal', value: 1186 },
+ { phrase: 'group', value: 1187 },
+ { phrase: 'honey', value: 1188 },
+ { phrase: 'kitchen', value: 1189 },
+ { phrase: 'laid', value: 1190 },
+ { phrase: 'limb', value: 1191 },
+ { phrase: 'machine', value: 1192 },
+ { phrase: 'mere', value: 1193 },
+ { phrase: 'mold', value: 1194 },
+ { phrase: 'murder', value: 1195 },
+ { phrase: 'nerve', value: 1196 },
+ { phrase: 'painful', value: 1197 },
+ { phrase: 'poetry', value: 1198 },
+ { phrase: 'prince', value: 1199 },
+ { phrase: 'rabbit', value: 1200 },
+ { phrase: 'shelter', value: 1201 },
+ { phrase: 'shore', value: 1202 },
+ { phrase: 'shower', value: 1203 },
+ { phrase: 'soothe', value: 1204 },
+ { phrase: 'stair', value: 1205 },
+ { phrase: 'steady', value: 1206 },
+ { phrase: 'sunlight', value: 1207 },
+ { phrase: 'tangle', value: 1208 },
+ { phrase: 'tease', value: 1209 },
+ { phrase: 'treasure', value: 1210 },
+ { phrase: 'uncle', value: 1211 },
+ { phrase: 'begun', value: 1212 },
+ { phrase: 'bliss', value: 1213 },
+ { phrase: 'canvas', value: 1214 },
+ { phrase: 'cheer', value: 1215 },
+ { phrase: 'claw', value: 1216 },
+ { phrase: 'clutch', value: 1217 },
+ { phrase: 'commit', value: 1218 },
+ { phrase: 'crimson', value: 1219 },
+ { phrase: 'crystal', value: 1220 },
+ { phrase: 'delight', value: 1221 },
+ { phrase: 'doll', value: 1222 },
+ { phrase: 'existence', value: 1223 },
+ { phrase: 'express', value: 1224 },
+ { phrase: 'fog', value: 1225 },
+ { phrase: 'football', value: 1226 },
+ { phrase: 'gay', value: 1227 },
+ { phrase: 'goose', value: 1228 },
+ { phrase: 'guard', value: 1229 },
+ { phrase: 'hatred', value: 1230 },
+ { phrase: 'illuminate', value: 1231 },
+ { phrase: 'mass', value: 1232 },
+ { phrase: 'math', value: 1233 },
+ { phrase: 'mourn', value: 1234 },
+ { phrase: 'rich', value: 1235 },
+ { phrase: 'rough', value: 1236 },
+ { phrase: 'skip', value: 1237 },
+ { phrase: 'stir', value: 1238 },
+ { phrase: 'student', value: 1239 },
+ { phrase: 'style', value: 1240 },
+ { phrase: 'support', value: 1241 },
+ { phrase: 'thorn', value: 1242 },
+ { phrase: 'tough', value: 1243 },
+ { phrase: 'yard', value: 1244 },
+ { phrase: 'yearn', value: 1245 },
+ { phrase: 'yesterday', value: 1246 },
+ { phrase: 'advice', value: 1247 },
+ { phrase: 'appreciate', value: 1248 },
+ { phrase: 'autumn', value: 1249 },
+ { phrase: 'bank', value: 1250 },
+ { phrase: 'beam', value: 1251 },
+ { phrase: 'bowl', value: 1252 },
+ { phrase: 'capture', value: 1253 },
+ { phrase: 'carve', value: 1254 },
+ { phrase: 'collapse', value: 1255 },
+ { phrase: 'confusion', value: 1256 },
+ { phrase: 'creation', value: 1257 },
+ { phrase: 'dove', value: 1258 },
+ { phrase: 'feather', value: 1259 },
+ { phrase: 'girlfriend', value: 1260 },
+ { phrase: 'glory', value: 1261 },
+ { phrase: 'government', value: 1262 },
+ { phrase: 'harsh', value: 1263 },
+ { phrase: 'hop', value: 1264 },
+ { phrase: 'inner', value: 1265 },
+ { phrase: 'loser', value: 1266 },
+ { phrase: 'moonlight', value: 1267 },
+ { phrase: 'neighbor', value: 1268 },
+ { phrase: 'neither', value: 1269 },
+ { phrase: 'peach', value: 1270 },
+ { phrase: 'pig', value: 1271 },
+ { phrase: 'praise', value: 1272 },
+ { phrase: 'screw', value: 1273 },
+ { phrase: 'shield', value: 1274 },
+ { phrase: 'shimmer', value: 1275 },
+ { phrase: 'sneak', value: 1276 },
+ { phrase: 'stab', value: 1277 },
+ { phrase: 'subject', value: 1278 },
+ { phrase: 'throughout', value: 1279 },
+ { phrase: 'thrown', value: 1280 },
+ { phrase: 'tower', value: 1281 },
+ { phrase: 'twirl', value: 1282 },
+ { phrase: 'wow', value: 1283 },
+ { phrase: 'army', value: 1284 },
+ { phrase: 'arrive', value: 1285 },
+ { phrase: 'bathroom', value: 1286 },
+ { phrase: 'bump', value: 1287 },
+ { phrase: 'cease', value: 1288 },
+ { phrase: 'cookie', value: 1289 },
+ { phrase: 'couch', value: 1290 },
+ { phrase: 'courage', value: 1291 },
+ { phrase: 'dim', value: 1292 },
+ { phrase: 'guilt', value: 1293 },
+ { phrase: 'howl', value: 1294 },
+ { phrase: 'hum', value: 1295 },
+ { phrase: 'husband', value: 1296 },
+ { phrase: 'insult', value: 1297 },
+ { phrase: 'led', value: 1298 },
+ { phrase: 'lunch', value: 1299 },
+ { phrase: 'mock', value: 1300 },
+ { phrase: 'mostly', value: 1301 },
+ { phrase: 'natural', value: 1302 },
+ { phrase: 'nearly', value: 1303 },
+ { phrase: 'needle', value: 1304 },
+ { phrase: 'nerd', value: 1305 },
+ { phrase: 'peaceful', value: 1306 },
+ { phrase: 'perfection', value: 1307 },
+ { phrase: 'pile', value: 1308 },
+ { phrase: 'price', value: 1309 },
+ { phrase: 'remove', value: 1310 },
+ { phrase: 'roam', value: 1311 },
+ { phrase: 'sanctuary', value: 1312 },
+ { phrase: 'serious', value: 1313 },
+ { phrase: 'shiny', value: 1314 },
+ { phrase: 'shook', value: 1315 },
+ { phrase: 'sob', value: 1316 },
+ { phrase: 'stolen', value: 1317 },
+ { phrase: 'tap', value: 1318 },
+ { phrase: 'vain', value: 1319 },
+ { phrase: 'void', value: 1320 },
+ { phrase: 'warrior', value: 1321 },
+ { phrase: 'wrinkle', value: 1322 },
+ { phrase: 'affection', value: 1323 },
+ { phrase: 'apologize', value: 1324 },
+ { phrase: 'blossom', value: 1325 },
+ { phrase: 'bounce', value: 1326 },
+ { phrase: 'bridge', value: 1327 },
+ { phrase: 'cheap', value: 1328 },
+ { phrase: 'crumble', value: 1329 },
+ { phrase: 'decision', value: 1330 },
+ { phrase: 'descend', value: 1331 },
+ { phrase: 'desperately', value: 1332 },
+ { phrase: 'dig', value: 1333 },
+ { phrase: 'dot', value: 1334 },
+ { phrase: 'flip', value: 1335 },
+ { phrase: 'frighten', value: 1336 },
+ { phrase: 'heartbeat', value: 1337 },
+ { phrase: 'huge', value: 1338 },
+ { phrase: 'lazy', value: 1339 },
+ { phrase: 'lick', value: 1340 },
+ { phrase: 'odd', value: 1341 },
+ { phrase: 'opinion', value: 1342 },
+ { phrase: 'process', value: 1343 },
+ { phrase: 'puzzle', value: 1344 },
+ { phrase: 'quietly', value: 1345 },
+ { phrase: 'retreat', value: 1346 },
+ { phrase: 'score', value: 1347 },
+ { phrase: 'sentence', value: 1348 },
+ { phrase: 'separate', value: 1349 },
+ { phrase: 'situation', value: 1350 },
+ { phrase: 'skill', value: 1351 },
+ { phrase: 'soak', value: 1352 },
+ { phrase: 'square', value: 1353 },
+ { phrase: 'stray', value: 1354 },
+ { phrase: 'taint', value: 1355 },
+ { phrase: 'task', value: 1356 },
+ { phrase: 'tide', value: 1357 },
+ { phrase: 'underneath', value: 1358 },
+ { phrase: 'veil', value: 1359 },
+ { phrase: 'whistle', value: 1360 },
+ { phrase: 'anywhere', value: 1361 },
+ { phrase: 'bedroom', value: 1362 },
+ { phrase: 'bid', value: 1363 },
+ { phrase: 'bloody', value: 1364 },
+ { phrase: 'burden', value: 1365 },
+ { phrase: 'careful', value: 1366 },
+ { phrase: 'compare', value: 1367 },
+ { phrase: 'concern', value: 1368 },
+ { phrase: 'curtain', value: 1369 },
+ { phrase: 'decay', value: 1370 },
+ { phrase: 'defeat', value: 1371 },
+ { phrase: 'describe', value: 1372 },
+ { phrase: 'double', value: 1373 },
+ { phrase: 'dreamer', value: 1374 },
+ { phrase: 'driver', value: 1375 },
+ { phrase: 'dwell', value: 1376 },
+ { phrase: 'evening', value: 1377 },
+ { phrase: 'flare', value: 1378 },
+ { phrase: 'flicker', value: 1379 },
+ { phrase: 'grandma', value: 1380 },
+ { phrase: 'guitar', value: 1381 },
+ { phrase: 'harm', value: 1382 },
+ { phrase: 'horrible', value: 1383 },
+ { phrase: 'hungry', value: 1384 },
+ { phrase: 'indeed', value: 1385 },
+ { phrase: 'lace', value: 1386 },
+ { phrase: 'melody', value: 1387 },
+ { phrase: 'monkey', value: 1388 },
+ { phrase: 'nation', value: 1389 },
+ { phrase: 'object', value: 1390 },
+ { phrase: 'obviously', value: 1391 },
+ { phrase: 'rainbow', value: 1392 },
+ { phrase: 'salt', value: 1393 },
+ { phrase: 'scratch', value: 1394 },
+ { phrase: 'shown', value: 1395 },
+ { phrase: 'shy', value: 1396 },
+ { phrase: 'stage', value: 1397 },
+ { phrase: 'stun', value: 1398 },
+ { phrase: 'third', value: 1399 },
+ { phrase: 'tickle', value: 1400 },
+ { phrase: 'useless', value: 1401 },
+ { phrase: 'weakness', value: 1402 },
+ { phrase: 'worship', value: 1403 },
+ { phrase: 'worthless', value: 1404 },
+ { phrase: 'afternoon', value: 1405 },
+ { phrase: 'beard', value: 1406 },
+ { phrase: 'boyfriend', value: 1407 },
+ { phrase: 'bubble', value: 1408 },
+ { phrase: 'busy', value: 1409 },
+ { phrase: 'certain', value: 1410 },
+ { phrase: 'chin', value: 1411 },
+ { phrase: 'concrete', value: 1412 },
+ { phrase: 'desk', value: 1413 },
+ { phrase: 'diamond', value: 1414 },
+ { phrase: 'doom', value: 1415 },
+ { phrase: 'drawn', value: 1416 },
+ { phrase: 'due', value: 1417 },
+ { phrase: 'felicity', value: 1418 },
+ { phrase: 'freeze', value: 1419 },
+ { phrase: 'frost', value: 1420 },
+ { phrase: 'garden', value: 1421 },
+ { phrase: 'glide', value: 1422 },
+ { phrase: 'harmony', value: 1423 },
+ { phrase: 'hopefully', value: 1424 },
+ { phrase: 'hunt', value: 1425 },
+ { phrase: 'jealous', value: 1426 },
+ { phrase: 'lightning', value: 1427 },
+ { phrase: 'mama', value: 1428 },
+ { phrase: 'mercy', value: 1429 },
+ { phrase: 'peel', value: 1430 },
+ { phrase: 'physical', value: 1431 },
+ { phrase: 'position', value: 1432 },
+ { phrase: 'pulse', value: 1433 },
+ { phrase: 'punch', value: 1434 },
+ { phrase: 'quit', value: 1435 },
+ { phrase: 'rant', value: 1436 },
+ { phrase: 'respond', value: 1437 },
+ { phrase: 'salty', value: 1438 },
+ { phrase: 'sane', value: 1439 },
+ { phrase: 'satisfy', value: 1440 },
+ { phrase: 'savior', value: 1441 },
+ { phrase: 'sheep', value: 1442 },
+ { phrase: 'slept', value: 1443 },
+ { phrase: 'social', value: 1444 },
+ { phrase: 'sport', value: 1445 },
+ { phrase: 'tuck', value: 1446 },
+ { phrase: 'utter', value: 1447 },
+ { phrase: 'valley', value: 1448 },
+ { phrase: 'wolf', value: 1449 },
+ { phrase: 'aim', value: 1450 },
+ { phrase: 'alas', value: 1451 },
+ { phrase: 'alter', value: 1452 },
+ { phrase: 'arrow', value: 1453 },
+ { phrase: 'awaken', value: 1454 },
+ { phrase: 'beaten', value: 1455 },
+ { phrase: 'belief', value: 1456 },
+ { phrase: 'brand', value: 1457 },
+ { phrase: 'ceiling', value: 1458 },
+ { phrase: 'cheese', value: 1459 },
+ { phrase: 'clue', value: 1460 },
+ { phrase: 'confidence', value: 1461 },
+ { phrase: 'connection', value: 1462 },
+ { phrase: 'daily', value: 1463 },
+ { phrase: 'disguise', value: 1464 },
+ { phrase: 'eager', value: 1465 },
+ { phrase: 'erase', value: 1466 },
+ { phrase: 'essence', value: 1467 },
+ { phrase: 'everytime', value: 1468 },
+ { phrase: 'expression', value: 1469 },
+ { phrase: 'fan', value: 1470 },
+ { phrase: 'flag', value: 1471 },
+ { phrase: 'flirt', value: 1472 },
+ { phrase: 'foul', value: 1473 },
+ { phrase: 'fur', value: 1474 },
+ { phrase: 'giggle', value: 1475 },
+ { phrase: 'glorious', value: 1476 },
+ { phrase: 'ignorance', value: 1477 },
+ { phrase: 'law', value: 1478 },
+ { phrase: 'lifeless', value: 1479 },
+ { phrase: 'measure', value: 1480 },
+ { phrase: 'mighty', value: 1481 },
+ { phrase: 'muse', value: 1482 },
+ { phrase: 'north', value: 1483 },
+ { phrase: 'opposite', value: 1484 },
+ { phrase: 'paradise', value: 1485 },
+ { phrase: 'patience', value: 1486 },
+ { phrase: 'patient', value: 1487 },
+ { phrase: 'pencil', value: 1488 },
+ { phrase: 'petal', value: 1489 },
+ { phrase: 'plate', value: 1490 },
+ { phrase: 'ponder', value: 1491 },
+ { phrase: 'possibly', value: 1492 },
+ { phrase: 'practice', value: 1493 },
+ { phrase: 'slice', value: 1494 },
+ { phrase: 'spell', value: 1495 },
+ { phrase: 'stock', value: 1496 },
+ { phrase: 'strife', value: 1497 },
+ { phrase: 'strip', value: 1498 },
+ { phrase: 'suffocate', value: 1499 },
+ { phrase: 'suit', value: 1500 },
+ { phrase: 'tender', value: 1501 },
+ { phrase: 'tool', value: 1502 },
+ { phrase: 'trade', value: 1503 },
+ { phrase: 'velvet', value: 1504 },
+ { phrase: 'verse', value: 1505 },
+ { phrase: 'waist', value: 1506 },
+ { phrase: 'witch', value: 1507 },
+ { phrase: 'aunt', value: 1508 },
+ { phrase: 'bench', value: 1509 },
+ { phrase: 'bold', value: 1510 },
+ { phrase: 'cap', value: 1511 },
+ { phrase: 'certainly', value: 1512 },
+ { phrase: 'click', value: 1513 },
+ { phrase: 'companion', value: 1514 },
+ { phrase: 'creator', value: 1515 },
+ { phrase: 'dart', value: 1516 },
+ { phrase: 'delicate', value: 1517 },
+ { phrase: 'determine', value: 1518 },
+ { phrase: 'dish', value: 1519 },
+ { phrase: 'dragon', value: 1520 },
+ { phrase: 'drama', value: 1521 },
+ { phrase: 'drum', value: 1522 },
+ { phrase: 'dude', value: 1523 },
+ { phrase: 'everybody', value: 1524 },
+ { phrase: 'feast', value: 1525 },
+ { phrase: 'forehead', value: 1526 },
+ { phrase: 'former', value: 1527 },
+ { phrase: 'fright', value: 1528 },
+ { phrase: 'fully', value: 1529 },
+ { phrase: 'gas', value: 1530 },
+ { phrase: 'hook', value: 1531 },
+ { phrase: 'hurl', value: 1532 },
+ { phrase: 'invite', value: 1533 },
+ { phrase: 'juice', value: 1534 },
+ { phrase: 'manage', value: 1535 },
+ { phrase: 'moral', value: 1536 },
+ { phrase: 'possess', value: 1537 },
+ { phrase: 'raw', value: 1538 },
+ { phrase: 'rebel', value: 1539 },
+ { phrase: 'royal', value: 1540 },
+ { phrase: 'scale', value: 1541 },
+ { phrase: 'scary', value: 1542 },
+ { phrase: 'several', value: 1543 },
+ { phrase: 'slight', value: 1544 },
+ { phrase: 'stubborn', value: 1545 },
+ { phrase: 'swell', value: 1546 },
+ { phrase: 'talent', value: 1547 },
+ { phrase: 'tea', value: 1548 },
+ { phrase: 'terrible', value: 1549 },
+ { phrase: 'thread', value: 1550 },
+ { phrase: 'torment', value: 1551 },
+ { phrase: 'trickle', value: 1552 },
+ { phrase: 'usually', value: 1553 },
+ { phrase: 'vast', value: 1554 },
+ { phrase: 'violence', value: 1555 },
+ { phrase: 'weave', value: 1556 },
+ { phrase: 'acid', value: 1557 },
+ { phrase: 'agony', value: 1558 },
+ { phrase: 'ashamed', value: 1559 },
+ { phrase: 'awe', value: 1560 },
+ { phrase: 'belly', value: 1561 },
+ { phrase: 'blend', value: 1562 },
+ { phrase: 'blush', value: 1563 },
+ { phrase: 'character', value: 1564 },
+ { phrase: 'cheat', value: 1565 },
+ { phrase: 'common', value: 1566 },
+ { phrase: 'company', value: 1567 },
+ { phrase: 'coward', value: 1568 },
+ { phrase: 'creak', value: 1569 },
+ { phrase: 'danger', value: 1570 },
+ { phrase: 'deadly', value: 1571 },
+ { phrase: 'defense', value: 1572 },
+ { phrase: 'define', value: 1573 },
+ { phrase: 'depend', value: 1574 },
+ { phrase: 'desperate', value: 1575 },
+ { phrase: 'destination', value: 1576 },
+ { phrase: 'dew', value: 1577 },
+ { phrase: 'duck', value: 1578 },
+ { phrase: 'dusty', value: 1579 },
+ { phrase: 'embarrass', value: 1580 },
+ { phrase: 'engine', value: 1581 },
+ { phrase: 'example', value: 1582 },
+ { phrase: 'explore', value: 1583 },
+ { phrase: 'foe', value: 1584 },
+ { phrase: 'freely', value: 1585 },
+ { phrase: 'frustrate', value: 1586 },
+ { phrase: 'generation', value: 1587 },
+ { phrase: 'glove', value: 1588 },
+ { phrase: 'guilty', value: 1589 },
+ { phrase: 'health', value: 1590 },
+ { phrase: 'hurry', value: 1591 },
+ { phrase: 'idiot', value: 1592 },
+ { phrase: 'impossible', value: 1593 },
+ { phrase: 'inhale', value: 1594 },
+ { phrase: 'jaw', value: 1595 },
+ { phrase: 'kingdom', value: 1596 },
+ { phrase: 'mention', value: 1597 },
+ { phrase: 'mist', value: 1598 },
+ { phrase: 'moan', value: 1599 },
+ { phrase: 'mumble', value: 1600 },
+ { phrase: 'mutter', value: 1601 },
+ { phrase: 'observe', value: 1602 },
+ { phrase: 'ode', value: 1603 },
+ { phrase: 'pathetic', value: 1604 },
+ { phrase: 'pattern', value: 1605 },
+ { phrase: 'pie', value: 1606 },
+ { phrase: 'prefer', value: 1607 },
+ { phrase: 'puff', value: 1608 },
+ { phrase: 'rape', value: 1609 },
+ { phrase: 'rare', value: 1610 },
+ { phrase: 'revenge', value: 1611 },
+ { phrase: 'rude', value: 1612 },
+ { phrase: 'scrape', value: 1613 },
+ { phrase: 'spiral', value: 1614 },
+ { phrase: 'squeeze', value: 1615 },
+ { phrase: 'strain', value: 1616 },
+ { phrase: 'sunset', value: 1617 },
+ { phrase: 'suspend', value: 1618 },
+ { phrase: 'sympathy', value: 1619 },
+ { phrase: 'thigh', value: 1620 },
+ { phrase: 'throne', value: 1621 },
+ { phrase: 'total', value: 1622 },
+ { phrase: 'unseen', value: 1623 },
+ { phrase: 'weapon', value: 1624 },
+ { phrase: 'weary', value: 1625 },
+];
diff --git a/src/mnemonic/index.ts b/src/mnemonic/index.ts
new file mode 100644
index 0000000..6a3ace4
--- /dev/null
+++ b/src/mnemonic/index.ts
@@ -0,0 +1,4 @@
+export { mnemonicToSeed } from './mnemonic-to-seed';
+export { MnemonicToSeedResult } from './types';
+export { seedToMnemonic } from './seed-to-mnemonic';
+export { SeedToMnemonicResult } from './types';
diff --git a/src/mnemonic/mnemonic-to-seed.ts b/src/mnemonic/mnemonic-to-seed.ts
new file mode 100644
index 0000000..b21e56b
--- /dev/null
+++ b/src/mnemonic/mnemonic-to-seed.ts
@@ -0,0 +1,87 @@
+import { phrases } from './consts/phrases';
+import { MnemonicToSeedResult } from './types';
+import { keysFromDefault } from '../core/crypto';
+
+export const NUMWORDS = 1626;
+
+const wordsMap: Map = new Map(phrases.map(item => [item.phrase, item.value]));
+
+const SEED_PHRASE_V1_WORDS_COUNT = 25;
+const SEED_PHRASE_V2_WORDS_COUNT = 26;
+const BINARY_SIZE_SEED = 32;
+
+/**
+ * Converts a mnemonic seed phrase (25 or 26 words) into a secret spend key.
+ *
+ * The last one or two words of the phrase represent metadata:
+ * - If 25 words: the 25th word is the creation timestamp.
+ * - If 26 words: the 25th word is the timestamp, the 26th is a checksum + audit flag.
+ *
+ * @param seedPhraseRaw - Raw seed phrase string (mnemonic) containing 25 or 26 words.
+ * @returns The secret spend key as a hex string, or `false` if parsing failed.
+ */
+export function mnemonicToSeed(seedPhraseRaw: string): MnemonicToSeedResult {
+ const seedPhrase: string = seedPhraseRaw.trim();
+ const words: string[] = seedPhrase.split(/\s+/);
+
+ let keysSeedText: string;
+ let timestampWord: string;
+
+ if (words.length === SEED_PHRASE_V1_WORDS_COUNT) {
+ timestampWord = words.pop()!;
+ keysSeedText = words.join(' ');
+ } else if (words.length === SEED_PHRASE_V2_WORDS_COUNT) {
+ words.pop(); // drop audit+checksum
+ timestampWord = words.pop()!;
+ keysSeedText = words.join(' ');
+ } else {
+ console.error('Invalid seed phrase word count:', words.length);
+ return false;
+ }
+
+ let keysSeedBinary: Buffer;
+ try {
+ keysSeedBinary = text2binary(keysSeedText);
+ } catch (error) {
+ console.error('Failed to convert seed text to binary:', error);
+ return false;
+ }
+
+ if (!keysSeedBinary.length) {
+ console.error('Empty binary seed after conversion');
+ return false;
+ }
+
+ const { secretSpendKey } = keysFromDefault(keysSeedBinary, BINARY_SIZE_SEED);
+ return secretSpendKey;
+}
+
+function text2binary(text: string): Buffer {
+ const tokens: string[] = text.trim().split(/\s+/);
+
+ if (tokens.length % 3 !== 0) {
+ throw new Error('Invalid word count in mnemonic text');
+ }
+
+ const res: Buffer = Buffer.alloc((tokens.length / 3) * 4);
+
+ for (let i = 0; i < tokens.length / 3; i++) {
+ const w1: number = wordsMap.get(tokens[i * 3]);
+ const w2: number = wordsMap.get(tokens[i * 3 + 1]);
+ const w3: number = wordsMap.get(tokens[i * 3 + 2]);
+
+ if (w1 === undefined || w2 === undefined || w3 === undefined) {
+ throw new Error('Invalid word in mnemonic text');
+ }
+
+ const val: number = w1 + NUMWORDS * (((NUMWORDS - w1) + w2) % NUMWORDS) + NUMWORDS * NUMWORDS * (((NUMWORDS - w2) + w3) % NUMWORDS);
+
+ const byteIndex: number = i * 4;
+ res[byteIndex] = val & 0xFF;
+ res[byteIndex + 1] = (val >> 8) & 0xFF;
+ res[byteIndex + 2] = (val >> 16) & 0xFF;
+ res[byteIndex + 3] = (val >> 24) & 0xFF;
+ }
+
+ return res;
+}
diff --git a/src/mnemonic/seed-to-mnemonic.ts b/src/mnemonic/seed-to-mnemonic.ts
new file mode 100644
index 0000000..8428a83
--- /dev/null
+++ b/src/mnemonic/seed-to-mnemonic.ts
@@ -0,0 +1,100 @@
+import { phrases } from './consts/phrases';
+import { NUMWORDS } from './mnemonic-to-seed';
+import type { SeedToMnemonicResult } from './types';
+import { fastHash } from '../core/crypto';
+
+export const wordsArray: string[] = phrases.map(p => p.phrase);
+
+const WALLET_BRAIN_DATE_OFFSET = 1543622400;
+const WALLET_BRAIN_DATE_QUANTUM = 604800;
+const WALLET_BRAIN_DATE_MAX_WEEKS_COUNT = 800;
+const CHECKSUM_MAX = NUMWORDS >> 1;
+
+export function seedToMnemonic(keysSeedHex: string): SeedToMnemonicResult {
+ if (!keysSeedHex) {
+ throw new Error('Invalid seed hex');
+ }
+
+ const keysSeedBinary: Buffer = Buffer.from(keysSeedHex, 'hex');
+ const mnemonic: string = binaryToText(keysSeedBinary);
+
+ const timestamp: number = Math.floor(Date.now() / 1000);
+ const creationTimestampWord: string = getWordFromTimestamp(timestamp, false);
+
+ const timestampFromWord: number = getTimestampFromWord(creationTimestampWord, false);
+
+ const hashWithTimestamp: Buffer = Buffer.from(fastHash(keysSeedBinary));
+ hashWithTimestamp.writeBigUInt64LE(BigInt(timestampFromWord), 0);
+
+ const checksumHash: Buffer = fastHash(hashWithTimestamp);
+ const checksumValue: number = Number(checksumHash.readBigUInt64LE(0) % BigInt(CHECKSUM_MAX + 1)) || 0;
+
+ const auditableFlag = 0;
+ const checksumWord: string = wordByNum((checksumValue << 1) | (auditableFlag & 1));
+
+ return `${mnemonic} ${creationTimestampWord} ${checksumWord}`;
+}
+
+function wordByNum(index: number): string {
+ return phrases[index]?.phrase ?? '';
+}
+
+function numByWord(word: string): number {
+ const entry = phrases.find(p => p.phrase === word);
+ if (!entry) {
+ throw new Error(`Unable to find word "${word}" in mnemonic dictionary`);
+ }
+ return entry.value;
+}
+
+function binaryToText(binary: Buffer): string {
+ if (binary.length % 4 !== 0) {
+ throw new Error('Invalid binary data size for mnemonic encoding');
+ }
+
+ const words: string[] = [];
+
+ for (let i = 0; i < binary.length; i += 4) {
+ const val: number = binary.readUInt32LE(i);
+
+ const w1: number = val % NUMWORDS;
+ const w2: number = (Math.floor(val / NUMWORDS) + w1) % NUMWORDS;
+ const w3: number = (Math.floor(val / (NUMWORDS * NUMWORDS)) + w2) % NUMWORDS;
+
+ words.push(wordsArray[w1], wordsArray[w2], wordsArray[w3]);
+ }
+
+ return words.join(' ');
+}
+function getWordFromTimestamp(timestamp: number, usePassword: boolean): string {
+ const dateOffset: number = Math.max(timestamp - WALLET_BRAIN_DATE_OFFSET, 0);
+ let weeksCount = Math.trunc(dateOffset / WALLET_BRAIN_DATE_QUANTUM);
+ console.log(weeksCount);
+
+ if (weeksCount >= WALLET_BRAIN_DATE_MAX_WEEKS_COUNT) {
+ throw new Error('SEED PHRASE needs to be extended or refactored');
+ }
+
+ if (usePassword) {
+ weeksCount += WALLET_BRAIN_DATE_MAX_WEEKS_COUNT;
+ }
+
+ if (weeksCount > 0xffffffff) {
+ throw new Error(`Value too large for uint32: ${weeksCount}`);
+ }
+
+ return wordByNum(weeksCount);
+}
+
+export function getTimestampFromWord(word: string, passwordUsed: boolean): number {
+ let weeks = numByWord(word);
+
+ if (weeks >= WALLET_BRAIN_DATE_MAX_WEEKS_COUNT) {
+ weeks -= WALLET_BRAIN_DATE_MAX_WEEKS_COUNT;
+ passwordUsed = true;
+ } else {
+ passwordUsed = false;
+ }
+
+ return weeks * WALLET_BRAIN_DATE_QUANTUM + WALLET_BRAIN_DATE_OFFSET;
+}
diff --git a/src/mnemonic/types.ts b/src/mnemonic/types.ts
new file mode 100644
index 0000000..7b9c291
--- /dev/null
+++ b/src/mnemonic/types.ts
@@ -0,0 +1,2 @@
+export type MnemonicToSeedResult = string | false;
+export type SeedToMnemonicResult = string;
diff --git a/src/transaction/constants.ts b/src/transaction/constants.ts
new file mode 100644
index 0000000..9903a80
--- /dev/null
+++ b/src/transaction/constants.ts
@@ -0,0 +1,8 @@
+export const CRYPTO_HDS_OUT_AMOUNT_MASK = Buffer.from('ZANO_HDS_OUT_AMOUNT_MASK_______\0', 'ascii');
+export const CRYPTO_HDS_OUT_CONCEALING_POINT = Buffer.from('ZANO_HDS_OUT_CONCEALING_POINT__\0', 'ascii');
+export const CRYPTO_HDS_OUT_ASSET_BLIND_MASK = Buffer.from('ZANO_HDS_OUT_ASSET_BLIND_MASK__\0', 'ascii');
+export const POINT_X: Buffer = Buffer.from('3a25bcdb43f5d2c9dd063dc39a9e0987bafc6fcf2df1bc76322d75884a4a3820', 'hex');
+export const NATIVE_ASSET_ID: Buffer = Buffer.from(
+ 'd6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a',
+ 'hex',
+);
diff --git a/src/transaction/transaction-utils.ts b/src/transaction/transaction-utils.ts
new file mode 100644
index 0000000..15dc583
--- /dev/null
+++ b/src/transaction/transaction-utils.ts
@@ -0,0 +1,152 @@
+import {
+ NATIVE_ASSET_ID,
+ POINT_X,
+ CRYPTO_HDS_OUT_ASSET_BLIND_MASK,
+ CRYPTO_HDS_OUT_AMOUNT_MASK,
+ CRYPTO_HDS_OUT_CONCEALING_POINT,
+} from './constants';
+import { TransactionObject, TransactionObjectV3 } from './types/transactions';
+import {
+ calculateKeyImage,
+ chachaCrypt,
+ deriveSecretKey,
+ calculateBlindedAssetId,
+ derivePublicKey,
+ generateKeyDerivation,
+ calculateConcealingPoint,
+ getDerivationToScalar,
+ hs,
+} from '../core/crypto';
+
+
+// Q = 1/8 * Hs(domain_sep, Hs(8 * r * V, i) ) * 8 * V
+function getConcealingPoint(viewSecretKey: string, txPubKey: string, pubViewKey: string, outputIndex: number): string {
+ const h: Buffer = getDerivationToScalar(txPubKey, viewSecretKey, outputIndex); // Hs(8 * r * V, i)
+ const Hs: Buffer = hs(CRYPTO_HDS_OUT_CONCEALING_POINT, h); // Hs(domain_sep, Hs(8 * r * V, i) )
+
+ // point V equal pubViewKey
+ const pubViewKeyBuff: Buffer = Buffer.from(pubViewKey, 'hex');
+
+ const concealingPoint: Buffer = calculateConcealingPoint(Hs, pubViewKeyBuff);
+ return concealingPoint.toString('hex');
+}
+
+function decodeAmount(viewSecretKey: string, txPubKey: string, encryptedAmount: string | number, outputIndex: number): bigint {
+ const h: Buffer = getDerivationToScalar(txPubKey, viewSecretKey, outputIndex); // Hs(8 * r * V, i)
+ const Hs: Buffer = hs(CRYPTO_HDS_OUT_AMOUNT_MASK, h); // Hs(domain_sep, Hs(8 * r * V, i) )
+ const maskNumber = BigInt(Hs.readBigUInt64LE(0));
+
+ return BigInt(encryptedAmount) ^ maskNumber;
+}
+
+/*
+* Generates a stealth address for a given transaction using the Dual-key Stealth Address Protocol.
+*
+* This function computes a one-time destination key by combining sender's public transaction key with recipient's view and spend keys.
+* The formula for this stealth address (P_i) is given as P_i = H_s(rV, i)G + S, where:
+* - r is the random scalar multiplication of the transaction public key
+* - V is the recipient's public view key
+* - i is the output index in the transaction
+* - S is the recipient's public spend key
+* - H_s(rV, i) is the hash of the product of r and V and the output index i
+* - G is the base point of the Ed25519 curve
+*
+* @returns {string} The hexadecimal string representation of the ephemeral public key which serves as the one-time stealth address.
+*/
+function getStealthAddress(txPubKey: string, secViewKey: string, pubSpendKey: string, outIndex: number): string {
+ // R = rG
+ const txPubKeyBuf: Buffer = Buffer.from(txPubKey, 'hex');
+ // v = secret view key
+ const secViewKeyBuf: Buffer = Buffer.from(secViewKey, 'hex');
+ // S = public spend key
+ const pubSpendKeyBuf: Buffer = Buffer.from(pubSpendKey, 'hex');
+
+ /*
+ * Generates a key derivation by performing scalar multiplication using a transaction public key
+ * and a secret view key, then multiplies the result by 8.
+ */
+ const derivation: Buffer = generateKeyDerivation(txPubKeyBuf, secViewKeyBuf);
+ // P_i = H_s(rV, i)G + S
+ /*
+ * Derives a public key by using a scalar multiplication of a derivation buffer and the hash of a base point (G),
+ * then adds a provided public spend key to the result.
+ */
+ const stealth: Buffer = derivePublicKey(derivation, outIndex, pubSpendKeyBuf);
+
+ return stealth.toString('hex');
+}
+
+// crypto::point_t(de.asset_id) + asset_blinding_mask * crypto::c_point_X;
+// H = T + s * X
+/*
+ * Calculate blindedAsset based on native asset id, pointX, blindedMask.
+ * We will be able to check if the output is native or not
+*/
+function getNativeBlindedAsset(viewSecretKey: string, txPubKey: string, outputIndex: number): string {
+ const h: Buffer = getDerivationToScalar(txPubKey, viewSecretKey, outputIndex); // h = Hs(8 * r * V, i)
+ const s: Buffer = hs(CRYPTO_HDS_OUT_ASSET_BLIND_MASK, h); // Hs(domain_sep, Hs(8 * r * V, i) )
+
+ const blindedAssetId: Buffer = calculateBlindedAssetId(s, NATIVE_ASSET_ID, POINT_X);
+ return blindedAssetId.toString('hex');
+}
+
+function generateKeyImage(txPubKey: string, secViewKey: string, pubSpendKey: string, outIndex: number, spendSecretKey: string): string {
+ const txPubKeyBuf: Buffer = Buffer.from(txPubKey, 'hex');
+ const secViewKeyBuf: Buffer = Buffer.from(secViewKey, 'hex');
+ const pubSpendKeyBuf: Buffer = Buffer.from(pubSpendKey, 'hex');
+ const secSpendKeyBuf: Buffer = Buffer.from(spendSecretKey, 'hex');
+
+ /*
+ * Generates a key derivation by performing scalar multiplication using a transaction public key
+ * and a secret view key, then multiplies the result by 8.
+ */
+ const derivation: Buffer = generateKeyDerivation(txPubKeyBuf, secViewKeyBuf);
+ // P_i = H_s(rV, i)G + S
+ /*
+ * Derives a public key by using a scalar multiplication of a derivation buffer and the hash of a base point (G),
+ * then adds a provided public spend key to the result.
+ */
+ const secret: Buffer = deriveSecretKey(derivation, outIndex, secSpendKeyBuf);
+ const stealthAddress: Buffer = derivePublicKey(derivation, outIndex, pubSpendKeyBuf);
+
+ const keyImage: Buffer = calculateKeyImage(stealthAddress, secret);
+ return keyImage.toString('hex');
+}
+
+function decryptPaymentId(encryptedPaymentId: string, txPubKey: string, secViewKey: string): string {
+ const encryptedPaymentIdBuf: Buffer = Buffer.from(encryptedPaymentId, 'hex');
+ const txPubKeyBuff: Buffer = Buffer.from(txPubKey, 'hex');
+ const secViewKeyBuff: Buffer = Buffer.from(secViewKey, 'hex');
+
+ const derivation: Buffer = generateKeyDerivation(txPubKeyBuff, secViewKeyBuff);
+ const encrypted: Buffer = chachaCrypt(encryptedPaymentIdBuf, derivation);
+ return encrypted.toString('hex');
+}
+
+function parseObjectInJson(objectInJson: string): TransactionObject | TransactionObjectV3 | null {
+ try {
+ const decodedData: string = Buffer.from(objectInJson || '', 'base64').toString();
+ const txJson: string = prepareJson(decodedData);
+ return JSON.parse(txJson);
+ } catch (error) {
+ console.error('Error parse txJson:', error.message);
+ return null;
+ }
+}
+
+function prepareJson(decodedData: string): string {
+ return decodedData
+ .replace(/: ,/g, ': null,')
+ .replace(/: \d+"([^"]*)"/g, (match: string, str: string) => `: "${str}"`)
+ .replace(/: (\d+)/g, ': "$1"');
+}
+
+export {
+ getConcealingPoint,
+ decodeAmount,
+ getStealthAddress,
+ getNativeBlindedAsset,
+ generateKeyImage,
+ decryptPaymentId,
+ parseObjectInJson,
+};
diff --git a/src/transaction/types/transactions/index.ts b/src/transaction/types/transactions/index.ts
new file mode 100644
index 0000000..2d437f9
--- /dev/null
+++ b/src/transaction/types/transactions/index.ts
@@ -0,0 +1,2 @@
+export * from './v2';
+export * from './v3';
diff --git a/src/transaction/types/transactions/v2.ts b/src/transaction/types/transactions/v2.ts
new file mode 100644
index 0000000..9d3264e
--- /dev/null
+++ b/src/transaction/types/transactions/v2.ts
@@ -0,0 +1,60 @@
+export type TransactionObject = {
+ version: 2;
+ vin: VinData[];
+ extra: ExtraData[];
+ vout: VoutData[];
+ attachment: AttachmentData[];
+};
+
+type TxinZcInputData = {
+ key_offsets: KeyOffsetData;
+ k_image: string;
+ etc_details: unknown[];
+};
+
+type KeyOffsetData = {
+ uint64_t: number;
+};
+
+type VinData = {
+ txin_zc_input: TxinZcInputData;
+};
+
+type AccountAddressData = {
+ spend_public_key: string;
+ view_public_key: string;
+ flags: number;
+};
+
+type ExtraData = {
+ receiver2: null;
+ acc_addr: AccountAddressData;
+ pub_key: string;
+ etc_tx_flags16: null;
+ v: number;
+ checksum: null;
+ encrypted_key_derivation: string;
+ derivation_hash: number;
+ derivation_hint: null;
+ msg: string;
+ zarcanum_tx_data_v1: { fee: number };
+};
+
+type TxOutData = {
+ stealth_address: string;
+ concealing_point: string;
+ amount_commitment: string;
+ blinded_asset_id: string;
+ encrypted_amount: number;
+ mix_attr: number;
+};
+
+type VoutData = {
+ tx_out_zarcanum: TxOutData;
+};
+
+type AttachmentData = {
+ flags: string;
+ service_id: string;
+ body?: string;
+};
diff --git a/src/transaction/types/transactions/v3.ts b/src/transaction/types/transactions/v3.ts
new file mode 100644
index 0000000..2d1e1a2
--- /dev/null
+++ b/src/transaction/types/transactions/v3.ts
@@ -0,0 +1,101 @@
+export type TransactionObjectV3 = {
+ AGGREGATED: AggregatedTxV3;
+ attachment: AttachmentEntry[];
+ signatures: SignatureEntry[];
+};
+
+export type AggregatedTxV3 = {
+ version: '3';
+ vin: VinDataV3[];
+ extra: ExtraEntry[];
+ vout: VoutEntry[];
+ hardfork_id: string;
+};
+
+export type VinDataV3 = {
+ txin_zc_input: TxinZcInputDataV3;
+};
+
+export type TxinZcInputDataV3 = {
+ key_offsets: KeyOffsetData[];
+ k_image: string;
+ etc_details: unknown[];
+};
+
+export type KeyOffsetData = {
+ uint64_t: string;
+};
+
+export type ExtraEntry = {
+ receiver2?: Receiver2;
+ pub_key?: string;
+ etc_tx_flags16?: {
+ v: string;
+ };
+ checksum?: Checksum;
+ derivation_hint?: {
+ msg: string;
+ };
+ zarcanum_tx_data_v1?: {
+ fee: string;
+ };
+ extra_attach_info?: ExtraAttachInfo;
+};
+
+export type Receiver2 = {
+ acc_addr: {
+ spend_public_key: string;
+ view_public_key: string;
+ flags: string;
+ };
+};
+
+export type Checksum = {
+ encrypted_key_derivation: string;
+ derivation_hash: string;
+};
+
+export type ExtraAttachInfo = {
+ sz: string;
+ hsh: string;
+ cnt: string;
+};
+
+export type VoutEntry = {
+ tx_out_zarcanum: TxOutZarcanum;
+};
+
+export type TxOutZarcanum = {
+ stealth_address: string;
+ concealing_point: string;
+ amount_commitment: string;
+ blinded_asset_id: string;
+ encrypted_amount: string;
+ mix_attr: string;
+};
+
+export type AttachmentEntry = {
+ attachment: {
+ service_id: string;
+ instruction: string;
+ body: string;
+ security: unknown[];
+ flags: string;
+ };
+};
+
+export type SignatureEntry = {
+ ZC_sig: ZcSignature;
+};
+
+export type ZcSignature = {
+ pseudo_out_amount_commitment: string;
+ pseudo_out_blinded_asset_id: string;
+ clsags_ggx: ClsagsGgx;
+};
+
+export type ClsagsGgx = {
+ c: string;
+ '(std::vector&)(r_g)': string[];
+ '(std::vector&)(r_x)': string[];
+};
diff --git a/tests/account-utils.spec.ts b/tests/account-utils.spec.ts
new file mode 100644
index 0000000..e219189
--- /dev/null
+++ b/tests/account-utils.spec.ts
@@ -0,0 +1,130 @@
+import { validateAccount, generateAccount, privateKeyToPublicKey, AccountKeys, getAccountBySecretSpendKey } from '../src';
+import { ADDRESS_REGEX } from '../src/address/constants';
+import * as crypto from '../src/core/crypto';
+
+describe('generate account', () => {
+ afterEach(() => {
+ jest.restoreAllMocks();
+ });
+
+ it('creates unpredictable address', () => {
+ expect(generateAccount()).toMatchObject({
+ address: expect.stringMatching(ADDRESS_REGEX),
+ secretSpendKey: expect.stringMatching(/^([0-9a-fA-F]{2})+$/),
+ publicSpendKey: expect.stringMatching(/^([0-9a-fA-F]{2})+$/),
+ publicViewKey: expect.stringMatching(/^([0-9a-fA-F]{2})+$/),
+ secretViewKey: expect.stringMatching(/^([0-9a-fA-F]{2})+$/),
+ });
+ });
+
+ it('generate known account', () => {
+ jest.spyOn(crypto, 'generateSeedKeys').mockReturnValueOnce({
+ secretSpendKey: '6c225665aadb81ebce41bd94cbc78250aaf62f2636819b1cdcf47d4cbcd2b00d',
+ publicSpendKey: '0c27ece0fb489b344915d12745a89f9b6cb307c384286be12ae9311942aa89db',
+ });
+
+ expect(generateAccount()).toMatchObject({
+ address: 'ZxBpGz8qdG3SxgBYFKJqxjThPZpjqW1ouK3ZsyZnZCUqQ4Ndc9PiqkdJuEicMXPPSW5JidxK5bye7UYc1hkTHhxc1w4temC2A',
+ secretSpendKey: '6c225665aadb81ebce41bd94cbc78250aaf62f2636819b1cdcf47d4cbcd2b00d',
+ publicSpendKey: '0c27ece0fb489b344915d12745a89f9b6cb307c384286be12ae9311942aa89db',
+ });
+ });
+});
+
+describe('address validation', () => {
+ const address = 'ZxDFpn4k7xVYyc9VZ3LphrJbkpc46xfREace5bme1aXiMzKPAHA8jsTWcHSXhv9AdodSaoGXK9Mg7bk3ec4FkQrj357fZPWZX';
+ const secretSpendKey = '80b3e96a3eb765332b0fd3e44e0fefa58747a70025bf91aa4a7b758ab6f5590d';
+ const publicSpendKey = 'b3eee2376f32bf2bfb5cf9c023f569380c84ac8c64ddc8f7c109730dc8e97d7a';
+ const secretViewKey = '3e75ffee51eb21b1d6404ddcab5b3aaa49edbfe225e9a893d87074aacae46b09';
+ const publicViewKey = 'fa9c2811c53eb1044490e931f92ad9ddf317220df08ccfb5b83eccfdbd38f135';
+
+ const secretSpendKey2 = '9ed57f071db00695b18ea396d0f85ce18178b35643c038f09255edc326c4a502';
+ const publicSpendKey2 = 'd651f305d40bcbe27ced0ef48253623ec31da3a28130d08ddf6686179e418ff4';
+ const publicViewKey2 = '2b3e2bac27a3992b3f93285b1d08476a5723afdf3aa6961770ad7e7544325831';
+
+ it('created address should be valid', () => {
+ expect(validateAccount(address, publicSpendKey, publicViewKey, secretSpendKey, secretViewKey))
+ .toBe(true);
+ });
+
+ it('should throw on empty input', () => {
+ expect(() => validateAccount('', '', '', '', '')).toThrow('invalid address format');
+ });
+
+ it('should throw on invalid address keys', () => {
+ expect(() => validateAccount(address, '', '', '', '')).toThrow('invalid address keys');
+ });
+
+ it('should throw on invalid dependent secret view key', () => {
+ expect(() =>
+ validateAccount(address, publicSpendKey, publicViewKey, secretSpendKey2, secretViewKey)
+ ).toThrow('invalid depend secret view key');
+ });
+
+ it('should throw on mismatched public spend key', () => {
+ expect(() =>
+ validateAccount(address, publicSpendKey2, publicViewKey, secretSpendKey, secretViewKey)
+ ).toThrow('invalid address keys');
+ });
+
+ it('should throw on missing secret view key', () => {
+ expect(() =>
+ validateAccount(address, publicSpendKey2, publicViewKey, secretSpendKey, '')
+ ).toThrow('invalid address keys');
+ });
+
+ it('should throw on empty dependent secret view key', () => {
+ expect(() =>
+ validateAccount(address, publicSpendKey, publicViewKey, secretSpendKey, '')
+ ).toThrow('invalid depend secret view key');
+ });
+
+ it('should throw on mismatched public view key', () => {
+ expect(() =>
+ validateAccount(address, publicSpendKey, publicViewKey2, secretSpendKey, secretViewKey)
+ ).toThrow('pub view key from secret key no equal provided pub view key');
+ });
+});
+
+describe('private key to public key', () => {
+ const secretSpendKey = '80b3e96a3eb765332b0fd3e44e0fefa58747a70025bf91aa4a7b758ab6f5590d';
+ const publicSpendKey = 'b3eee2376f32bf2bfb5cf9c023f569380c84ac8c64ddc8f7c109730dc8e97d7a';
+
+ it('should derive the correct public key from a given secret key', () => {
+ const actualPublicKey: string = privateKeyToPublicKey(secretSpendKey);
+ expect(actualPublicKey).toBe(publicSpendKey);
+ });
+
+ it('should throw an error for an invalid secret key (non-hex string)', () => {
+ const invalidKey = 'zzzz-not-a-hex-key';
+ expect(() => privateKeyToPublicKey(invalidKey)).toThrow('Invalid secret spend key');
+ });
+
+ it('should throw an error for a too short key', () => {
+ const shortKey = 'deadbeef';
+ expect(() => privateKeyToPublicKey(shortKey)).toThrow('Invalid secret spend key');
+ });
+
+ it('should throw an error for an empty string', () => {
+ expect(() => privateKeyToPublicKey('')).toThrow('Invalid secret spend key');
+ });
+});
+
+describe('get account by secret spend key', () => {
+ it('created account should be equal mock', () => {
+ const secretSpendKeyMock = '80b3e96a3eb765332b0fd3e44e0fefa58747a70025bf91aa4a7b758ab6f5590d';
+ const publicSpendKeyMock = 'b3eee2376f32bf2bfb5cf9c023f569380c84ac8c64ddc8f7c109730dc8e97d7a';
+ const secretViewKeyMock = '3e75ffee51eb21b1d6404ddcab5b3aaa49edbfe225e9a893d87074aacae46b09';
+ const publicViewKeyMock = 'fa9c2811c53eb1044490e931f92ad9ddf317220df08ccfb5b83eccfdbd38f135';
+
+ const accountKeys: AccountKeys = getAccountBySecretSpendKey(secretSpendKeyMock);
+ const { secretSpendKey, secretViewKey, publicSpendKey, publicViewKey } = accountKeys;
+
+ expect({ secretSpendKey, secretViewKey, publicSpendKey, publicViewKey }).toEqual({
+ secretSpendKey: secretSpendKeyMock,
+ secretViewKey: secretViewKeyMock,
+ publicSpendKey: publicSpendKeyMock,
+ publicViewKey: publicViewKeyMock
+ });
+ });
+});
diff --git a/tests/address-utils.spec.ts b/tests/address-utils.spec.ts
new file mode 100644
index 0000000..25dcf82
--- /dev/null
+++ b/tests/address-utils.spec.ts
@@ -0,0 +1,145 @@
+import { splitIntegratedAddress, getIntegratedAddress, getKeysFromAddress, encodeAddress } from '../src/address/address-utils';
+import { base58Decode } from '../src/core/base58';
+
+describe(
+ 'testing the correctness of the address encoding function encodeAddress',
+ () => {
+ const tag = 197;
+ const flag = 1;
+ const spendPublicKey = '9f5e1fa93630d4b281b18bb67a3db79e9622fc703cc3ad4a453a82e0a36d51fa';
+ const viewPublicKey = 'a3f208c8f9ba49bab28eed62b35b0f6be0a297bcd85c2faa1eb1820527bcf7e3';
+ const address = encodeAddress(tag, flag, spendPublicKey, viewPublicKey);
+
+ it('checking the correctness of the result', () => {
+ expect(address)
+ .toBe('ZxD5aoLDPTdcaRx4uCpyW4XiLfEXejepAVz8cSY2fwHNEiJNu6NmpBBDLGTJzCsUvn3acCVDVDPMV8yQXdPooAp338Se7AxeH');
+ });
+
+ it('checking the correctness of the address length', () => {
+ expect(address).toHaveLength(97);
+ });
+
+ it('should throw an error for invalid tag', () => {
+ expect(() => {
+ encodeAddress(-197, 1, '...', '...');
+ }).toThrow('Invalid tag');
+ });
+
+ it('should throw an error for invalid flag', () => {
+ expect(() => {
+ encodeAddress(197, -1, '...', '...');
+ }).toThrow('Invalid flag');
+ });
+
+ it('should throw an error for invalid public key', () => {
+ expect(() => {
+ encodeAddress(197, 1, 'invalid', viewPublicKey);
+ }).toThrow('Invalid spendPublicKey: must be a hexadecimal string with a length of 64');
+ });
+
+ it('should throw an error for invalid private key', () => {
+ expect(() => {
+ encodeAddress(197, 1, spendPublicKey, 'invalid');
+ }).toThrow('Invalid viewPrivateKey: must be a hexadecimal string with a length of 64');
+ });
+ },
+);
+
+describe(
+ 'testing the correctness of the address decoding function getKeysFromZanoAddress',
+ () => {
+ const address = 'ZxD5aoLDPTdcaRx4uCpyW4XiLfEXejepAVz8cSY2fwHNEiJNu6NmpBBDLGTJzCsUvn3acCVDVDPMV8yQXdPooAp338Se7AxeH';
+ const spendPublicKey = '9f5e1fa93630d4b281b18bb67a3db79e9622fc703cc3ad4a453a82e0a36d51fa';
+ const viewPublicKey = 'a3f208c8f9ba49bab28eed62b35b0f6be0a297bcd85c2faa1eb1820527bcf7e3';
+
+ it('checking the correctness of the address decoding', () => {
+ expect((getKeysFromAddress(address))).toStrictEqual({
+ spendPublicKey,
+ viewPublicKey,
+ });
+ });
+
+ it('should throw an error for invalid address format', () => {
+ expect(() => {
+ getKeysFromAddress('invalid');
+ }).toThrow('Invalid address format');
+ });
+
+ it('should throw an invalid character in base58 string', () => {
+ const invalidAddress = 'ZxD5aoLDPTdcaRx4uOpyW4XiLfEXejepAVz8cSY2fwHNEiJNu6NmpBBDLGTJzCsUvn3acCVDVDPMV8yQXdPooAp338Se7AxeH';
+ expect(() => {
+ getKeysFromAddress(invalidAddress);
+ }).toThrow('base58 string block contains invalid character');
+ });
+
+ it('should throw an invalid base58 string size', () => {
+ const invalidAddress = 'Z';
+ expect(() => {
+ base58Decode(invalidAddress);
+ }).toThrow('base58 string has an invalid size');
+ });
+
+ it('should throw an invalid address checksum', () => {
+ expect(() => {
+ (getKeysFromAddress('Zx' + '1'.repeat(95)));
+ }).toThrow('Invalid address checksum');
+ });
+ },
+);
+
+describe('getIntegratedAddress', () => {
+ const SUFFIX_LENGTH = 18; // paymentId + checksum
+
+ // Define test data
+ const integratedAddress = 'iZ2kFmwxRHoaRxm1ni8HnfUTkYuKbni8s4CE2Z4GgFfH99BJ6cnbAtJTgUnZjPj9CTCTKy1qqM9wPCTp92uBC7e47JPoHxGL5UU2D1tpQMg4';
+ const masterAddress = 'ZxD5aoLDPTdcaRx4uCpyW4XiLfEXejepAVz8cSY2fwHNEiJNu6NmpBBDLGTJzCsUvn3acCVDVDPMV8yQXdPooAp338Se7AxeH';
+ const masterAddress2 = 'ZxDG8UrQMEVaRxm1ni8HnfUTkYuKbni8s4CE2Z4GgFfH99BJ6cnbAtJTgUnZjPj9CTCTKy1qqM9wPCTp92uBC7e41KkqnWH8F';
+
+ const masterBasedIntegratedAddress = 'iZ2Zi6RmTWwcaRx4uCpyW4XiLfEXejepAVz8cSY2fwHNEiJNu6NmpBBDLGTJzCsUvn3acCVDVDPMV8yQXdPooAp3iTqEsjvJoco1aLSZXS6T';
+ const master2BasedIntegratedAddress = 'iZ2kFmwxRHoaRxm1ni8HnfUTkYuKbni8s4CE2Z4GgFfH99BJ6cnbAtJTgUnZjPj9CTCTKy1qqM9wPCTp92uBC7e47JQQbd6iYGx1S6AdHpq6';
+
+ // Compute desired outcomes for the slice operation
+ const integratedAddressWithoutSuffix: string = integratedAddress.slice(0, -SUFFIX_LENGTH);
+ const masterBasedIntegratedAddressWithoutSuffix: string = masterBasedIntegratedAddress.slice(0, -SUFFIX_LENGTH);
+ const master2BasedIntegratedAddressWithoutSuffix: string = master2BasedIntegratedAddress.slice(0, -SUFFIX_LENGTH);
+
+ // Addresses returned by ZanoAddressUtils
+ const addressFromIntegrated: string = getIntegratedAddress(integratedAddress);
+ const addressFromMaster: string = getIntegratedAddress(masterAddress);
+ const addressFromMaster2: string = getIntegratedAddress(masterAddress2);
+
+ it('ensures that truncating the last 18 characters from the integrated address is correct', () => {
+ expect(addressFromIntegrated.slice(0, -SUFFIX_LENGTH)).toBe(integratedAddressWithoutSuffix);
+ });
+
+ it('ensures that truncating the last 18 characters from the master-based integrated address is correct', () => {
+ expect(addressFromMaster.slice(0, -SUFFIX_LENGTH)).toBe(masterBasedIntegratedAddressWithoutSuffix);
+ });
+
+ it('ensures that truncating the last 18 characters from the second master-based integrated address is correct', () => {
+ expect(addressFromMaster2.slice(0, -SUFFIX_LENGTH)).toBe(master2BasedIntegratedAddressWithoutSuffix);
+ });
+});
+
+describe(
+ 'testing the correctness of the address decoding in function splitIntegratedAddress',
+ () => {
+ const integratedAddress = 'iZ2kFmwxRHoaRxm1ni8HnfUTkYuKbni8s4CE2Z4GgFfH99BJ6cnbAtJTgUnZjPj9CTCTKy1qqM9wPCTp92uBC7e47JPoHxGL5UU2D1tpQMg4';
+ const masterAddress = 'ZxDG8UrQMEVaRxm1ni8HnfUTkYuKbni8s4CE2Z4GgFfH99BJ6cnbAtJTgUnZjPj9CTCTKy1qqM9wPCTp92uBC7e41KkqnWH8F';
+ const paymentId = '1e4cbed444118c99';
+ const invalidintegratedAddress = 'i03McELC3jGTgUnZjPj9CTCTKy1qqM9wPCTp92uBC7e47JR67Qv6wMFaRxm1ni8HnfUTkYuKbni8s4CE2Z4GgFfH999Pvhkaga42D1npn1Vc';
+
+ it('checking the correctness of the integrated address decoding', () => {
+ expect(splitIntegratedAddress(integratedAddress)).toStrictEqual({
+ masterAddress,
+ paymentId,
+ });
+ });
+
+ it('should throw an invalid format of the integreted address', () => {
+ expect(() => {
+ splitIntegratedAddress(invalidintegratedAddress);
+ }).toThrow('Invalid integratedAddress: must be a hexadecimal string with a length of 106 whit correct regex');
+ });
+ },
+);
diff --git a/tests/address.ts b/tests/address.ts
new file mode 100644
index 0000000..3f73e4f
--- /dev/null
+++ b/tests/address.ts
@@ -0,0 +1,118 @@
+
+import { encodeAddress, getKeysFromAddress } from '../src/address/address-utils';
+import { base58Decode, base58Encode } from '../src/core/base58';
+import type { ZarcanumAddressKeys } from '../src/address/types';
+
+const rawAddressBufferHex = 'c5 01 9f 5e 1f a9 36 30 d4 b2 81 b1 8b b6 7a 3d b7 9e 96 22 fc 70 3c c3 ad 4a 45 3a 82 e0 a3 6d 51 fa a3 f2 08 c8 f9 ba 49 ba b2 8e ed 62 b3 5b 0f 6b e0 a2 97 bc d8 5c 2f aa 1e b1 82 05 27 bc f7 e3 e2 38 1c d6';
+
+function dataToEncodeFn(hexString: string): string {
+ return hexString.split(' ')
+ .map(byte => `\\x${byte}`)
+ .join('');
+}
+
+function encodeToHex(hexString: string): string {
+ return hexString
+ .match(/.{1,2}/g)
+ .map(byte => byte)
+ .join('');
+}
+
+export function bufferToHex(buffer: Buffer): string {
+ let combinedHexString = '';
+ for (let i = 0; i < buffer.length; i++) {
+ combinedHexString += buffer[i].toString(16).padStart(2, '0');
+ if (i < buffer.length - 1) {
+ combinedHexString += ' ';
+ }
+ }
+ return combinedHexString;
+}
+
+export function makeBytes(data: string): Uint8Array {
+ const byteArray: number[] = data.split('\\x').slice(1).map(byte => parseInt(byte, 16));
+ return new Uint8Array(byteArray);
+}
+
+function testEncode(expected: string, data: string) {
+ const byteData: Uint8Array = makeBytes(data);
+ const result: string = base58Encode(byteData);
+ console.log(`Expected: '${expected}', Received: '${result}', ByteData:`, byteData);
+ console.assert(result === expected, `Expected ${expected} but got ${result}`);
+}
+
+function runTests() {
+ testEncode('11', '\\x00');
+ testEncode('111', '\\x00\\x00');
+ testEncode('11111', '\\x00\\x00\\x00');
+ testEncode('111111', '\\x00\\x00\\x00\\x00');
+ testEncode('1111111', '\\x00\\x00\\x00\\x00\\x00');
+ testEncode('111111111', '\\x00\\x00\\x00\\x00\\x00\\x00');
+ testEncode('1111111111', '\\x00\\x00\\x00\\x00\\x00\\x00\\x00');
+ testEncode('11111111111', '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00');
+ testEncode('1111111111111', '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00');
+ testEncode('11111111111111', '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00');
+ testEncode('1111111111111111', '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00');
+ testEncode('11111111111111111', '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00');
+ testEncode('111111111111111111', '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00');
+ testEncode('11111111111111111111', '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00');
+ testEncode('111111111111111111111', '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00');
+ testEncode('1111111111111111111111', '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00');
+ testEncode('22222222222VtB5VXc', '\\x06\\x15\\x60\\x13\\x76\\x28\\x79\\xF7\\xFF\\xFF\\xFF\\xFF\\xFF');
+
+ const expectedAddress = 'ZxD5aoLDPTdcaRx4uCpyW4XiLfEXejepAVz8cSY2fwHNEiJNu6NmpBBDLGTJzCsUvn3acCVDVDPMV8yQXdPooAp338Se7AxeH';
+ const dataToAddress: string = dataToEncodeFn(rawAddressBufferHex);
+ testEncode(expectedAddress, dataToAddress);
+}
+
+function runTestEncodeAddress(address: string, viewPubKey: string, spendPubKey: string): void {
+ const addressBufferHex: string = dataToEncodeFn(bufferToHex(base58Decode(address)));
+ testEncode(
+ 'ZxD5aoLDPTdcaRx4uCpyW4XiLfEXejepAVz8cSY2fwHNEiJNu6NmpBBDLGTJzCsUvn3acCVDVDPMV8yQXdPooAp338Se7AxeH',
+ addressBufferHex,
+ );
+
+ const serializedViewKey: string = encodeToHex(Buffer.from(viewPubKey, 'hex').toString('hex'));
+
+ if(serializedViewKey !== viewPubKey) {
+ throw new Error('PubViewKey not matched.');
+ }
+
+ const serializedSpendKey: string = encodeToHex(Buffer.from(spendPubKey, 'hex').toString('hex'));
+
+ if(serializedSpendKey !== spendPubKey) {
+ throw new Error('PubSpendKey not matched.');
+ }
+
+ const encodedAddress: string = encodeAddress(197, 1, spendPubKey, viewPubKey);
+
+ if(encodedAddress !== address) {
+ throw new Error(`Encoded address not matched. Received ${encodedAddress}, Expected: ${address}`);
+ }
+}
+
+function runTestGetZanoKeys(address: string, viewPubKey: string, spendPubKey: string): void {
+ const keysFromAddress: ZarcanumAddressKeys = getKeysFromAddress(address);
+
+ if(keysFromAddress.spendPublicKey !== spendPubKey) {
+ throw new Error('spendPubKey not matched.');
+ }
+
+ if(keysFromAddress.viewPublicKey !== viewPubKey) {
+ throw new Error('viewPubKey not matched.');
+ }
+}
+
+void (async (): Promise => {
+ runTests();
+ runTestEncodeAddress(
+ 'ZxD5aoLDPTdcaRx4uCpyW4XiLfEXejepAVz8cSY2fwHNEiJNu6NmpBBDLGTJzCsUvn3acCVDVDPMV8yQXdPooAp338Se7AxeH',
+ 'a3f208c8f9ba49bab28eed62b35b0f6be0a297bcd85c2faa1eb1820527bcf7e3',
+ '9f5e1fa93630d4b281b18bb67a3db79e9622fc703cc3ad4a453a82e0a36d51fa',
+ );
+ runTestGetZanoKeys(
+ 'ZxD5aoLDPTdcaRx4uCpyW4XiLfEXejepAVz8cSY2fwHNEiJNu6NmpBBDLGTJzCsUvn3acCVDVDPMV8yQXdPooAp338Se7AxeH',
+ 'a3f208c8f9ba49bab28eed62b35b0f6be0a297bcd85c2faa1eb1820527bcf7e3',
+ '9f5e1fa93630d4b281b18bb67a3db79e9622fc703cc3ad4a453a82e0a36d51fa',
+ );
+})();
diff --git a/tests/decode-utils.spec.ts b/tests/decode-utils.spec.ts
new file mode 100644
index 0000000..9cd7fdb
--- /dev/null
+++ b/tests/decode-utils.spec.ts
@@ -0,0 +1,52 @@
+
+import { DecodeTransactionResult } from '../src/decode/types';
+import { objectInJson } from './fixtures';
+import { decodeTransaction } from '../src/decode/decode-service';
+import { createIntegratedAddress } from '../src/address/address-utils';
+
+describe(
+ 'Should be decode transaction and return amount and paymentId',
+ () => {
+ const secretViewKey = '81ef6415b815f675991585ebba71c8c4663a08893fd93ee149c48e797a2fdf09';
+ const publicSpendKey = '6be99667faa6b693fbcd808f94b8243540198c9cbb0b564f267f885d227804a2';
+
+ const integratedAddress = 'iZ285wzfsbjXYEgZVuDeFy74GFtYDFbvrFSJpL6TJQ3Z1mxZaKQLZsJHyVuCH4pQSr3rQunoH7cE4bjJSWmJqWSnKu6rPqXZ8HB1VxSHXVZR';
+ const address = 'ZxCdxeu7oYRXYEgZVuDeFy74GFtYDFbvrFSJpL6TJQ3Z1mxZaKQLZsJHyVuCH4pQSr3rQunoH7cE4bjJSWmJqWSn1yGLxsfJH';
+
+ it('checking the correctness of the result', () => {
+ const result: DecodeTransactionResult = decodeTransaction(objectInJson, secretViewKey, publicSpendKey);
+
+ if (result.ok) {
+ const { ok, amount, paymentId } = result;
+ expect({ ok, amount, paymentId }).toEqual({
+ ok: true,
+ amount: '0.0005',
+ paymentId: '49c925855b863a25'
+ });
+ }
+ });
+
+ it('checking the correctness of the result using address param', () => {
+ const result: DecodeTransactionResult = decodeTransaction(objectInJson, secretViewKey, address);
+
+ if (result.ok) {
+ const { ok, amount, paymentId } = result;
+ expect({ ok, amount, paymentId }).toEqual({
+ ok: true,
+ amount: '0.0005',
+ paymentId: '49c925855b863a25'
+ });
+ }
+ });
+
+ it('returned paymentId should be correct', () => {
+ const result: DecodeTransactionResult = decodeTransaction(objectInJson, secretViewKey, publicSpendKey);
+
+ if (result.ok) {
+ const { paymentId } = result;
+ const receivedIntegratedAddress: string = createIntegratedAddress(address, paymentId);
+ expect(integratedAddress).toEqual(receivedIntegratedAddress);
+ }
+ });
+ },
+);
diff --git a/tests/fixtures.ts b/tests/fixtures.ts
new file mode 100644
index 0000000..a9fc80e
--- /dev/null
+++ b/tests/fixtures.ts
@@ -0,0 +1 @@
+export const objectInJson = 'ewogICJBR0dSRUdBVEVEIjogewogICAgInZlcnNpb24iOiAzLCAKICAgICJ2aW4iOiBbIHsKICAgICAgICAidHhpbl96Y19pbnB1dCI6IHsKICAgICAgICAgICJrZXlfb2Zmc2V0cyI6IFsgewogICAgICAgICAgICAgICJ1aW50NjRfdCI6IDEwNjg5MDIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICJ1aW50NjRfdCI6IDI3NzM4OQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgInVpbnQ2NF90IjogMzAwNDM4CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAidWludDY0X3QiOiAxMDA4MjEKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICJ1aW50NjRfdCI6IDg2ODY4CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAidWludDY0X3QiOiA0NzQKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICJ1aW50NjRfdCI6IDMzOTgyCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAidWludDY0X3QiOiA4NTM2CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAidWludDY0X3QiOiAyMDE3OQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgInVpbnQ2NF90IjogNDM5MQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgInVpbnQ2NF90IjogNjI0OQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgInVpbnQ2NF90IjogMTc5OQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgInVpbnQ2NF90IjogMTU0CiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAidWludDY0X3QiOiAzMTkKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICJ1aW50NjRfdCI6IDQ0MgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgInVpbnQ2NF90IjogMTM5CiAgICAgICAgICAgIH0KICAgICAgICAgIF0sIAogICAgICAgICAgImtfaW1hZ2UiOiAiYTI5ZGUxY2ZlMmJmMWM3YWNjYThkODhkMTgwZDM3ODFmNjAwYTI4ZjZjM2UwZGU3ODhhNzNjODM0YzQ4M2YxMyIsIAogICAgICAgICAgImV0Y19kZXRhaWxzIjogWyBdCiAgICAgICAgfQogICAgICB9XSwgCiAgICAiZXh0cmEiOiBbIHsKICAgICAgICAicHViX2tleSI6ICJlYTJiMGNiMmY4ZTA5MjIxMDBiZTc5NDc0ZDhhZmM1MjVkMmEzMzEwYTFjMzYwNGJmNTM0MjM3ZGI2NTc1OGUwIgogICAgICB9LCB7CiAgICAgICAgImV0Y190eF9mbGFnczE2IjogewogICAgICAgICAgInYiOiAwCiAgICAgICAgfQogICAgICB9LCB7CiAgICAgICAgImRlcml2YXRpb25faGludCI6IHsKICAgICAgICAgICJtc2ciOiAiZDViNSIKICAgICAgICB9CiAgICAgIH0sIHsKICAgICAgICAiZGVyaXZhdGlvbl9oaW50IjogewogICAgICAgICAgIm1zZyI6ICI5NWMxIgogICAgICAgIH0KICAgICAgfSwgewogICAgICAgICJ6YXJjYW51bV90eF9kYXRhX3YxIjogewogICAgICAgICAgImZlZSI6IDEwMDAwMDAwMDAwCiAgICAgICAgfQogICAgICB9LCB7CiAgICAgICAgImV4dHJhX2F0dGFjaF9pbmZvIjogewogICAgICAgICAgInN6IjogNTMsIAogICAgICAgICAgImhzaCI6ICI5MGMyMjQyYmU2ZGQ0NTMwNzMzNGU3YTMwNDUzNmFkYzJlZDE0MmIwYTcyMWEzNzAwZDY5ZDRmOWJkMTEwM2U5IiwgCiAgICAgICAgICAiY250IjogMgogICAgICAgIH0KICAgICAgfQogICAgXSwgCiAgICAidm91dCI6IFsgewogICAgICAgICJ0eF9vdXRfemFyY2FudW0iOiB7CiAgICAgICAgICAic3RlYWx0aF9hZGRyZXNzIjogIjgzOGFlMWFjYmQ2OGY2ZGM0MTIyZWU1NGE0ZDYxZDZkNTA2ODg4YmE1Y2MyMDI3MjQyNzMwMzc0YWNhNWM3OGQiLCAKICAgICAgICAgICJjb25jZWFsaW5nX3BvaW50IjogIjIzOTRhZGU3MjM5ZWRlYjYxMTNjM2M4YmUwZjQ4NTZjZjIwNGYzZGYyODUwYjk3ZjU4Y2ZjN2QyMWMwMTg3YTgiLCAKICAgICAgICAgICJhbW91bnRfY29tbWl0bWVudCI6ICI1NTE0MDlkOThmMGMzNjU2MzMwNTU1ZjljM2Y4ZDZhODY2ZmY3ZGVlZjZlNmI4ODJjYzVjMzk2YzI5ZTY2MDFhIiwgCiAgICAgICAgICAiYmxpbmRlZF9hc3NldF9pZCI6ICI2Y2ViOGIwMTlhZDZiYzVkZTc0MGMxMWI4MmQyMWJiNGNmM2Q5NTY5NzkwN2I1NDE0ODUxYzg4ZDc2MjQ0OWNhIiwgCiAgICAgICAgICAiZW5jcnlwdGVkX2Ftb3VudCI6IDU3NjE1NzQzNTMzNDA1NDAyNDIsIAogICAgICAgICAgIm1peF9hdHRyIjogMAogICAgICAgIH0KICAgICAgfSwgewogICAgICAgICJ0eF9vdXRfemFyY2FudW0iOiB7CiAgICAgICAgICAic3RlYWx0aF9hZGRyZXNzIjogIjdjODVkY2VhNjFmNzM3ODU1MTk1ZmIxNzU1NWNmMzE2YzhhYTIxNGIxMWE5MWMxYWNlNzEyNzE1ZmZjNDk0OTAiLCAKICAgICAgICAgICJjb25jZWFsaW5nX3BvaW50IjogImY4MjgxMGQ0NTRhYTJjNDk0OWI3ODE1YjQyZjkxODQxYTdhYTg4ODVlY2MyOWIwMTY3M2NjZjQ1NDIyNzdiMGMiLCAKICAgICAgICAgICJhbW91bnRfY29tbWl0bWVudCI6ICI4NjFhN2UzOThjOTU1YzQ5YzVjZjkyZTI1MzNkYTlkMmU1NzIxM2Y0NDhlMmI1NWYwMzViYzdkODcyYTkwMTY0IiwgCiAgICAgICAgICAiYmxpbmRlZF9hc3NldF9pZCI6ICIzNGYyZDA4ZjJlOTgyZWI5MWFmN2I1MWFkODE2OTg1ZjRjY2ZhYTNhNGE4MWEzYTk5ZGMxMWM0YWYyZTE5OTkxIiwgCiAgICAgICAgICAiZW5jcnlwdGVkX2Ftb3VudCI6IDEyMjg5Mjg5ODc2ODgxNzg4NTk5LCAKICAgICAgICAgICJtaXhfYXR0ciI6IDAKICAgICAgICB9CiAgICAgIH0KICAgIF0sIAogICAgImhhcmRmb3JrX2lkIjogNQogIH0sIAogICJhdHRhY2htZW50IjogWyB7CiAgICAgICJhdHRhY2htZW50IjogewogICAgICAgICJzZXJ2aWNlX2lkIjogIjUwIiwgCiAgICAgICAgImluc3RydWN0aW9uIjogIiIsIAogICAgICAgICJib2R5IjogIjk4NTJjNTcwMjdmN2NjNzciLCAKICAgICAgICAic2VjdXJpdHkiOiBbIF0sIAogICAgICAgICJmbGFncyI6IDEKICAgICAgfQogICAgfSwgewogICAgICAiY2hlY2tzdW0iOiB7CiAgICAgICAgImVuY3J5cHRlZF9rZXlfZGVyaXZhdGlvbiI6ICJiZTYwOWRiMDRjZDdiNDAwZGU4ZTYxMDMzMzM4Yzg5MzA2NDcwNmIyMzBhZTFhOGYwZGUwMDMyMTNiZjdjYjA1IiwgCiAgICAgICAgImRlcml2YXRpb25faGFzaCI6IDIwMzgxMjU4OTAKICAgICAgfQogICAgfV0sIAogICJzaWduYXR1cmVzIjogWyB7CiAgICAgICJaQ19zaWciOiB7CiAgICAgICAgInBzZXVkb19vdXRfYW1vdW50X2NvbW1pdG1lbnQiOiAiMmVjMDFlMjJlN2MyZmJhZWUwNmVkZWY5MjVhMTY0M2Q5OTk3N2U0YmIyMDE3MGE1M2I1MWI0MTM0MTBiOTk2ZiIsIAogICAgICAgICJwc2V1ZG9fb3V0X2JsaW5kZWRfYXNzZXRfaWQiOiAiZmYwYmFiMjU5YjkyM2E0YTc0YWQxNTcwNjcwYmVmYWQ4NGZjNjI3OTM3MjhjODlkMDMzYmU0YzVlZjAzMTIzZSIsIAogICAgICAgICJjbHNhZ3NfZ2d4IjogewogICAgICAgICAgImMiOiAiNjgxM2UzNjEyMjUxNjc4OTFiZmFmZjVhYjZmZWU4NGU5YmY2MmM1MjEwMTY0NWRkOGIyNGE2MzAxNGMxMzAwZiIsIAogICAgICAgICAgIihzdGQ6OnZlY3RvcjxzY2FsYXJfdD4mKShyX2cpIjogWyAiMzg3MGE3N2MzMzc4NjRjYjA5ZDlhMTUxZmMzMTBkNGQwODk1MzcyYWI4YTljMjViZmM0YjgwYzUxMGFlMjgwYiIsICJhYjMyNzE4MDdjNzMxZTE5YmYzZmJmZDFkMTRhZjUwMTc3YWQ0MTlhYjdmNzA3MjFhNmNlNjFlYmM4OTRlYzAxIiwgIjU1MzBkOTEyZTE4ZDI0YTQ1NzMyMDk0YmViMTgzMWVlNTFkZjhmODQ0YzIxMmUxNjM4MTkxOTdiMDk1Yzk3MGIiLCAiNjc1ZmZmOWM5YWMwMWE2MzNkZmM0OTA2MjM2YmEwZjAwOTQxYWE3MGJkZDRmNDNmZTA1NzQ1ZmE4YzVmNmQwOCIsICIwOWUyMDMyODI1YjE3ZjZmMTdkN2E5ZGNjY2ZlZWViNGEyNTk3ZmRiN2QxMmFmMThjMDg4YmVmNDY3NzNhNDA2IiwgImNmNTM5ZGEzMzFiMDM5MzM5YWFlOTJhNWZmMjgyOTBkOGUyMGVmYjgwYTQ4ODM0NDE4MWExMGI4ZDY1ZmUxMGEiLCAiNjE4MWU2NDQ5YThlNWRhMTQ4OGRiNDYwMTkxZjk0NjgwOTdmYmZmZmUwZTdhMGFmZmM0N2ZjMDhkNTFlNTcwZiIsICI3ZDE0ZjZjNzBhMjEwMWRiNGY0YWY4MDI2YjkyMTQyMmQwOGY2NjNkNGQ1NzI3NzEyMjkzYmNiNjA4ZTM1NDA2IiwgImRmZTkyOTczMGM1MjBlOGVkYzQ5N2EzYTZkODk0ZjFhN2JkYWJjOThkMDdjNzYxZjAzMDFiMzU5NTU5NTg4MDgiLCAiZGY0YzNhMGU2YzRlMDZkM2I0YTE1NWJjNmE3NTExNmEzNWVmODU2YjExOGI0NGYwMjc5NDNhNGVmOTAyYTIwNCIsICI2NWFlM2MyNGNkYWJiMDI0MzcyZDQzMWU2NzFlNWJkZmUyOWM2MDIzYjllNjUzZmU4NGZiYTM2MDdhZjBlYjAxIiwgIjNlMzg5NjJkYjc0YmYwY2VlNzk2N2RlOTQyYTEyN2Y5OTAxNTY2N2RmYzI4MWFiNzIyOTBiNDE5YWYzMDU1MDEiLCAiNzNhOGQ0NTM4NWNjNjM5NjQyYzEzMzcxYTczMzFlMTFlOTM2MzY4NjI4MDk1NTYzNGMxM2NlNTJlZjcxOGUwNCIsICI3ZjdlNWExMzk1MzQ4M2E1Yzc3NmUyNDYxNmRkMDA2MTNhOGU1NGQ3YWRhNGI3MWQ3ZDMxZGZkNTA4ZTlhZTA0IiwgIjk1MGQ5ZGU2NWVhOWUyNWJmYWIxNmE3NTQ1N2UzZjQ1ZDM4MjQzNWQ5MTVjZmU4ZGYzODkyNWY0NGViZTkzMDIiLCAiYTJiNGQzMjA3ZGY2YzliNTkyNmRjNjYwOGY3OGY2ZDE5YWY3NDE4YTI1MjBjNzQ5OTkyMmIxNWQ2NjRiNGYwNCIKICAgICAgICAgIF0sIAogICAgICAgICAgIihzdGQ6OnZlY3RvcjxzY2FsYXJfdD4mKShyX3gpIjogWyAiYjgyYjg2YjgxYzIyZDU3ZDhkYjdhNGU1OTJjNmQ3NGQyMWFlZTViMWQzNDkzZThiZjVjODBkYmZjZDI3OWYwYSIsICI1YWRhOWM2OWEyNmQyMGVlNDNjNGYzNWY0NWJhMDY1OTRhYTQ1ZjNiNTEwY2VjZTJkMWMyNDRiMzk2NTVkZDA1IiwgImQ1MzNjNDUzMWU3YTY0MTI5ZjM3YjY2Y2FlODg0OWRmNWNmNWVlY2FmYzY5MjBjY2U3MTM5YzE0YWY1ZDAzMDAiLCAiODUwMjI2NTNmZDZhZDAwMzI4NzViZmUzMDIxOTViYWYwNTgzOWFjZjc5YjA5YzcwODc5MjlhYzQwZDA1YTQwNCIsICJlN2VhZGQ3MDZiZjUzMmFhZjNlYjIwOTM1N2EyYTJjMTFlNTg2M2NhZDExMjgyZTkwMmU5ODgzMTQ1ZmFhMzAyIiwgImMwMGI2ODJhMmIzNWVmMmZkM2Q1YzQyYWY3NGFmMzlmNmVmZDU4MDQ3NmY2YzYxYjg5Yjg5NWEyZjY5ZTNjMGIiLCAiYTQ3NWYzMmJiNjY2ZDQ4N2UxMWZmNDdmMDg3YmQ5YzlmNGExYjgwMmM2ODM1ZjIyNzFmMmJjNjkxYjAzNzAwZiIsICIzMjcyZDAwN2JjNDY1ZjMwNGFiMmE2ODlmNDY2MDMwMWVhZmVjYmZlYTYwZGZmMjY0NmM1ZjE1NjcxNTBmZTA4IiwgImM4ZjA5Yjc2NmI0ZjE3ODkwZTg5NzBiNWE2ODYzNzM5OWQxMTA2YWQwNDFmYjAyOTFjZDc0OGE1M2YzMzFmMGEiLCAiZWM4ZjNlMjU4YTZhN2E5MTQ4NWIxNTFkODgxZjc5ZDc5OWY4NzYxMTU2ZjhkYjBjNzI5YTM4OGRhODdiMWMwNyIsICI2NmMyMTg2ZTBkODNlYWE1Y2IwOWI2NTkzOTUwNGM3M2ZlMzFlMDNmMGQ1NWRkNzMyN2YyMGY1YzY5NmNkODBjIiwgIjFiMWY4ZGVhOGFmYzFiMDgyNDA0MWE4MWE5NjY1ZDFmYzM4NzBmOTM3YmY2MGMwNGE2NGJkMWJhNmNiNDY5MGQiLCAiNGJmZjRkNjhlMWVlNzdmYzZiY2Q4Mzk2YzRhOTAxNWNjZTZmYzQxNWJiNjMzZWY2NzkxMGJkNjhkMjViMzQwMyIsICJkZDM3Mzk0ZWFmZmJlMTMwY2VhYTRlNTJkMzNiMzBkNTVhMDdhNDNmOTJmM2Y1MTkxN2UyMzFjZDY3ODRjNjA3IiwgImNmOWNmY2JlMDQ1OGMwZGY1ZDc2OWIzYzc2NWQ5MTVkOTlhYTE5ZjU1NzlkMmEwMWVkOWY4NWJkYTg2ZDA1MDciLCAiMzE5ZjhiYzE5NDI1Njg1MTMwMWUzNDY5NDgzMzhlMDRmYjEyY2NkZGQ4MTIwMzZmNTc3MDlhNmQzMTJhZjcwYSIKICAgICAgICAgIF0sIAogICAgICAgICAgIksxIjogImE3NzU1YTU5M2M5YWZhYjFjNTNiNmYwNDYyN2I0NzIzODczMzBiZmYwYjIyMDYwMjlmN2RjYjU3MGQ0ZWM4YjMiLCAKICAgICAgICAgICJLMiI6ICIwNmQ5MTQ5ZmM4MjI0M2NlODYzYWM3YTk5MWQxNzhkNGE5NGIyYzRhMDk3MzFjZGZkYzgxYThlMmQ0YjkxYjY3IgogICAgICAgIH0KICAgICAgfQogICAgfQogIF0sIAogICJwcm9vZnMiOiBbIHsKICAgICAgInpjX2Fzc2V0X3N1cmplY3Rpb25fcHJvb2YiOiB7CiAgICAgICAgImJnZV9wcm9vZnMiOiBbIHsKICAgICAgICAgICAgIkEiOiAiNTM4M2VmZmUzN2RhZTFiZjFlNmU1ZDc1MzA0MDkwYmI0YjZmNThlMzQzMjRkMWM1NDIwMjMyNTQ2MTJhM2I2YiIsIAogICAgICAgICAgICAiQiI6ICIyYWI5MjdmZjY0MjQ3N2E4NDUwMDgxNDhjZWE2NmE5NzM3NDY5Y2VhY2FjMDM4NTMwZDlhNDY3YjJmODA5OWFhIiwgCiAgICAgICAgICAgICJQayI6IFsgIjk3ZDU4NTBjNjNhMTQxYTAxYzg4NzJjMDA2MGZhMTY2MTMzOWQ1ZWRlMmFjNWY1NTBiOWEzM2U1OGJiYjk5NmIiCiAgICAgICAgICAgIF0sIAogICAgICAgICAgICAiZiI6IFsgImRlYzE5NTY2MDFhMDZlOWU4YWNjYTcyN2QzZTU0Mzg0MDcwMjEwZTA1NThkMDQxODk1ODU0YjE1ZTJiYTM2MDEiLCAiZGRiMTJiYmMyZDQxODM4OTVlNGRhZmIzYTI4YzMzNTdkZWQxN2I4MTk1YjU1MDM4MTIxMzg3MjI3ZWY5YzAwYSIsICJmNGZkZjljZDRkM2E5ZDgyYWUwYTY0ZWQzNTJiYmY2ZDk2MzQ4NDUzYzEzYmExZmRmNDljNjY3YTczOWI3NzBmIgogICAgICAgICAgICBdLCAKICAgICAgICAgICAgInkiOiAiNjBkZWM3OTQwYzNmZjE0ZmY3MDZhODQxZTdiYjViYzVkNTVhNWZkMzczNDkwNDE1ZjgwNWU1MTM4OTZhMGYwZCIsIAogICAgICAgICAgICAieiI6ICI0ZWJjYTZlODkxOWRhZmNhOGFkNTM3NTIzMDVkMDJjNTYxMmY1NDZkYTg5ZjFiYWMzMzBmMDJlYWMzZmQwNDA1IgogICAgICAgICAgfSwgewogICAgICAgICAgICAiQSI6ICI3NDc3MGM4ZDQ2YWIzYzg2NmEwYTZjZjYxMGM5MTRjNzIxNTBkNjBiN2VlYjMzM2Q5MjE0OTM3NjY5MjBiODk0IiwgCiAgICAgICAgICAgICJCIjogIjk0MzRlZTcyYTg1YTA2YjUyMTYxNGMzZDM3MDgzMGIyYzE1ZWRmNTcwNGJkMmVjZTg5Nzg0MGMwZjdkZjZkMGIiLCAKICAgICAgICAgICAgIlBrIjogWyAiMTJkOThmNGQ5ZTJkZmQzYmJhY2Y0M2RlZTAxMDc1NzY5OTIxY2ZlMTU4ZTEzNmMxMjJhYzAxZGYzMWUyZGEyOSIKICAgICAgICAgICAgXSwgCiAgICAgICAgICAgICJmIjogWyAiMTRkMDE4ZTFjOWQwMDRhZTRlNDdmZTFhNWUxM2U0NGQ2ZDdhMTBhNjcxYWU3YTMzZjBkM2VjZDlmZWUyOGQwOCIsICJiN2I4OGEzYmM5ZGQ3M2U5ZGM2YTlkZWU0MTNjMjg2MWNiNTEyNDU4MGVlZmZhMGEzM2FjYmYxZmYzMTNjMTAzIiwgImVmNjliNTJlNDE0ZWVkNmFhMTI1MWU5M2JjN2NhZGQ2MGZlMzYyODI4ZWE5YTUxMzFjYmJkN2Y4Y2VhNWI0MDQiCiAgICAgICAgICAgIF0sIAogICAgICAgICAgICAieSI6ICJiY2ExODFlZTU3NjU3YjJiOWUzY2JkYmY5ZTBmNDJiZDQ0YTk5NTgzZWY4ZmZjYTAxMjdmNjFiNTIyYmQ2ZTA2IiwgCiAgICAgICAgICAgICJ6IjogImNiNzJiYTZlNjRhMWY5MmNjOTA3YzBlYmQ4NjJiYmRlZTlmOWQ2MTQ1ZGZjNmIzMWU4M2FjOTE3MDcyNjQzMDIiCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9CiAgICB9LCB7CiAgICAgICJ6Y19vdXRzX3JhbmdlX3Byb29mIjogewogICAgICAgICJicHAiOiB7CiAgICAgICAgICAiTCI6IFsgImViM2IyNWM1MGQyYjYwOTU4OTYxNmUyMDhlZDJlNWI1NjRkY2UzZDQzNmVkNGUzZTYyMDg4N2NlZmMzYjBlNWIiLCAiMDA1YmFiODYzYzE3M2U0OGRkMzIyYjY4Y2U0NWU4YzA1ZjcwZTdmZTkxNGQ1MTVmMDBkOGMzOTUwZTczNDdjMCIsICI2ZDZkZjUxZTlmNjlmNTE3NjhjNzg3ZGQ5NmJiYjIwMmM0MmNkMDgzMGFlNDk0NDEwOWVhY2I2MWFhMjI3ZTY5IiwgIjJhMjJjODExNTE3MTVjN2YyZmJhZjY0NDQ0ZjlhMGZhYzQ2ZTcxNDE4ZTBhYjZlNTdmNzdiYzI4ZmIyMzZmMmYiLCAiOTIwOTBjNWQ2NDJlNzdiNjRmOTU5NjQ4ZjU5YTllMDVkMTgxZmZkZTY3MDdhY2Q5Y2ZhYzE0YzQ1OGZkZjdkMCIsICJmOTQwMWJkMjE2YWNkMTFiMDZkMDRiNmI0OWRiMWY1MTNmOWFmZjViZGY0NjIzMDdkMTgzY2UwMTI4NmZlZDk1IiwgIjMyOTQ5ZTdhYjMxNGFmMTM3ZGYzNTE2MGRkNjMyZjRjYmY1MjYyMGNjYzkxMWNjZDBlMzE2OGI1OWQ2Mjk0YjEiCiAgICAgICAgICBdLCAKICAgICAgICAgICJSIjogWyAiNTlmZGE2MDNmZTBlMGI1ZTIwMWRjNDVkNzIyYjBjNDA3OGM5MGI0Mjc0YmUwZDUzMDdmY2JkYWE1NmZlNWQ0OSIsICJiNDMwOThkZTZhOTQ2MjkxN2MzOWE5M2IzOWQ3MDJmN2YyOWQ1NjA5OWRjZTMwNDFhMTk0NWRhOTQ5NzQ5NTM4IiwgIjRkNTdhODRjMzI3Y2Q5MGJmNzYyMjU5MTdhMzFlZWI2OWU4OWM0NWZmNGQ4NDVhMWY1MTY3ZDgwMmMyOTRhNDEiLCAiM2E5MjIxMmJjZTZjOWQ4ZTJhOTZjNWJmOTI4MDVmMWE4NGRmMmRjMDQyYmVhNDJjYzNhMjkzYTViOTczOTJjMiIsICI4MTVmMjFjYWIyODJiNzg3YjhiMWU3ZjQyN2UwY2MxZDM1OTdmMGEwMmM2M2M0ZGEzNDkzZjQ4OGYzMGE1YWUyIiwgIjgxN2MwYWQ2NThiNzMxZGE3YjBhMDBlYjFkYjJjMTEzMWQzYjRlYWRiMzgwNGE4OGMyM2E1NjMwNGQzZTM4NDYiLCAiZjY0MjAzOGI2YzNjY2I0OWFkZWQyNjk0YjRmNGQ5NDY1ZTVkMGFlNDdhMzNjZTM2ZmNhNjU4NmE1ZDVhNGFlNiIKICAgICAgICAgIF0sIAogICAgICAgICAgIkEwIjogImZmNmRmMzkxZmI3MmNkY2Q4NzAwOGY0YTM1M2M5ODc5MTA5NTE1N2ZhMDBjNDE5YTJkZjdiNzAzMGJlZWVmMjgiLCAKICAgICAgICAgICJBIjogImRhMGUxZWZiOTVkOGVmMTdiNDNkODY1MjE1MThiYTAxMjNjMDQ2ZTE0ZDk3Y2M4NmNjMGYzMWI1Y2NmYzU0ZmUiLCAKICAgICAgICAgICJCIjogIjE2ZmI3NDNjMGExMWQzM2QxYjMxYTk0NzYwMjg0ZTgzYjUzYjVhMTM0MGJlNDdlNWIyNjdlZjY0NzNlYzlmMDciLCAKICAgICAgICAgICJyIjogIjE1ZTkwMDBkMDk0ZTRiNzEwY2Q5OTM3Zjg4NTRiYWE3OTVmM2ViNDc1NThiN2MwODZkYWI4Yjg3ODUxYTEyMGEiLCAKICAgICAgICAgICJzIjogIjIyZWRlYjVkOGM4ZDY2MjJmNWM3YzM3MTFjM2ZlZjVhZjE0ZGFiZWQzZWJjNDI5NjQ3ZjNhYTQ2NDI1ZTNmMDMiLCAKICAgICAgICAgICJkZWx0YSI6ICJmOWY1YTM0NTIwZmJmNjA0ZjA4ZmY3YzFhZWMyOTYzNmMyN2Q0OTVmMGMwOWRiYTQ5NjJmNWFjYmY4OTFiNjAxIgogICAgICAgIH0sIAogICAgICAgICJhZ2dyZWdhdGlvbl9wcm9vZiI6IHsKICAgICAgICAgICJhbW91bnRfY29tbWl0bWVudHNfZm9yX3JwX2FnZ3JlZ2F0aW9uIjogWyAiZmM1ZjBlNjUxMDVlZDIyNjA3OWM3YTgwZjgyZGIyZWU5OTcyZjhiZDY3NDdiNzMyNWFmMDNkY2YzNjBkMTk0MSIsICI0YTQ3YzEyNzg4YzU1MGZjOWIwZTE2YmU0OGNjNjBkNzU0YzcwMmIwNjJiYjk0MDYwNzcyN2JiYjg0ZDdiOTE4IgogICAgICAgICAgXSwgCiAgICAgICAgICAiKHN0ZDo6dmVjdG9yPHNjYWxhcl90PiYpKHkwcykiOiBbICIwNWRjZDEyYzYxMmI3M2M3YjI1YWRmNTkwZGU5MTIwMzczYjg5MGU1ZDEwNGQ3OWM1ZDY0NTJmOTczNjFjYzAwIiwgIjlmNGViNTU3MWZhNmZjNzNkMmMwMjFlY2QzY2RkNmVmODY5MDAyODNiMmRlNjgyYTdkNDU0ZmI0MzhlMDI3MDIiCiAgICAgICAgICBdLCAKICAgICAgICAgICIoc3RkOjp2ZWN0b3I8c2NhbGFyX3Q+JikoeTFzKSI6IFsgIjQ4MDM4NDQ0YTAwNDUyYTE5OTRlOTZkYmM0NzBiNzU1MzJmZWU3Yjk4ZmJhNzcxY2M5MTA1NzQwNzAxNjY0MGQiLCAiMTNjOTM5Yjc3OThkMGMxY2U2MDE4ZjBhYjA1ZWZjZjM5ZTI5MGUxZDU4ZWYyMWFjY2FhNWVjYmIwMTg4ZjIwYyIKICAgICAgICAgIF0sIAogICAgICAgICAgImMiOiAiMmY5OGZiMzczMGRkOWNhZGJlNmRhNWNmZWZmMGU3ODUzZTYwNmM5NWRkNDM3MGRhYzY5NTZhYTg3NTFmZjMwYyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sIHsKICAgICAgInpjX2JhbGFuY2VfcHJvb2YiOiB7CiAgICAgICAgImRzcyI6IHsKICAgICAgICAgICJjIjogIjFhMjA0ZTc0MDRkNWIyYTc4YjhjMGI0YTBjMTQ3YzUzYjJkMmNhODRmODYzNDgxMDZmNzYzYzlkMTg0NGM3MGMiLCAKICAgICAgICAgICJ5MCI6ICI3NGQ3MWNmZjA1NmU5YmZhMjIxZTYxMzc1MjRkMTg0NDJkYjU4NjRlNWUyNWJkOTRlNDBmNjRlNTA4ODA2ZjBiIiwgCiAgICAgICAgICAieTEiOiAiNjUyOTIwYzZkMDJmNWNmYjE2Mzg3MzU1MjliZDExZjJmYjExYWVkODljNGU0NDg1YTVmNzkzYjlhMzI0YjcwYiIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICBdCn0=';
diff --git a/tsconfig.build.json b/tsconfig.build.json
new file mode 100644
index 0000000..fd15c57
--- /dev/null
+++ b/tsconfig.build.json
@@ -0,0 +1,7 @@
+{
+ "extends": "./tsconfig.json",
+ "include": [
+ "src/**/*"
+ ],
+ "exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..c430308
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,18 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "declaration": true,
+ "removeComments": true,
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "allowSyntheticDefaultImports": true,
+ "esModuleInterop": true,
+ "resolveJsonModule": true,
+ "target": "es2021",
+ "sourceMap": true,
+ "outDir": "./dist",
+ "baseUrl": "./",
+ "incremental": true,
+ "skipLibCheck": true
+ }
+}
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..b17b93c
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,5078 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.2.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
+ integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@babel/code-frame@7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
+ integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==
+ dependencies:
+ "@babel/highlight" "^7.10.4"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465"
+ integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==
+ dependencies:
+ "@babel/highlight" "^7.24.7"
+ picocolors "^1.0.0"
+
+"@babel/compat-data@^7.25.2":
+ version "7.25.4"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb"
+ integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==
+
+"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77"
+ integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.24.7"
+ "@babel/generator" "^7.25.0"
+ "@babel/helper-compilation-targets" "^7.25.2"
+ "@babel/helper-module-transforms" "^7.25.2"
+ "@babel/helpers" "^7.25.0"
+ "@babel/parser" "^7.25.0"
+ "@babel/template" "^7.25.0"
+ "@babel/traverse" "^7.25.2"
+ "@babel/types" "^7.25.2"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.25.0", "@babel/generator@^7.25.6":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c"
+ integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==
+ dependencies:
+ "@babel/types" "^7.25.6"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jsesc "^2.5.1"
+
+"@babel/helper-compilation-targets@^7.25.2":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c"
+ integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==
+ dependencies:
+ "@babel/compat-data" "^7.25.2"
+ "@babel/helper-validator-option" "^7.24.8"
+ browserslist "^4.23.1"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-module-imports@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b"
+ integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-module-transforms@^7.25.2":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6"
+ integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.24.7"
+ "@babel/helper-simple-access" "^7.24.7"
+ "@babel/helper-validator-identifier" "^7.24.7"
+ "@babel/traverse" "^7.25.2"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878"
+ integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==
+
+"@babel/helper-simple-access@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3"
+ integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-string-parser@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d"
+ integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==
+
+"@babel/helper-validator-identifier@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db"
+ integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==
+
+"@babel/helper-validator-option@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d"
+ integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==
+
+"@babel/helpers@^7.25.0":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60"
+ integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==
+ dependencies:
+ "@babel/template" "^7.25.0"
+ "@babel/types" "^7.25.6"
+
+"@babel/highlight@^7.10.4", "@babel/highlight@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d"
+ integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.24.7"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
+
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f"
+ integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==
+ dependencies:
+ "@babel/types" "^7.25.6"
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-bigint@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
+ integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-class-static-block@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
+ integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-import-attributes@^7.24.7":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde"
+ integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+
+"@babel/plugin-syntax-import-meta@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+ integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-private-property-in-object@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
+ integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/template@^7.25.0", "@babel/template@^7.3.3":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a"
+ integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==
+ dependencies:
+ "@babel/code-frame" "^7.24.7"
+ "@babel/parser" "^7.25.0"
+ "@babel/types" "^7.25.0"
+
+"@babel/traverse@^7.1.0", "@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41"
+ integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==
+ dependencies:
+ "@babel/code-frame" "^7.24.7"
+ "@babel/generator" "^7.25.6"
+ "@babel/parser" "^7.25.6"
+ "@babel/template" "^7.25.0"
+ "@babel/types" "^7.25.6"
+ debug "^4.3.1"
+ globals "^11.1.0"
+
+"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6"
+ integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==
+ dependencies:
+ "@babel/helper-string-parser" "^7.24.8"
+ "@babel/helper-validator-identifier" "^7.24.7"
+ to-fast-properties "^2.0.0"
+
+"@bcoe/v8-coverage@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
+ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+
+"@cnakazawa/watch@^1.0.3":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a"
+ integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==
+ dependencies:
+ exec-sh "^0.3.2"
+ minimist "^1.2.0"
+
+"@cspotcode/source-map-support@^0.8.0":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
+ integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
+ dependencies:
+ "@jridgewell/trace-mapping" "0.3.9"
+
+"@eslint/eslintrc@^0.4.3":
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
+ integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.1.1"
+ espree "^7.3.0"
+ globals "^13.9.0"
+ ignore "^4.0.6"
+ import-fresh "^3.2.1"
+ js-yaml "^3.13.1"
+ minimatch "^3.0.4"
+ strip-json-comments "^3.1.1"
+
+"@humanwhocodes/config-array@^0.5.0":
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
+ integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==
+ dependencies:
+ "@humanwhocodes/object-schema" "^1.2.0"
+ debug "^4.1.1"
+ minimatch "^3.0.4"
+
+"@humanwhocodes/object-schema@^1.2.0":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
+ integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+
+"@istanbuljs/load-nyc-config@^1.0.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
+ integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
+ 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"
+
+"@istanbuljs/schema@^0.1.2":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
+ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
+
+"@jest/console@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2"
+ integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==
+ dependencies:
+ "@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"
+
+"@jest/core@^26.6.3":
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad"
+ integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==
+ dependencies:
+ "@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"
+
+"@jest/environment@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c"
+ integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==
+ dependencies:
+ "@jest/fake-timers" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ "@types/node" "*"
+ jest-mock "^26.6.2"
+
+"@jest/fake-timers@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad"
+ integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==
+ dependencies:
+ "@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@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a"
+ integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==
+ dependencies:
+ "@jest/environment" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ expect "^26.6.2"
+
+"@jest/reporters@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6"
+ integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==
+ dependencies:
+ "@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"
+ 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"
+ optionalDependencies:
+ node-notifier "^8.0.0"
+
+"@jest/source-map@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535"
+ integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==
+ dependencies:
+ callsites "^3.0.0"
+ graceful-fs "^4.2.4"
+ source-map "^0.6.0"
+
+"@jest/test-result@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18"
+ integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==
+ dependencies:
+ "@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@^26.6.3":
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17"
+ integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==
+ dependencies:
+ "@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@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b"
+ integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==
+ dependencies:
+ "@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"
+
+"@jest/types@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e"
+ integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^15.0.0"
+ chalk "^4.0.0"
+
+"@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+ dependencies:
+ "@jridgewell/set-array" "^1.2.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
+ integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+
+"@jridgewell/trace-mapping@0.3.9":
+ version "0.3.9"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9"
+ integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+ version "0.3.25"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
+ integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@microsoft/tsdoc-config@0.16.2":
+ version "0.16.2"
+ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz#b786bb4ead00d54f53839a458ce626c8548d3adf"
+ integrity sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==
+ dependencies:
+ "@microsoft/tsdoc" "0.14.2"
+ ajv "~6.12.6"
+ jju "~1.4.0"
+ resolve "~1.19.0"
+
+"@microsoft/tsdoc@0.14.2":
+ version "0.14.2"
+ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz#c3ec604a0b54b9a9b87e9735dfc59e1a5da6a5fb"
+ integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@sinonjs/commons@^1.7.0":
+ version "1.8.6"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9"
+ integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^6.0.1":
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40"
+ integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
+
+"@tootallnate/once@1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
+ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
+
+"@tsconfig/node10@^1.0.7":
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2"
+ integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==
+
+"@tsconfig/node12@^1.0.7":
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d"
+ integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==
+
+"@tsconfig/node14@^1.0.0":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1"
+ integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
+
+"@tsconfig/node16@^1.0.2":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9"
+ integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==
+
+"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7":
+ version "7.20.5"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017"
+ integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==
+ dependencies:
+ "@babel/parser" "^7.20.7"
+ "@babel/types" "^7.20.7"
+ "@types/babel__generator" "*"
+ "@types/babel__template" "*"
+ "@types/babel__traverse" "*"
+
+"@types/babel__generator@*":
+ version "7.6.8"
+ resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab"
+ integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f"
+ integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6":
+ version "7.20.6"
+ resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7"
+ integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==
+ dependencies:
+ "@babel/types" "^7.20.7"
+
+"@types/big.js@^6":
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/@types/big.js/-/big.js-6.2.2.tgz#69422ec9ef59df1330ccfde2106d9e1159a083c3"
+ integrity sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==
+
+"@types/bn.js@*":
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.2.0.tgz#4349b9710e98f9ab3cdc50f1c5e4dcbd8ef29c80"
+ integrity sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==
+ dependencies:
+ "@types/node" "*"
+
+"@types/elliptic@^6.4.18":
+ version "6.4.18"
+ resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.18.tgz#bc96e26e1ccccbabe8b6f0e409c85898635482e1"
+ integrity sha512-UseG6H5vjRiNpQvrhy4VF/JXdA3V/Fp5amvveaL+fs28BZ6xIKJBPnUPRlEaZpysD9MbpfaLi8lbl7PGUAkpWw==
+ dependencies:
+ "@types/bn.js" "*"
+
+"@types/graceful-fs@^4.1.2":
+ version "4.1.9"
+ resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4"
+ integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7"
+ integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==
+
+"@types/istanbul-lib-report@*":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf"
+ integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==
+ dependencies:
+ "@types/istanbul-lib-coverage" "*"
+
+"@types/istanbul-reports@^3.0.0":
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54"
+ integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==
+ dependencies:
+ "@types/istanbul-lib-report" "*"
+
+"@types/jest@^26.0.24":
+ version "26.0.24"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a"
+ integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==
+ dependencies:
+ jest-diff "^26.0.0"
+ pretty-format "^26.0.0"
+
+"@types/json-schema@^7.0.7":
+ version "7.0.15"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
+
+"@types/keccak@^3.0.5":
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@types/keccak/-/keccak-3.0.5.tgz#76db7c4fa73f1706cc396754cc890bb5d71398a7"
+ integrity sha512-Mvu4StIJ9KyfPXDVRv3h0fWNBAjHPBQZ8EPcxhqA8FG6pLzxtytVXU5owB6J2/8xZ+ZspWTXJEUjAHt0pk0I1Q==
+ dependencies:
+ "@types/node" "*"
+
+"@types/node@*":
+ version "22.5.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.1.tgz#de01dce265f6b99ed32b295962045d10b5b99560"
+ integrity sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw==
+ dependencies:
+ undici-types "~6.19.2"
+
+"@types/node@^18":
+ version "18.19.111"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.111.tgz#e95b89efc24cc625834b43bcd70bd5591a5dfba5"
+ integrity sha512-90sGdgA+QLJr1F9X79tQuEut0gEYIfkX9pydI4XGRgvFo9g2JWswefI+WUSUHPYVBHYSEfTEqBxA5hQvAZB3Mw==
+ dependencies:
+ undici-types "~5.26.4"
+
+"@types/normalize-package-data@^2.4.0":
+ version "2.4.4"
+ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901"
+ integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==
+
+"@types/prettier@^2.0.0":
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f"
+ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==
+
+"@types/stack-utils@^2.0.0":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8"
+ integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==
+
+"@types/yargs-parser@*":
+ version "21.0.3"
+ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15"
+ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==
+
+"@types/yargs@^15.0.0":
+ version "15.0.19"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9"
+ integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+"@typescript-eslint/eslint-plugin@^4.28.2":
+ version "4.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276"
+ integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==
+ dependencies:
+ "@typescript-eslint/experimental-utils" "4.33.0"
+ "@typescript-eslint/scope-manager" "4.33.0"
+ debug "^4.3.1"
+ functional-red-black-tree "^1.0.1"
+ ignore "^5.1.8"
+ regexpp "^3.1.0"
+ semver "^7.3.5"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/experimental-utils@4.33.0", "@typescript-eslint/experimental-utils@^4.0.1":
+ version "4.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd"
+ integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==
+ dependencies:
+ "@types/json-schema" "^7.0.7"
+ "@typescript-eslint/scope-manager" "4.33.0"
+ "@typescript-eslint/types" "4.33.0"
+ "@typescript-eslint/typescript-estree" "4.33.0"
+ eslint-scope "^5.1.1"
+ eslint-utils "^3.0.0"
+
+"@typescript-eslint/parser@^4.28.2":
+ version "4.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899"
+ integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==
+ dependencies:
+ "@typescript-eslint/scope-manager" "4.33.0"
+ "@typescript-eslint/types" "4.33.0"
+ "@typescript-eslint/typescript-estree" "4.33.0"
+ debug "^4.3.1"
+
+"@typescript-eslint/scope-manager@4.33.0":
+ version "4.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3"
+ integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==
+ dependencies:
+ "@typescript-eslint/types" "4.33.0"
+ "@typescript-eslint/visitor-keys" "4.33.0"
+
+"@typescript-eslint/types@4.33.0":
+ version "4.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72"
+ integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==
+
+"@typescript-eslint/typescript-estree@4.33.0":
+ version "4.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609"
+ integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==
+ dependencies:
+ "@typescript-eslint/types" "4.33.0"
+ "@typescript-eslint/visitor-keys" "4.33.0"
+ debug "^4.3.1"
+ globby "^11.0.3"
+ is-glob "^4.0.1"
+ semver "^7.3.5"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/visitor-keys@4.33.0":
+ version "4.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd"
+ integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==
+ dependencies:
+ "@typescript-eslint/types" "4.33.0"
+ eslint-visitor-keys "^2.0.0"
+
+abab@^2.0.3, abab@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
+ integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
+
+acorn-globals@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45"
+ integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==
+ dependencies:
+ acorn "^7.1.1"
+ acorn-walk "^7.1.1"
+
+acorn-jsx@^5.3.1:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn-walk@^7.1.1:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
+ integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
+
+acorn-walk@^8.1.1:
+ version "8.3.3"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e"
+ integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==
+ dependencies:
+ acorn "^8.11.0"
+
+acorn@^7.1.1, acorn@^7.4.0:
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+ integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+acorn@^8.11.0, acorn@^8.2.4, acorn@^8.4.1:
+ version "8.12.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248"
+ integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
+
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+ajv@^6.10.0, ajv@^6.12.4, ajv@~6.12.6:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ajv@^8.0.1:
+ version "8.17.1"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6"
+ integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+ fast-uri "^3.0.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+
+ansi-colors@^4.1.1:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
+ integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
+
+ansi-escapes@^4.2.1:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^5.0.0, ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+anymatch@^3.0.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+arg@^4.1.0:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+ integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==
+
+array-buffer-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f"
+ integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==
+ dependencies:
+ call-bind "^1.0.5"
+ is-array-buffer "^3.0.4"
+
+array-includes@^3.1.7:
+ version "3.1.8"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d"
+ integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.4"
+ is-string "^1.0.7"
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==
+
+array.prototype.findlastindex@^1.2.3:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d"
+ integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ es-shim-unscopables "^1.0.2"
+
+array.prototype.flat@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18"
+ integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ es-shim-unscopables "^1.0.0"
+
+array.prototype.flatmap@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527"
+ integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ es-shim-unscopables "^1.0.0"
+
+arraybuffer.prototype.slice@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6"
+ integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==
+ dependencies:
+ array-buffer-byte-length "^1.0.1"
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
+ es-abstract "^1.22.3"
+ es-errors "^1.2.1"
+ get-intrinsic "^1.2.3"
+ is-array-buffer "^3.0.4"
+ is-shared-array-buffer "^1.0.2"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==
+
+astral-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+ integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+available-typed-arrays@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
+ integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
+ dependencies:
+ possible-typed-array-names "^1.0.0"
+
+axios@^0.21.1:
+ version "0.21.4"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
+ integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
+ dependencies:
+ follow-redirects "^1.14.0"
+
+babel-jest@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056"
+ integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==
+ dependencies:
+ "@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"
+
+babel-plugin-istanbul@^6.0.0:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
+ integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==
+ 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"
+
+babel-plugin-jest-hoist@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d"
+ integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==
+ dependencies:
+ "@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@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30"
+ integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==
+ dependencies:
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-bigint" "^7.8.3"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/plugin-syntax-import-attributes" "^7.24.7"
+ "@babel/plugin-syntax-import-meta" "^7.10.4"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
+
+babel-preset-jest@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee"
+ integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==
+ dependencies:
+ babel-plugin-jest-hoist "^26.6.2"
+ babel-preset-current-node-syntax "^1.0.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+big.js@^6.1.1:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f"
+ integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==
+
+bn.js@^4.11.9:
+ version "4.12.1"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.1.tgz#215741fe3c9dba2d7e12c001d0cfdbae43975ba7"
+ integrity sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==
+
+bn.js@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
+ integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+braces@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+ dependencies:
+ fill-range "^7.1.1"
+
+brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==
+
+browser-process-hrtime@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
+ integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
+
+browserslist@^4.23.1:
+ version "4.23.3"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800"
+ integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==
+ dependencies:
+ caniuse-lite "^1.0.30001646"
+ electron-to-chromium "^1.5.4"
+ node-releases "^2.0.18"
+ update-browserslist-db "^1.1.0"
+
+bs-logger@0.x:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
+ integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==
+ dependencies:
+ fast-json-stable-stringify "2.x"
+
+bser@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
+ integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
+ dependencies:
+ node-int64 "^0.4.0"
+
+buffer-from@1.x, buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
+ integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ set-function-length "^1.2.1"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camelcase@^5.0.0, camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.0.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+caniuse-lite@^1.0.30001646:
+ version "1.0.30001653"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz#b8af452f8f33b1c77f122780a4aecebea0caca56"
+ integrity sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==
+
+capture-exit@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4"
+ integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==
+ dependencies:
+ rsvp "^4.8.4"
+
+chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+char-regex@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
+ integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
+
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+cjs-module-lexer@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f"
+ integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cliui@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+ integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^6.2.0"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==
+
+collect-v8-coverage@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9"
+ integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+component-emitter@^1.2.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17"
+ integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+convert-source-map@^1.4.0, convert-source-map@^1.6.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
+ integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==
+
+create-require@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+ integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+
+cross-spawn@^6.0.0:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cross-spawn@^7.0.0, cross-spawn@^7.0.2:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+cssom@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
+ integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
+
+cssom@~0.3.6:
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
+ integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
+
+cssstyle@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852"
+ integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==
+ dependencies:
+ cssom "~0.3.6"
+
+data-urls@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b"
+ integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==
+ dependencies:
+ abab "^2.0.3"
+ whatwg-mimetype "^2.3.0"
+ whatwg-url "^8.0.0"
+
+data-view-buffer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2"
+ integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+data-view-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2"
+ integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+data-view-byte-offset@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a"
+ integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4:
+ version "4.3.6"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b"
+ integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==
+ dependencies:
+ ms "2.1.2"
+
+debug@^2.2.0, debug@^2.3.3:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
+
+decimal.js@^10.2.1:
+ version "10.4.3"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
+ integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==
+
+decode-uri-component@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
+ integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+deepmerge@^4.2.2:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
+ integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
+
+define-data-property@^1.0.1, define-data-property@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
+
+define-properties@^1.2.0, define-properties@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+detect-newline@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
+ integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
+
+diff-sequences@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1"
+ integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==
+
+diff@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+ integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+doctrine@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+ integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+ dependencies:
+ esutils "^2.0.2"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+domexception@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
+ integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==
+ dependencies:
+ webidl-conversions "^5.0.0"
+
+electron-to-chromium@^1.5.4:
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6"
+ integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==
+
+elliptic@^6.5.4:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06"
+ integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+emittery@^0.7.1:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82"
+ integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+enquirer@^2.3.5:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56"
+ integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==
+ dependencies:
+ ansi-colors "^4.1.1"
+ strip-ansi "^6.0.1"
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2:
+ version "1.23.3"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0"
+ integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
+ dependencies:
+ array-buffer-byte-length "^1.0.1"
+ arraybuffer.prototype.slice "^1.0.3"
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ data-view-buffer "^1.0.1"
+ data-view-byte-length "^1.0.1"
+ data-view-byte-offset "^1.0.0"
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ es-set-tostringtag "^2.0.3"
+ es-to-primitive "^1.2.1"
+ function.prototype.name "^1.1.6"
+ get-intrinsic "^1.2.4"
+ get-symbol-description "^1.0.2"
+ globalthis "^1.0.3"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+ has-proto "^1.0.3"
+ has-symbols "^1.0.3"
+ hasown "^2.0.2"
+ internal-slot "^1.0.7"
+ is-array-buffer "^3.0.4"
+ is-callable "^1.2.7"
+ is-data-view "^1.0.1"
+ is-negative-zero "^2.0.3"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.3"
+ is-string "^1.0.7"
+ is-typed-array "^1.1.13"
+ is-weakref "^1.0.2"
+ object-inspect "^1.13.1"
+ object-keys "^1.1.1"
+ object.assign "^4.1.5"
+ regexp.prototype.flags "^1.5.2"
+ safe-array-concat "^1.1.2"
+ safe-regex-test "^1.0.3"
+ string.prototype.trim "^1.2.9"
+ string.prototype.trimend "^1.0.8"
+ string.prototype.trimstart "^1.0.8"
+ typed-array-buffer "^1.0.2"
+ typed-array-byte-length "^1.0.1"
+ typed-array-byte-offset "^1.0.2"
+ typed-array-length "^1.0.6"
+ unbox-primitive "^1.0.2"
+ which-typed-array "^1.1.15"
+
+es-define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845"
+ integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
+ dependencies:
+ get-intrinsic "^1.2.4"
+
+es-errors@^1.2.1, es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-object-atoms@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941"
+ integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==
+ dependencies:
+ es-errors "^1.3.0"
+
+es-set-tostringtag@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777"
+ integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
+ dependencies:
+ get-intrinsic "^1.2.4"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.1"
+
+es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763"
+ integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==
+ dependencies:
+ hasown "^2.0.0"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+escalade@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
+ integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+escodegen@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17"
+ integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==
+ dependencies:
+ esprima "^4.0.1"
+ estraverse "^5.2.0"
+ esutils "^2.0.2"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+eslint-import-resolver-node@^0.3.4, eslint-import-resolver-node@^0.3.9:
+ version "0.3.9"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac"
+ integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==
+ dependencies:
+ debug "^3.2.7"
+ is-core-module "^2.13.0"
+ resolve "^1.22.4"
+
+eslint-import-resolver-typescript@^2.4.0:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz#a90a4a1c80da8d632df25994c4c5fdcdd02b8751"
+ integrity sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==
+ dependencies:
+ debug "^4.3.4"
+ glob "^7.2.0"
+ is-glob "^4.0.3"
+ resolve "^1.22.0"
+ tsconfig-paths "^3.14.1"
+
+eslint-module-utils@^2.8.0:
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.2.tgz#2ecad69d71e1fa81f17f7f24d5d3e46b168de663"
+ integrity sha512-3XnC5fDyc8M4J2E8pt8pmSVRX2M+5yWMCfI/kDZwauQeFgzQOuhcRBFKjTeJagqgk4sFKxe1mvNVnaWwImx/Tg==
+ dependencies:
+ debug "^3.2.7"
+
+eslint-plugin-import-newlines@^1.1.7:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import-newlines/-/eslint-plugin-import-newlines-1.4.0.tgz#469cf3ebb5a8691ba827bdceb00e751bf2f084d1"
+ integrity sha512-+Cz1x2xBLtI9gJbmuYEpvY7F8K75wskBmJ7rk4VRObIJo+jklUJaejFJgtnWeL0dCFWabGEkhausrikXaNbtoQ==
+
+eslint-plugin-import@^2.23.4:
+ version "2.29.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643"
+ integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==
+ dependencies:
+ array-includes "^3.1.7"
+ array.prototype.findlastindex "^1.2.3"
+ array.prototype.flat "^1.3.2"
+ array.prototype.flatmap "^1.3.2"
+ debug "^3.2.7"
+ doctrine "^2.1.0"
+ eslint-import-resolver-node "^0.3.9"
+ eslint-module-utils "^2.8.0"
+ hasown "^2.0.0"
+ is-core-module "^2.13.1"
+ is-glob "^4.0.3"
+ minimatch "^3.1.2"
+ object.fromentries "^2.0.7"
+ object.groupby "^1.0.1"
+ object.values "^1.1.7"
+ semver "^6.3.1"
+ tsconfig-paths "^3.15.0"
+
+eslint-plugin-jest@^24.3.6:
+ version "24.7.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.7.0.tgz#206ac0833841e59e375170b15f8d0955219c4889"
+ integrity sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA==
+ dependencies:
+ "@typescript-eslint/experimental-utils" "^4.0.1"
+
+eslint-plugin-tsdoc@^0.2.14:
+ version "0.2.17"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.17.tgz#27789495bbd8778abbf92db1707fec2ed3dfe281"
+ integrity sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==
+ dependencies:
+ "@microsoft/tsdoc" "0.14.2"
+ "@microsoft/tsdoc-config" "0.16.2"
+
+eslint-scope@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^4.1.1"
+
+eslint-utils@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
+ integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
+ dependencies:
+ eslint-visitor-keys "^1.1.0"
+
+eslint-utils@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
+ integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
+ dependencies:
+ eslint-visitor-keys "^2.0.0"
+
+eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
+ integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
+
+eslint-visitor-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
+ integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
+
+eslint@^7.32.0:
+ version "7.32.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d"
+ integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==
+ dependencies:
+ "@babel/code-frame" "7.12.11"
+ "@eslint/eslintrc" "^0.4.3"
+ "@humanwhocodes/config-array" "^0.5.0"
+ ajv "^6.10.0"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.0.1"
+ doctrine "^3.0.0"
+ enquirer "^2.3.5"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^5.1.1"
+ eslint-utils "^2.1.0"
+ eslint-visitor-keys "^2.0.0"
+ espree "^7.3.1"
+ esquery "^1.4.0"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^6.0.1"
+ functional-red-black-tree "^1.0.1"
+ glob-parent "^5.1.2"
+ globals "^13.6.0"
+ ignore "^4.0.6"
+ import-fresh "^3.0.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ js-yaml "^3.13.1"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.4.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.0.4"
+ natural-compare "^1.4.0"
+ optionator "^0.9.1"
+ progress "^2.0.0"
+ regexpp "^3.1.0"
+ semver "^7.2.1"
+ strip-ansi "^6.0.0"
+ strip-json-comments "^3.1.0"
+ table "^6.0.9"
+ text-table "^0.2.0"
+ v8-compile-cache "^2.0.3"
+
+espree@^7.3.0, espree@^7.3.1:
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
+ integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==
+ dependencies:
+ acorn "^7.4.0"
+ acorn-jsx "^5.3.1"
+ eslint-visitor-keys "^1.3.0"
+
+esprima@^4.0.0, esprima@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.4.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7"
+ integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+exec-sh@^0.3.2:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc"
+ integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==
+
+execa@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
+ integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
+ dependencies:
+ cross-spawn "^6.0.0"
+ get-stream "^4.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+execa@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a"
+ integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==
+ dependencies:
+ 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@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+ integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+expect@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417"
+ integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==
+ dependencies:
+ "@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"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^3.2.9:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
+ integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+ 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"
+
+fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fast-uri@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134"
+ integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==
+
+fastq@^1.6.0:
+ version "1.17.1"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47"
+ integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
+ dependencies:
+ reusify "^1.0.4"
+
+fb-watchman@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c"
+ integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==
+ dependencies:
+ bser "2.1.1"
+
+file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+ dependencies:
+ flat-cache "^3.0.4"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+fill-range@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+find-up@^4.0.0, find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^3.0.4:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee"
+ integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
+ dependencies:
+ flatted "^3.2.9"
+ keyv "^4.5.3"
+ rimraf "^3.0.2"
+
+flatted@^3.2.9:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a"
+ integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
+
+follow-redirects@^1.14.0:
+ version "1.15.6"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
+ integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==
+ dependencies:
+ map-cache "^0.2.2"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@^2.1.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+function.prototype.name@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
+ integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ functions-have-names "^1.2.3"
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
+
+functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.1:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
+ integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+
+get-package-type@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
+ integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+
+get-stream@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-stream@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+get-symbol-description@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5"
+ integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==
+ dependencies:
+ call-bind "^1.0.5"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==
+
+glob-parent@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^13.6.0, globals@^13.9.0:
+ version "13.24.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
+ integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
+ dependencies:
+ type-fest "^0.20.2"
+
+globalthis@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
+ integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
+ dependencies:
+ define-properties "^1.2.1"
+ gopd "^1.0.1"
+
+globby@^11.0.3:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
+ slash "^3.0.0"
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+graceful-fs@^4.2.4:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+growly@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
+ integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
+ dependencies:
+ es-define-property "^1.0.0"
+
+has-proto@^1.0.1, has-proto@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
+ integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
+ integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
+ dependencies:
+ has-symbols "^1.0.3"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
+hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+hosted-git-info@^2.1.4:
+ version "2.8.9"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+ integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+html-encoding-sniffer@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
+ integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==
+ dependencies:
+ whatwg-encoding "^1.0.5"
+
+html-escaper@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
+ integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+
+http-proxy-agent@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
+ integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
+ dependencies:
+ "@tootallnate/once" "1"
+ agent-base "6"
+ debug "4"
+
+https-proxy-agent@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
+ integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+human-signals@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
+ integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ignore@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
+ integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+
+ignore@^5.1.8, ignore@^5.2.0:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
+
+import-fresh@^3.0.0, import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-local@^3.0.2:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260"
+ integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@^2.0.3, inherits@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+internal-slot@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802"
+ integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==
+ dependencies:
+ es-errors "^1.3.0"
+ hasown "^2.0.0"
+ side-channel "^1.0.4"
+
+is-accessor-descriptor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4"
+ integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==
+ dependencies:
+ hasown "^2.0.0"
+
+is-array-buffer@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98"
+ integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.1"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-ci@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+ integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+ dependencies:
+ ci-info "^2.0.0"
+
+is-core-module@^2.1.0, is-core-module@^2.13.0, is-core-module@^2.13.1:
+ version "2.15.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37"
+ integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
+ dependencies:
+ hasown "^2.0.2"
+
+is-data-descriptor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb"
+ integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==
+ dependencies:
+ hasown "^2.0.0"
+
+is-data-view@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f"
+ integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==
+ dependencies:
+ is-typed-array "^1.1.13"
+
+is-date-object@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-descriptor@^0.1.0:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33"
+ integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==
+ dependencies:
+ is-accessor-descriptor "^1.0.1"
+ is-data-descriptor "^1.0.1"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306"
+ integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==
+ dependencies:
+ is-accessor-descriptor "^1.0.1"
+ is-data-descriptor "^1.0.1"
+
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-generator-fn@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
+ integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-negative-zero@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747"
+ integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-potential-custom-element-name@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
+ integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688"
+ integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==
+ dependencies:
+ call-bind "^1.0.7"
+
+is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.13:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229"
+ integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==
+ dependencies:
+ which-typed-array "^1.1.14"
+
+is-typedarray@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
+
+is-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-wsl@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isarray@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
+
+istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756"
+ integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==
+
+istanbul-lib-instrument@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d"
+ integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==
+ dependencies:
+ "@babel/core" "^7.7.5"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-coverage "^3.0.0"
+ semver "^6.3.0"
+
+istanbul-lib-instrument@^5.0.4:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d"
+ integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==
+ 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"
+
+istanbul-lib-report@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d"
+ integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==
+ dependencies:
+ istanbul-lib-coverage "^3.0.0"
+ make-dir "^4.0.0"
+ supports-color "^7.1.0"
+
+istanbul-lib-source-maps@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551"
+ integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
+ dependencies:
+ debug "^4.1.1"
+ istanbul-lib-coverage "^3.0.0"
+ source-map "^0.6.1"
+
+istanbul-reports@^3.0.2:
+ version "3.1.7"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b"
+ integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==
+ dependencies:
+ html-escaper "^2.0.0"
+ istanbul-lib-report "^3.0.0"
+
+jest-changed-files@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0"
+ integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ execa "^4.0.0"
+ throat "^5.0.0"
+
+jest-cli@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a"
+ integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==
+ dependencies:
+ "@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"
+
+jest-config@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349"
+ integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==
+ dependencies:
+ "@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"
+
+jest-diff@^26.0.0, jest-diff@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394"
+ integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^26.6.2"
+ jest-get-type "^26.3.0"
+ pretty-format "^26.6.2"
+
+jest-docblock@^26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5"
+ integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==
+ dependencies:
+ detect-newline "^3.0.0"
+
+jest-each@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb"
+ integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==
+ dependencies:
+ "@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"
+
+jest-environment-jsdom@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e"
+ integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==
+ dependencies:
+ "@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@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c"
+ integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==
+ dependencies:
+ "@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@^26.3.0:
+ version "26.3.0"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0"
+ integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==
+
+jest-haste-map@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa"
+ integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==
+ dependencies:
+ "@jest/types" "^26.6.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 "^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"
+ optionalDependencies:
+ fsevents "^2.1.2"
+
+jest-jasmine2@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd"
+ integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==
+ dependencies:
+ "@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"
+
+jest-leak-detector@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af"
+ integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==
+ dependencies:
+ jest-get-type "^26.3.0"
+ pretty-format "^26.6.2"
+
+jest-matcher-utils@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a"
+ integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==
+ dependencies:
+ chalk "^4.0.0"
+ jest-diff "^26.6.2"
+ jest-get-type "^26.3.0"
+ pretty-format "^26.6.2"
+
+jest-message-util@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07"
+ integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==
+ dependencies:
+ "@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"
+
+jest-mock@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302"
+ integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ "@types/node" "*"
+
+jest-pnp-resolver@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e"
+ integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==
+
+jest-regex-util@^26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28"
+ integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==
+
+jest-resolve-dependencies@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6"
+ integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ jest-regex-util "^26.0.0"
+ jest-snapshot "^26.6.2"
+
+jest-resolve@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507"
+ integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==
+ dependencies:
+ "@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"
+
+jest-runner@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159"
+ integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==
+ dependencies:
+ "@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"
+
+jest-runtime@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b"
+ integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==
+ dependencies:
+ "@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"
+
+jest-serializer@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1"
+ integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==
+ dependencies:
+ "@types/node" "*"
+ graceful-fs "^4.2.4"
+
+jest-snapshot@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84"
+ integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==
+ dependencies:
+ "@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"
+
+jest-util@^26.1.0, jest-util@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1"
+ integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==
+ dependencies:
+ "@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"
+
+jest-validate@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec"
+ integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==
+ dependencies:
+ "@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"
+
+jest-watcher@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975"
+ integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==
+ dependencies:
+ "@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"
+
+jest-worker@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
+ integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^7.0.0"
+
+jest@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef"
+ integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==
+ dependencies:
+ "@jest/core" "^26.6.3"
+ import-local "^3.0.2"
+ jest-cli "^26.6.3"
+
+jju@~1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a"
+ integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==
+
+js-sha3@^0.9.3:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.9.3.tgz#f0209432b23a66a0f6c7af592c26802291a75c2a"
+ integrity sha512-BcJPCQeLg6WjEx3FE591wVAevlli8lxsxm9/FzV4HXkV49TmBH38Yvrpce6fjbADGMKFrBMGTqrVz3qPIZ88Gg==
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.13.1:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsdom@^16.4.0:
+ version "16.7.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710"
+ integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==
+ 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"
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json5@2.x, json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+json5@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
+ integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
+ dependencies:
+ minimist "^1.2.0"
+
+keccak@^3.0.3:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d"
+ integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==
+ dependencies:
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+ readable-stream "^3.6.0"
+
+keyv@^4.5.3:
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ dependencies:
+ json-buffer "3.0.1"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+
+leven@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+ integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash.truncate@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
+ integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==
+
+lodash@4.x, lodash@^4.7.0:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+make-dir@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e"
+ integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==
+ dependencies:
+ semver "^7.5.3"
+
+make-error@1.x, make-error@^1.1.1:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+makeerror@1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a"
+ integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==
+ dependencies:
+ tmpl "1.0.5"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==
+ dependencies:
+ object-visit "^1.0.0"
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.3.0, merge2@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+micromatch@^4.0.2, micromatch@^4.0.4:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
+
+minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.6:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@1.x:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+node-addon-api@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
+ integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+
+node-gyp-build@^4.2.0:
+ version "4.8.2"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa"
+ integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+ integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==
+
+node-notifier@^8.0.0:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5"
+ integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==
+ dependencies:
+ 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"
+
+node-releases@^2.0.18:
+ version "2.0.18"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
+ integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
+
+normalize-package-data@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+normalize-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==
+ dependencies:
+ path-key "^2.0.0"
+
+npm-run-path@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+nwsapi@^2.2.0:
+ version "2.2.12"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8"
+ integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-inspect@^1.13.1:
+ version "1.13.2"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff"
+ integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==
+ dependencies:
+ isobject "^3.0.0"
+
+object.assign@^4.1.5:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0"
+ integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==
+ dependencies:
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
+
+object.fromentries@^2.0.7:
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65"
+ integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
+
+object.groupby@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e"
+ integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==
+ dependencies:
+ isobject "^3.0.1"
+
+object.values@^1.1.7:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b"
+ integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+onetime@^5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+optionator@^0.9.1:
+ version "0.9.4"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734"
+ integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
+ 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.5"
+
+p-each-series@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a"
+ integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==
+
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-json@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+parse5@6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
+ integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^2.0.0, path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==
+
+path-key@^3.0.0, path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.6, path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+picocolors@^1.0.0, picocolors@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
+ integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
+
+picomatch@^2.0.4, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pirates@^4.0.1:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9"
+ integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==
+
+pkg-dir@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==
+
+possible-typed-array-names@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
+ integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+pretty-format@^26.0.0, pretty-format@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93"
+ integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ ansi-regex "^5.0.0"
+ ansi-styles "^4.0.0"
+ react-is "^17.0.1"
+
+progress@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+prompts@^2.0.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
+ integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
+psl@^1.1.33:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
+ integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+querystringify@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
+ integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+react-is@^17.0.1:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
+ integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
+
+read-pkg-up@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
+ integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
+ dependencies:
+ find-up "^4.1.0"
+ read-pkg "^5.2.0"
+ type-fest "^0.8.1"
+
+read-pkg@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
+ integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
+ dependencies:
+ "@types/normalize-package-data" "^2.4.0"
+ normalize-package-data "^2.5.0"
+ parse-json "^5.0.0"
+ type-fest "^0.6.0"
+
+readable-stream@^3.6.0:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexp.prototype.flags@^1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334"
+ integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==
+ dependencies:
+ call-bind "^1.0.6"
+ define-properties "^1.2.1"
+ es-errors "^1.3.0"
+ set-function-name "^2.0.1"
+
+regexpp@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
+ integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+ integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==
+
+repeat-element@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==
+
+resolve@^1.10.0, resolve@^1.18.1, resolve@^1.22.0, resolve@^1.22.4:
+ version "1.22.8"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+resolve@~1.19.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c"
+ integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==
+ dependencies:
+ is-core-module "^2.1.0"
+ path-parse "^1.0.6"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^3.0.0, rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+rsvp@^4.8.4:
+ version "4.8.5"
+ resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
+ integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+safe-array-concat@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb"
+ integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==
+ dependencies:
+ call-bind "^1.0.7"
+ get-intrinsic "^1.2.4"
+ has-symbols "^1.0.3"
+ isarray "^2.0.5"
+
+safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-regex-test@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377"
+ integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-regex "^1.1.4"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sane@^4.0.3:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded"
+ integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==
+ dependencies:
+ "@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"
+
+saxes@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d"
+ integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==
+ dependencies:
+ xmlchars "^2.2.0"
+
+"semver@2 || 3 || 4 || 5", semver@^5.5.0:
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.5.3:
+ version "7.6.3"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
+ integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
+
+semver@^6.3.0, semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
+
+set-function-length@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+
+set-function-name@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
+ integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.2"
+
+set-value@^2.0.0, set-value@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shellwords@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
+ integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
+
+side-channel@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2"
+ integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+ object-inspect "^1.13.1"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+sisteransi@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+ integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slice-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+ integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
+ dependencies:
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@^0.5.6:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.6:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+source-map@^0.7.3:
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656"
+ integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==
+
+spdx-correct@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c"
+ integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66"
+ integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.20"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89"
+ integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
+
+stack-utils@^2.0.2:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f"
+ integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==
+ dependencies:
+ escape-string-regexp "^2.0.0"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+string-length@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
+ integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==
+ dependencies:
+ char-regex "^1.0.2"
+ strip-ansi "^6.0.0"
+
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string.prototype.trim@^1.2.9:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4"
+ integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.0"
+ es-object-atoms "^1.0.0"
+
+string.prototype.trimend@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229"
+ integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+string.prototype.trimstart@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde"
+ integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+ integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+
+strip-bom@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
+ integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+ integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.0.0, supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-hyperlinks@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624"
+ integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==
+ dependencies:
+ has-flag "^4.0.0"
+ supports-color "^7.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+symbol-tree@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+ integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
+table@^6.0.9:
+ version "6.8.2"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58"
+ integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==
+ dependencies:
+ ajv "^8.0.1"
+ lodash.truncate "^4.4.2"
+ slice-ansi "^4.0.0"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+
+terminal-link@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994"
+ integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==
+ dependencies:
+ ansi-escapes "^4.2.1"
+ supports-hyperlinks "^2.0.0"
+
+test-exclude@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
+ integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
+ dependencies:
+ "@istanbuljs/schema" "^0.1.2"
+ glob "^7.1.4"
+ minimatch "^3.0.4"
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+throat@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b"
+ integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==
+
+tmpl@1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
+ integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+tough-cookie@^4.0.0:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36"
+ integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
+ dependencies:
+ psl "^1.1.33"
+ punycode "^2.1.1"
+ universalify "^0.2.0"
+ url-parse "^1.5.3"
+
+tr46@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240"
+ integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==
+ dependencies:
+ punycode "^2.1.1"
+
+ts-jest@^26.5.6:
+ version "26.5.6"
+ resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.5.6.tgz#c32e0746425274e1dfe333f43cd3c800e014ec35"
+ integrity sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==
+ dependencies:
+ bs-logger "0.x"
+ buffer-from "1.x"
+ fast-json-stable-stringify "2.x"
+ jest-util "^26.1.0"
+ json5 "2.x"
+ lodash "4.x"
+ make-error "1.x"
+ mkdirp "1.x"
+ semver "7.x"
+ yargs-parser "20.x"
+
+ts-node@^10.1.0:
+ version "10.9.2"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f"
+ integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==
+ dependencies:
+ "@cspotcode/source-map-support" "^0.8.0"
+ "@tsconfig/node10" "^1.0.7"
+ "@tsconfig/node12" "^1.0.7"
+ "@tsconfig/node14" "^1.0.0"
+ "@tsconfig/node16" "^1.0.2"
+ acorn "^8.4.1"
+ acorn-walk "^8.1.1"
+ arg "^4.1.0"
+ create-require "^1.1.0"
+ diff "^4.0.1"
+ make-error "^1.1.1"
+ v8-compile-cache-lib "^3.0.1"
+ yn "3.1.1"
+
+tsconfig-paths@^3.14.1, tsconfig-paths@^3.15.0:
+ version "3.15.0"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4"
+ integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==
+ dependencies:
+ "@types/json5" "^0.0.29"
+ json5 "^1.0.2"
+ minimist "^1.2.6"
+ strip-bom "^3.0.0"
+
+tslib@^1.8.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tsutils@^3.21.0:
+ version "3.21.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
+ integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
+ dependencies:
+ tslib "^1.8.1"
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-detect@4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
+ integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
+
+type-fest@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
+ integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+
+typed-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3"
+ integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ is-typed-array "^1.1.13"
+
+typed-array-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67"
+ integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==
+ dependencies:
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+
+typed-array-byte-offset@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063"
+ integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+
+typed-array-length@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3"
+ integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==
+ dependencies:
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+ possible-typed-array-names "^1.0.0"
+
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+typescript@^4.3.5:
+ version "4.9.5"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
+ integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
+
+unbox-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
+ integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+ dependencies:
+ call-bind "^1.0.2"
+ has-bigints "^1.0.2"
+ has-symbols "^1.0.3"
+ which-boxed-primitive "^1.0.2"
+
+undici-types@~5.26.4:
+ version "5.26.5"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
+ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
+undici-types@~6.19.2:
+ version "6.19.8"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
+ integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
+universalify@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"
+ integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+update-browserslist-db@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e"
+ integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==
+ dependencies:
+ escalade "^3.1.2"
+ picocolors "^1.0.1"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==
+
+url-parse@^1.5.3:
+ version "1.5.10"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
+ integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
+ dependencies:
+ querystringify "^2.1.1"
+ requires-port "^1.0.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+util-deprecate@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+uuid@^8.3.0:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
+v8-compile-cache-lib@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
+ integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
+
+v8-compile-cache@^2.0.3:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128"
+ integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==
+
+v8-to-istanbul@^7.0.0:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1"
+ integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.1"
+ convert-source-map "^1.6.0"
+ source-map "^0.7.3"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+w3c-hr-time@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
+ integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
+ dependencies:
+ browser-process-hrtime "^1.0.0"
+
+w3c-xmlserializer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a"
+ integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==
+ dependencies:
+ xml-name-validator "^3.0.0"
+
+walker@^1.0.7, walker@~1.0.5:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"
+ integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==
+ dependencies:
+ makeerror "1.0.12"
+
+webidl-conversions@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
+ integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
+
+webidl-conversions@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
+ integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
+
+whatwg-encoding@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
+ integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
+ dependencies:
+ iconv-lite "0.4.24"
+
+whatwg-mimetype@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
+ integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+
+whatwg-url@^8.0.0, whatwg-url@^8.5.0:
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77"
+ integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==
+ dependencies:
+ lodash "^4.7.0"
+ tr46 "^2.1.0"
+ webidl-conversions "^6.1.0"
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-module@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409"
+ integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
+
+which-typed-array@^1.1.14, which-typed-array@^1.1.15:
+ version "1.1.15"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d"
+ integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.2"
+
+which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+which@^2.0.1, which@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+word-wrap@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+
+wrap-ansi@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+ integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+write-file-atomic@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
+ integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
+ dependencies:
+ imurmurhash "^0.1.4"
+ is-typedarray "^1.0.0"
+ signal-exit "^3.0.2"
+ typedarray-to-buffer "^3.1.5"
+
+ws@^7.4.6:
+ version "7.5.10"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9"
+ integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==
+
+xml-name-validator@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+ integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
+
+xmlchars@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+ integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yargs-parser@20.x:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs-parser@^18.1.2:
+ version "18.1.3"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+ integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs@^15.4.1:
+ version "15.4.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
+ integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
+ dependencies:
+ cliui "^6.0.0"
+ decamelize "^1.2.0"
+ find-up "^4.1.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^4.2.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^18.1.2"
+
+yn@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+ integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==